为什么要用Netty开发

 我来答
百度网友ded4135
高粉答主

2018-02-14 · 醉心答题,欢迎关注
知道大有可为答主
回答量:2.7万
采纳率:87%
帮助的人:1.2亿
展开全部

Netty是由JBOSS提供的基于Java NIO的开源框架,Netty提供异步非阻塞、事件驱动、高性能、高可靠、高可定制性的网络应用程序和工具,可用于开发服务端和客户端。

JAVA原先是采用的是传统的BIO,为什么后来又研发出了NIO呢?

首先看看传统的基于同步阻塞IO(BIO)的线程模型图


BIO主要存在以下缺点:

1.从线程模型图中可以看到,一连接一线程,由于线程数是有限的,所以这样的模型是非常消耗资源的,

最终也导致它不能承受高并发连接的需求

2.性能低,因为频繁的进行上下文切换,导致CUP利用率低

3.可靠性差,由于所有的IO操作都是同步的,即使是业务线程也如此,所以业务线程的IO操作也有可能被阻塞,

这将导致系统过分依赖网络的实时情况和外部组件的处理能力,可靠性大大降低

上面的原因就是导致早期的高性能服务器为什么不选用JAVA开发,而是选用C/C++的重要原因。

为了解决上面的问题,NIO横空出世,下面是NIO的线程模型图


1.NIO采用了Reactor线程模型,一个Reactor聚合了一个多路复用器Selector,它可以同时注册、监听和轮询

成百上千个Channel,这样一个IO线程可以同时处理很多个客户端连接,线程模型优化为1:N(N<最大句柄、数),

或M:N(M通常为CUP核数+1)

2.避免了IO线程频繁的上下文切换,提升了CUP的效率

3.所有的IO操作都是异步的,所以业务线程的IO操作就不用担心阻塞,系统降低了对网络的实时情况和外部组件

的处理能力的依赖

为什么不直接用JDK原生的NIO而选用Netty框架?

先看看JDK的NIO中服务端和客户端的时序图

服务端:


客户端:


从图中我们可以看到,使用JDK原生NIO的不足之处

1.NIO的类库和API相当复杂,使用它来开发,需要非常熟练地掌握Selector、ByteBuffer、ServerSocketChannel、SocketChannel等

2.需要很多额外的编程技能来辅助使用NIO,例如,因为NIO涉及了Reactor线程模型,所以必须必须对多线程和网络编程非常熟悉才能写出高质量的NIO程序

3.想要有高可靠性,工作量和难度都非常的大,因为服务端需要面临客户端频繁的接入和断开、网络闪断、半包读写、失败缓存、网络阻塞的问题,这些将严重影响我们的可靠性,而使用原生NIO解决它们的难度相当大。

4.JDK NIO中著名的BUG--epoll空轮询,当select返回0时,会导致Selector空轮询而导致CUP100%,官方表示JDK1.6之后修复了这个问题,其实只是发生的概率降低了,没有根本上解决。

那么为什么要用Netty呢?

1.API使用简单,更容易上手,开发门槛低

2.功能强大,预置了多种编解码功能,支持多种主流协议

3.定制能力高,可以通过ChannelHandler对通信框架进行灵活地拓展

4.高性能,与目前多种NIO主流框架相比,Netty综合性能最高

5.高稳定性,解决了JDK NIO的BUG

6.经历了大规模的商业应用考验,质量和可靠性都有很好的验证。

Netty能提供什么服务?

1.开发异步非阻塞的TCP网络应用程序

2.开发异步非阻塞的UDP网络应用程序

3.开发异步文件传输程序

4.开发异步HTTP程序的服务端和客户端

5.提供多种编解码的集成框架,包括谷歌Protobuf、JBossMarshalling、Java序列化、压缩编解码、XML解码、

字符串编解码等都可以由用户直接使用

6.提供形式多样的编解码基础类库,可以方便地进行私有协议栈编解码框架的二次开发

7.基于职责链的Pipeline-Handler机制,可以方便地对网络事件进行拦截和定制

8.所有的IO操作都是异步的,用户可以通过Future-Listeren机制主动get结果或者等IO线程完成操作之后主动Notify来通知,

用户业务线程不需要同步等待

9.基于链路空闲事件监测的心跳机制

10.流量控制和整形

......

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式