Netty4
是
NIO
的,其网络通信模型采用的是 Reactor,属于同步
非阻塞
IO
的网络通信模型。
Netty5
是
AIO
的,其网络通信模型采用的是 Proactor,属于异步
非阻塞
IO
的网络通信模型。
本次分析的是NIO
图是开课吧的
parentGroup处理连接连接,childGroup处理读写事件,每个Group中存在多个EventLoop,一个EventLoop绑定一个Selector和多个channel,一个EventLoop内部绑定一个线程来进行select监测就绪事件
服务端代码如下
EventLoopGroup parentGroup = new NioEventLoopGroup();
EventLoopGroup childGroup = new NioEventLoopGroup();
try {
ServerBootstrap bootstrap = new ServerBootstrap();
bootstrap.group(parentGroup, childGroup)
// 用于指定当Server的连接请求处理线程全被占用时,
// 临时存放已经完成了三次握手的请求的队列的长度。
// 默认是50
.option(ChannelOption.SO_BACKLOG, 1024)
// 指定使用心跳机制来保证TCP长连接的存活性
.childOption(ChannelOption.SO_KEEPALIVE, true)
.channel(NioServerSocketChannel.class)
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel ch) throws Exception {
ChannelPipeline pipeline = ch.pipeline();
pipeline.addLast(new ObjectEncoder());
pipeline.addLast(new ObjectDecoder(Integer.MAX_VALUE,
ClassResolvers.cacheDisabled(null)));
pipeline.addLast(new RpcServerHandler(registerMap));
}
});
ChannelFuture future = bootstrap.bind(8888).sync();
System.out.println("服务端已启动,监听的端口为:8888");
future.channel().closeFuture().sync();
} finally {
parentGroup.shutdownGracefully();
childGroup.shutdownGracefully();
}
Channel
socket的封装
EventLoop
接口,本文实现为NioEventLoop,其他还有 EpollEventLoop等,为每个Channel分配一个EventLoop,处理所有请求事件,一个Channel绑定一个EventLoop,一个EventLoop可以绑定多个Channel,内部绑定一个多路复用器Selector和一个线程,线程用来死循环进行select和执行任务队列中的任务
NioEventLoopGroup
EventLoopGroup是个接口,实现类除了NioEventLoopGroup还有 EpollEventLoopGroup等,是一个EventLoop的池,真正处理都是根据算法选择一个EventLoop进行操作
ServerBootStrap
配置server端代码,关联各个组件,启动入口
ChannelHandler、ChannelPipeline
处理器处理消息,各个处理器依次被添加到Pipeline的处理器列表,按添加的顺序对消息进行处理