Netty的逻辑处理架构为典型的网络分层架构设计,分别为网络通信层、事件高度层、服务编排层
一,网络通信层
网络通信层的职责是执行网络IO的操作,当网络数据读取到内核缓冲区后,会触发各种网络事件,这些网络事件会分发给事件调度层进行处理。网络通信层的核心组件包含BootStrap、ServerBootStrap、Channel三个组件。
BootStrap主要负责整个Netty程序的启动、初始化、服务器连接等过程,它相当地一条主线,串联了Netty的其他核心组件。
Channel是网络通信的载体,它提供了基本的API用于网络IO操作,如register、bind、connet、read、write、flush等。Channel是基于jdk nio channel实现的,它进行了更高层次的抽象,同时屏蔽了底层socket的复杂性。Channel有多种状态,如连接建立、连接注册、数据读写、连接销毁等,随着状态的变化,Channel处于不同的生命周期,每一种状态都会绑定相应的事件回调。
事件 | 说明 |
---|---|
channelRegister | Channel创建后被注册到EventLoop上 |
channelUnregister | Channel创建后未注册或从EventLoop取消注册 |
channelActive | Channel处于就绪状态,可以被读写 |
channelInactive | Channel处于非就绪状态 |
channelRead | Channel可以从远端读取到数据 |
cahnnelReadComplete | Channel读取数据完成 |
Channel是网络通信的载体,提供了与底层Socket交互的能力,那Channel生命周期内的事件都是如何被处理的呢?这就是Netty事件调度层的工作了。
二,事件调度层
事件调度层的职责是通过Reactor线程模型对各类事件进行聚合处理,通过Selector主循环线程集成多种事件,如IO事件、信号事件、定时事件等,实际的业务处理逻辑是交由服务编排层中相关的Handler完成。
事件调度层核心组件包括EventLoopGroup、EventLoop
EventLoopGroup本质是一个线程池,主要负责接收IO请求,并分配线程执行处理请求。EventLoopGroup、EventLoop、Channel的关系:
- 一个EventLoopGroup往往包含一个或者多个EventLoop。EventLoop用于处理Channel生命周期内所有IO事件,如accept、connect、read、write等IO事件。
- EventLoop同一时间会与一个线程绑定,每个EventLoop负责处理多个channel
- .每新建一个Channel,EventLoopGroup会选择一个EventLoop与其绑定。该Channel在生命周期内都可以对EventLoop进行多次绑定和解绑。
EventLoopGroup和Reactor线程模型的关系是:EventLoopGroup是Netty Reactor线程模型的具体实现方式,Netty通过创建不同的EventLoopGroup参数配置,就可以支持Reactor的三种线程模型:
- 单线程模型:EventLoopGroup只包含一个EventLoop,Boss和Worker使用同一个EventLoopGroup
- 多线程模型:EventLoopGroup包含多个EventLoop,Boss和Worker使用同一个EventLoopGroup
- 主从多线程模型:EventLoopGroup包含多个EventLoop,Boss是主Reactor,Worker是从Reactor,它们分别使用不同的EventLoopGroup,主Reactor负责新的网络连接Channel创建,然后将Channel注册到从Reactor
三,服务编排层
服务编排层的职责是组装各类服务,它是Netty的核心处理链,用以实现网络事件的动态编排和有序传播。服务编排层的核心组件包括ChannelPipeline、ChannelHandler、ChannelHanlerContext。下面分别进行介绍。
- ChannelPipleline
它是Netty的核心编排组件,负责组装各种ChannelHandler,数据的编解码以及加工处理操作都是由ChannelHandler完成的。ChannelPipleline可以理解为ChannelHandler的实例列表---内部通过双向链表将不同的ChannelHandler链接在一起,当IO读写事件触发时,ChannelPipleline会依次调用ChannelHandler列表对Channel的数据进行拦截和处理。
ChannelPipleline中包含入站ChannelInboudHandler和出站ChannelOutboudHandler两种处理器,客户端和服务端都有各自的ChannelPipleline。站在客户端角度,数据从客户端发向服务端,该过程为出站;数据从服务端发向客户端则为入站。如果站在服务端角度看,数据从客户端发向服务为入站;从服务端发向客户端则为出站。可以参考netty入站与出站 - ChannelHandler & ChannelHandlerContext
ChannelHandlerContext用于保存ChannelHandler上下文,通过ChannelHandlerContext可以实现ChannelHandler之间的交互,ChannelHandlerContext包含了ChannelHandler生命周期的所有事件,如connect、bind、read、flush、write、close等。另外每个ChannelHandler一些通用的逻辑是在ChannelHandlerContext中实现的,抽象出来之后可以避免重复代码。
最后总结下:
- 服务端启动初始化时有Boss EventLoopGroup和Worker EventLoopGroup两个组件,boss负责监听网络连接事件,当有新的网络连接事件到达时,则将Channel注册到Worker EventLoopGroup。
- Worker EventLoopGroup会被分配一个EventLoop负责处理该Channel的读写事件,每个EventLoop都是单线程的,通过Selector进行事件循环。
- 当客户端发起IO起读写事件时,服务端EventLoop会进行数据的读取,然后通过Pipleline触发各种监听器进行数据的加工处理。
- 客户端数据会被传递到ChannelPipleline的第一个ChannelInbondHandler中,数据处理完成后,将加工完的数据传递给下一下ChannelInboudHandler。
- 当数据写回客户端时,会将处理结果在ChannelPipleline的ChannelOutboundHandler中传播,最后到达客户端。
参考:netty出入站
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。