Netty底层主要组件之间的联系

前前后后利用工作之余的闲暇时间阅读Netty源码有一个月了,现在Netty各组件之间的联系,已经有了一个初步的认识。但文章还停留在笔记的整理阶段,只能当成个人笔记看。此文为Netty系列的第一篇,主要描述一个客户端请求在Netty中流转的整个生命周期,它经过了哪些组件之间相互配合。后面的文章会对每一个组件进行源码分析,以及此文没有体现出来的组件它们的作用。如ChannelFutureByteBuf等。在阅读之前,推荐先阅读下之前的一篇文章(浅谈NIO中的Reactor设计模式应用)。

1. 回顾Ractor模型的Multiple Reactors Version

Ractor模型的Multiple Reactors Version浅谈NIO中的Reactor设计模式应用中的3.3,DougLea在Scalable IO in Java画的模型图如下所示:

mainReactoracceptor只负责接收客户端的连接事件,subReactor只负责网络读写I/O事件,其实subReactor可以有多个,这样减轻每个subReactor负载。对于耗时compute业务代码,可以交给线程池处理,处理后注册写事件返回给客户端。acceptorsubReactor都轮询自己的selector.select(),处理着自己"感兴趣"的事件。其实Netty底层模型应用便是这种,只不过各组件的名字和作用都有些差异。

/**
 * 举个例子:现在我想一个accptor和多个subReactor。
 **/
// 一个Acceptor
EventLoopGroup parentEventLoopGroup = new NioEventLoopGroup(1);
// 当前CPU核数*2的subReactor个数,对于现在超线程CPU那就再*n
EventLoopGroup childEventLoopGroup = new NioEventLoopGroup();
复制代码

2. Netty中的各组件联系

2.1 请求在各组件间的流转图

2.2 图中Netty的各组件的作用

对于selector、channel等组件的作用可以在浅谈NIO中的Reactor设计模式应用,本文只介绍Netty相关的组件用途,以下内容根据图自顶向下

  1. NioEventLoopGroup:直译这个类名就是nio的事件轮询组,其实轮询的就是Selector.select()。文档中的解释是"it is used for NIO Selector based Channel."。对于接收客户端的连接事件与selectionKey绑定的是ServerSocketChannel;对于读写网络I/O事件与selectionKey绑定的便是SocketChannel。
  2. NioEventLoop:通过名称就可以看出来,它便是事件轮询组中的一个轮询,也就是一个subReactor或者acceptor(通常做法在创建接收连接的轮询组时都是创建一个)。
  3. ChannelPipeline:文档中的解释是"it handles or intercepts inbound events and outbound operations of a implements an advanced form of the Intercepting Filter pattern",翻译过来就是它处理或者是拦截入栈事件和出栈的一些操作,实现了一种更加高级的拦截过滤器模式。过滤器模式是入出走同一个过滤器,而对于ChannelPipeline入栈处理和出栈处理分离开了,ChannelPipeline 底层维护着一个ChannelHandlerContext双向链表。ChannelPipeline的处理流程如下:
    Channel里读出来的数据,需要经过与Channel绑定的ChannelPipeline中的InboundHandler处理,再注册写事件。写出的时候需要经ChannelPipeline中的OutboundHandler处理在写回给客户端。
  4. ChannelHandlerContextChannelPipeline中是ChannelHandlerContext双向链表,它起到一个承上启下的作用,意思是能够向上获取到ChannelPipelineChannel,又能向下获取到ChannelHandler
  5. ChannelInboundHandlerAdapter/ChannelOutboundHandlerAdapter:入栈出栈的处理器对象,它应用适配器设计模式,后续文章中我们在从细节分析。
  6. ServerBootStrapAcceptorNettyacceptor对象,用于将EventLoopSelector接收到的Channel(这里面其实与selectionKey绑定的是serverChannel然后再通过serverChannel.accept()得到的),将Channel注册给ChildEventLoop(这块Netty是通过round-robin去获取EventLoop)中个其中一个Selector上。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值