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