Netty浅析
1.1 原理
1.Netty核心类
Bootstrap: 负责客户端的配置与启动
ServerBootstrap: 负责服务端的配置与启动
ChannelHandler:过滤器模式对netty中入站和出站数据进行处理,入站依照ChannelHandler在ChannelPipeline中的添加顺序对数据进行依次处理,出站逆序。入站处理类实现接口ChannelInBoundHandler,出栈处理类实现接口ChannelOutBoundHandler。
1.2 Reactor模式
1:单线程模式
对于一些小容量应用场景,可以使用到单线程模型。但对于高负载,大并发的应用却不合适,主要原因如下:
当一个NIO线程同时处理成百上千的链路,性能上无法支撑,即使NIO线程的CPU负荷达到100%,也无法完全处理消息
当NIO线程负载过重后,处理速度会变慢,会导致大量客户端连接超时,超时之后往往会重发,更加重了NIO线程的负载。
可靠性低,一个线程意外死循环,会导致整个通信系统不可用
为了解决这些问题,出现了Reactor多线程模型。
2.多线程模式:
相比上一种模式,该模型在处理链部分采用了多线程(线程池)。
在绝大多数场景下,该模型都能满足性能需求。但是,在一些特殊的应用场景下,如服务器会对客户端的握手消息进行安全认证。这类场景下,单独的一个Acceptor线程可能会存在性能不足的问题。为了解决这些问题,产生了第三种Reactor线程模型
3.主从模式
该模型相比第二种模型,是将Reactor分成两部分,mainReactor负责监听server socket,accept新连接;并将建立的socket分派给subReactor。subReactor负责多路分离已连接的socket,读写网络数据,对业务处理功能,其扔给worker线程池完成。通常,subReactor个数上可与CPU个数等同。
1.3 Netty组成
Netty中Reactor模式的参与者主要有下面一些组件:
1:Selector
2:EventLoopGroup/EventLoop
3:ChannelPipeline
Selector即为NIO中提供的SelectableChannel多路复用器,充当着demultiplexer的角色,这里不再赘述;下面对另外两种功能和其在Netty之Reactor模式中扮演的角色进行介绍。