为了了解Netty的工作原理,对Netty的内部设计有一个总体了解是很有用的。几个核心概念:
Bootstrap
EventLoopGroup
EventLoop
SocketChannel
ChannelInitializer
ChannelPipeline
ChannelHandler
这些概念如何相互关联如下所示:
Bootstrap
Netty中的Bootstrap类负责引导,引导过程包括启动线程,打开套接字等。
EventLoopGroup
Netty EventLoopGroup是EventLoop的分组,多个EventLoop可以组合在一起,这样,EventLoop可以共享一些资源。
EventLoop
Netty EventLoop是一个事件循环,例如网络套接字(来自SocketChannel)传入数据。当发生事件时,该事件将传递到适当的事件处理程序,例如ChannelHandler。
SocketChannel
Netty SocketChannel表示通过网络与另一台计算机的TCP连接。无论你是将Netty用作客户端还是服务器,与网络上其它计算机交换的所有数据都将通过SocketChannel实例传递,该实例表示计算机之间的TCP连接。 SocektChannel由EventLoop管理,并且始终仅由相同的EventLoop管理。由于EventLoop始终由同一线程执行,因此SocketChannel实例也只能由同一线程访问。因此,从SocketChannel读取数据时,不必担心同步问题。
ChannelInitializer
Netty ChannelInitializer是一个特殊的ChannelHandler,在创建SocketChannel时,它将附加到SocketChannel的ChannelPipeline。然后调用ChannelInitializer,以便它可以初始化SocketChannel。 初始化SocketChannel后,ChannelInitializer会将其自身从ChannelPipeline中删除。
ChannelPipeline
每个Netty SocketChannel都有一个ChannelPipeline。 ChannelPipeline包含ChannelHandler实例的列表。当EventLoop从SocketChannel读取数据时,数据将传递到ChannelPipeline中的第一个ChannelHandler。第一个ChannelHandler处理数据,可以选择将其转发到ChannelPipeline中的下一个ChannelHandler,然后,该处理程序也可以选择将其转发至ChannelPipeline中的下一个ChannelHandler等。 当将数据写到SocketChannel时,在最终写入SocketChannel之前,写入的数据还将通过ChannelPipeline传递。
ChannelHandler
Netty ChannelHandler处理从Netty SocketChannel接收的数据。 ChannelHandler还可以处理正在写到SocketChannel的数据。