image.png

Netty的逻辑处理架构为典型的网络分层架构设计,分别为网络通信层、事件高度层、服务编排层

一,网络通信层
网络通信层的职责是执行网络IO的操作,当网络数据读取到内核缓冲区后,会触发各种网络事件,这些网络事件会分发给事件调度层进行处理。网络通信层的核心组件包含BootStrap、ServerBootStrap、Channel三个组件。
BootStrap主要负责整个Netty程序的启动、初始化、服务器连接等过程,它相当地一条主线,串联了Netty的其他核心组件。
Channel是网络通信的载体,它提供了基本的API用于网络IO操作,如register、bind、connet、read、write、flush等。Channel是基于jdk nio channel实现的,它进行了更高层次的抽象,同时屏蔽了底层socket的复杂性。Channel有多种状态,如连接建立、连接注册、数据读写、连接销毁等,随着状态的变化,Channel处于不同的生命周期,每一种状态都会绑定相应的事件回调。

事件说明
channelRegisterChannel创建后被注册到EventLoop上
channelUnregisterChannel创建后未注册或从EventLoop取消注册
channelActiveChannel处于就绪状态,可以被读写
channelInactiveChannel处于非就绪状态
channelReadChannel可以从远端读取到数据
cahnnelReadCompleteChannel读取数据完成

Channel是网络通信的载体,提供了与底层Socket交互的能力,那Channel生命周期内的事件都是如何被处理的呢?这就是Netty事件调度层的工作了。
二,事件调度层
事件调度层的职责是通过Reactor线程模型对各类事件进行聚合处理,通过Selector主循环线程集成多种事件,如IO事件、信号事件、定时事件等,实际的业务处理逻辑是交由服务编排层中相关的Handler完成。
事件调度层核心组件包括EventLoopGroup、EventLoop
EventLoopGroup本质是一个线程池,主要负责接收IO请求,并分配线程执行处理请求。EventLoopGroup、EventLoop、Channel的关系:

  1. 一个EventLoopGroup往往包含一个或者多个EventLoop。EventLoop用于处理Channel生命周期内所有IO事件,如accept、connect、read、write等IO事件。
  2. EventLoop同一时间会与一个线程绑定,每个EventLoop负责处理多个channel
  3. .每新建一个Channel,EventLoopGroup会选择一个EventLoop与其绑定。该Channel在生命周期内都可以对EventLoop进行多次绑定和解绑。

EventLoopGroup和Reactor线程模型的关系是:EventLoopGroup是Netty Reactor线程模型的具体实现方式,Netty通过创建不同的EventLoopGroup参数配置,就可以支持Reactor的三种线程模型:

  1. 单线程模型:EventLoopGroup只包含一个EventLoop,Boss和Worker使用同一个EventLoopGroup
  2. 多线程模型:EventLoopGroup包含多个EventLoop,Boss和Worker使用同一个EventLoopGroup
  3. 主从多线程模型:EventLoopGroup包含多个EventLoop,Boss是主Reactor,Worker是从Reactor,它们分别使用不同的EventLoopGroup,主Reactor负责新的网络连接Channel创建,然后将Channel注册到从Reactor

三,服务编排层
服务编排层的职责是组装各类服务,它是Netty的核心处理链,用以实现网络事件的动态编排和有序传播。服务编排层的核心组件包括ChannelPipeline、ChannelHandler、ChannelHanlerContext。下面分别进行介绍。

  1. ChannelPipleline
    它是Netty的核心编排组件,负责组装各种ChannelHandler,数据的编解码以及加工处理操作都是由ChannelHandler完成的。ChannelPipleline可以理解为ChannelHandler的实例列表---内部通过双向链表将不同的ChannelHandler链接在一起,当IO读写事件触发时,ChannelPipleline会依次调用ChannelHandler列表对Channel的数据进行拦截和处理。
    ChannelPipleline中包含入站ChannelInboudHandler和出站ChannelOutboudHandler两种处理器,客户端和服务端都有各自的ChannelPipleline。站在客户端角度,数据从客户端发向服务端,该过程为出站;数据从服务端发向客户端则为入站。如果站在服务端角度看,数据从客户端发向服务为入站;从服务端发向客户端则为出站。可以参考netty入站与出站
  2. ChannelHandler & ChannelHandlerContext
    ChannelHandlerContext用于保存ChannelHandler上下文,通过ChannelHandlerContext可以实现ChannelHandler之间的交互,ChannelHandlerContext包含了ChannelHandler生命周期的所有事件,如connect、bind、read、flush、write、close等。另外每个ChannelHandler一些通用的逻辑是在ChannelHandlerContext中实现的,抽象出来之后可以避免重复代码。

最后总结下:
image.png

  • 服务端启动初始化时有Boss EventLoopGroup和Worker EventLoopGroup两个组件,boss负责监听网络连接事件,当有新的网络连接事件到达时,则将Channel注册到Worker EventLoopGroup。
  • Worker EventLoopGroup会被分配一个EventLoop负责处理该Channel的读写事件,每个EventLoop都是单线程的,通过Selector进行事件循环。
  • 当客户端发起IO起读写事件时,服务端EventLoop会进行数据的读取,然后通过Pipleline触发各种监听器进行数据的加工处理。
  • 客户端数据会被传递到ChannelPipleline的第一个ChannelInbondHandler中,数据处理完成后,将加工完的数据传递给下一下ChannelInboudHandler。
  • 当数据写回客户端时,会将处理结果在ChannelPipleline的ChannelOutboundHandler中传播,最后到达客户端。

参考:netty出入站


步履不停
38 声望13 粉丝

好走的都是下坡路


« 上一篇
Netty学习一
下一篇 »
Netty学习三