Netty介绍为什么使用Netty

2022-07-29 08:48:43

Netty的简单介绍

Netty 是一个 NIO client-server(客户端服务器)框架,使用 Netty 可以快速开发网络应用,例如服务器和客户 端协议。 Netty 提供了一种新的方式来使开发网络应用程序,这种新的方式使得它很容易使用和有很强的扩展性。 Netty 的内部实现时很复杂的,但是 Netty 提供了简单易用的 api 从网络处理代码中解耦业务逻辑。 Netty 是完全基 于 NIO 实现的,所以整个 Netty 都是异步的。
简单点说就是Netty提供了一个简单,间接的方法来操作网络之间的通讯。

不选择JAVA原生NIO和IO的原因

基于IO的经典同步堵塞模型:

经典的IO模型也就是传统的服务器端同步阻塞I/O处理(也就是BIO,Blocking I/O)的经典编程模型,当我们每得到一个新的连接时,就会开启一个线程来处理这个连接的任务。之所以使用多线程,主要原因在于socket.accept()、socket.read()、socket.write()三个主要函数都是同步阻塞的,当一个连接在处理I/O的时候,系统是阻塞的,如果是单线程的话必然就挂死在那里;但CPU是被释放出来的,开启多线程,就可以让CPU去处理更多的事情。

因此这个模型最本质的问题在于,严重依赖于线程。但线程是很”贵”的资源,主要表现在:

  1. 线程的创建和销毁成本很高,在Linux这样的操作系统中,线程本质上就是一个进程。创建和销毁都是重量级的系统函数。
    线程本身占用较大内存,像Java的线程栈,一般至少分配512K~1M的空间,如果系统中的线程数过千,恐怕整个JVM的内存都会被吃掉一半。

  2. 线程的切换成本是很高的。操作系统发生线程切换的时候,需要保留线程的上下文,然后执行系统调用。如果线程数过高,可能执行线程切换的时间甚至会大于线程执行的时间,这时候带来的表现往往是系统load偏高、CPU sy使用率特别高(超过20%以上),导致系统几乎陷入不可用的状态。

  3. 容易造成锯齿状的系统负载。因为系统负载是用活动线程数或CPU核心数,一旦线程数量高但外部网络环境不是很稳定,就很容易造成大量请求的结果同时返回,激活大量阻塞线程从而使系统负载压力过大。

参考:[Java NIO浅析]http://mp.weixin.qq.com/s/HhwaXd8x7zONr8N1ojSnsQ

基于NIO的异步模型:

NIO是一种同步非阻塞的I/O模型,也是I/O多路复用的基础,而且已经被越来越多地应用到大型应用服务器,成为解决高并发与大量连接、I/O处理问题的有效方式。[Java NIO介绍(二)————无堵塞io和Selector简单介绍]

不使用NIO的原因:

  1. NIO的类库和API繁杂。需要很多额外的技能做铺垫。例如需要很熟悉Java多线程编程、Selector线程模型。导致工作量和开发难度都非常大。
  2. 扩展 ByteBuffer:NIO和Netty都有ByteBuffer来操作数据,但是NIO的ByteBuffer长度固定而且操作复杂,许多操作甚至都需要自己实现。而且它的构造函数是私有,不能扩展。Netty 提供了自己的
    ByteBuffer 实现, Netty 通过一些简单的 APIs 对 ByteBuffer 进行构造、使用和操作,以此来解决 NIO 中的一些限制。
  3. NIO 对缓冲区的聚合和分散操作可能会操作内存泄露,到jdk7才解决了内存泄露的问题
  4. 存在臭名昭著的epoll bug,导致Selector空轮询:这个bug会导致linux上导致cpu 100%:http://www.blogjava.net/killme2008/archive/2009/09/28/296826.html

为什么选择Netty

  • API使用简单,开发门槛低。
  • 功能强大,预置了多种编解码功能,支持多种协议开发。
  • 定制能力强,可以通过ChannelHadler进行扩展。
  • 性能高,对比其它NIO框架,Netty综合性能最优。
  • 经历了大规模的应用验证。在互联网、大数据、网络游戏、企业应用、电信软件得到成功,很多著名的框架通信底层就用了Netty,比如Dubbo
  • 稳定,修复了NIO出现的所有Bug。
  • 切换IO和NIO,因为IO和NIO的API完全不同,相互切换非常困难。

类似的框架对比:

与Mina相比有什么优势?

1、都是Trustin Lee的作品,Netty更晚;

2、Mina将内核和一些特性的联系过于紧密,使得用户在不需要这些特性的时候无法脱离,相比下性能会有所下降,Netty解决了这个设计问题;

3、Netty的文档更清晰,很多Mina的特性在Netty里都有;

4、Netty更新周期更短,新版本的发布比较快;

5、它们的架构差别不大,Mina靠apache生存,而Netty靠jboss,和jboss的结合度非常高,Netty有对google protocal buf的支持,有更完整的ioc容器支持(spring,guice,jbossmc和osgi);

6、Netty比Mina使用起来更简单,Netty里你可以自定义的处理upstream events 或/和 downstream events,可以使用decoder和encoder来解码和编码发送内容;

7、Netty和Mina在处理UDP时有一些不同,Netty将UDP无连接的特性暴露出来;而Mina对UDP进行了高级层次的抽象,可以把UDP当成”面向连接”的协议,而要Netty做到这一点比较困难。

参考资料链接:
[通俗地讲,Netty 能做什么?]https://www.zhihu.com/question/24322387/answer/78947405
[Java NIO浅析]http://mp.weixin.qq.com/s/HhwaXd8x7zONr8N1ojSnsQ
[Netty in action]

githubhttps://github.com/lkj41110/netty_dome

  • 作者:lkj41110
  • 原文链接:https://blog.csdn.net/qq_25673113/article/details/54631883
    更新时间:2022-07-29 08:48:43