为什么那么多开源软件都用netty来做网络通信编程框架?

 

1、用netty来做网络通信编程框架而不是我们自己去基于JDK NIO来编程的好处有如下这些:

(1)、netty支持常见的应用层协议(如:HTTP、FTP、DNS等),还可以支持自定义协议;

(2)、netty可以自动解决网络编程当中的粘包与半包问题;

(3)、netty还可以支持流量整形;

(4)、netty对于网络通信当中的异常情况,如断连、idle等情况都预做好了处理;

(5)、netty还解决JDK NIO的一些bugs(如空轮询问题,具体可以见JDK Bugs列表);

(6)、netty在API使用的友好度上更好;

(7)、netty还在很多细节上做了不少的代码级优化措施。

 

2、netty是如何支持协议定制的?

  netty通过层次化以及对自定义编解码可插拔式的设计,我们可以自己编写一堆handler链放进去就可以自己完成自定义的编解码。

3、为什么网络编程当中需要解决粘包与半包的问题?

  在计算机网络当中,我们传输数据的最小单元为一个MTU:

  (1)、写入的字节大小大于套接字的发送缓存区大小。
  (2)、进行MSS大小的TCP分段
  (3)、以太网帧的payload大于MTU进行IP分段,如下:

 

4、netty是如何实现流量整形的?

    具体是通过TrafficShapingHandler来实现,具体做法为采用一些限流措施,来防止流量瞬间过大,引发压垮下游系统的风险。

5、JDK的空轮询的BUG是怎么回事?

    即使无客户端连接,NIO照样不断的从select本应该阻塞的Selector.select()中wake up出来,导致CPU100%问题,后续版本的JDK一定程序缓解了该BUG,但问题一直存在(而且JDK官方给出的issues的回复是:Won't fix)。

6、Netty的编程API友好在哪?

  创建一个简单的HTTP server也许只要极少的代码,另外要自定义协议也是十分简单。

7、Netty存在一些代码细节上的编码优化使得性能更好

  如采用AdaptiveRecvByteBufAllocator来进行自适应的内存分配,还有对堆外内存的管理处理上也很高效,代码中还有针台各种平台及系统版本所做的一些细节优化等等等。

 

posted @ 2024-09-13 16:38  喝点江小白的随笔  阅读(52)  评论(0)    收藏  举报