目录
BootStrap、ServerBootStrap及其实现类:
1.线程模型:
Netty主要基于主从Reactors多线程模型做了一定的改进,其中主从Reactor多线程模型各有多个Reactor。
一共有3种事件,连接、读、写。BossGroup处理连接事件,WorkerGroup处理读、写事件
Netty线程模型的简单原理图:
一个BOSS GROUP里面有多个主Reactor,而Worker Group中有多个从Reactor。一个NIOEventLoop就等于一个Reactor,表示用一个线程(对应一个线程,一个ServerSockerChannel, 一个Selector)去处理客户端连接事件,用Selector,监听绑定在其上的socker网络连接。BOSS GROUP中的Reactor负责处理客户端连接,WorkGroup中的Reactor主要负责处理READ事件。
放个清晰点儿的图:
Netty线程模型的详细原理图:
1.在WorkGroup中的某个Reactor(NioEventLoop,是下图中NioEventLoopGroup中的一个) 通过selector获取到发生事件的SocketChannel后,需要通过调用handler进行处理,Netty中对于handler的处理是用了pipeline,一个pipeline里面包括了多个handler, 这里应该是用了职责链模式,对SocketChannel进行处理。
2.一个channel(我理解为SockerChannel)对应一个pipeline,一个NioEventLoop,以及这个pipeline里面的handler职责链。
3.Netty中的connect, read, bind等操作都是异步非阻塞操作。
2.Netty的异步模型:
ChannelFuture的实现类:
工作原理示意图:
Pipeline中的handler职责链调用???
下面的描述中,转换出入站数据是指数据在入站和出站的时候的编解码
在Handler处理中,可以使用callback(Listener???)或者Future实现异步
Future-Listener机制:
可以给Future注册监听器,相当于回调函数callback,等Future调用完成后,可以调用这个callback
下图是Future提供的API
代码示例:
其实客户端和服务端的bootstrap在启动的时候,都是用到了异步机制。看下面服务端的例子:
bootstrap.bind(6668).sync()是异步操作,返回ChannelFuture , 然后给ChannelFuture添加一个Listener(回调函数),
3.核心类:
BootStrap、ServerBootStrap及其实现类:
看看服务端是怎样使用ServerBootStrap的:
Note: 注意handler()与childHandler的区别,一个对应bossGroup,一个对应workerGroup
参考文章:
NIO多路复用底层原理(Select、Poll、EPoll)_LuckyWangxs的博客-CSDN博客_nio模型 select