Netty 核心组件

Netty工作架构图

模块组件

Bootstrap

Bootstrap是启动引导类,一个 Netty 应用通常由一个 Bootstrap 开始,主要作用是配置整个 Netty 程序,串联各个组件

  • Bootstrap 类是客户端程序的启动引导类
  • ServerBootstrap 类是服务端启动引导类

Channel

Channel的本质是对操作系统产生的FD(文件描述符)的映射,并且提供绑定到Selector多路选择器上的能力

ChannelFuture

Netty 中所有的IO操作都是异步的,不能立刻得知消息是否被正确处理。 Future 对象可以看作是一个异步操作结果的占位符;它将在未来的某个时刻完成,并提供对其结果的访问。

Netty 提供了ChannelFuture,用于在执行异步操作的时候使用。每个Netty的出站IO操作都会返回一个ChannelFutureChannelFuture可以注册ChannelFutureListener 实例,其中的回调方法operationComplete(),将会在对应的操作完成时被调用

1
ChannelFuture write(Object msg, ChannelPromise promise);

ChannelHandler

ChannelHandler 是一个接口,它充当了所有处理入站和出站数据的应用程序逻辑的容器,并将其转发到其 ChannelPipeline中的下一个ChannelHandler;该类是基于事件驱动的,它会响应相关的事件然后去调用其关联的回调函数,例如:当一个新的连接被建立时,ChannelHandlerchannelActive()方法将会被调用

ChannelHandler子类,例如:

  • ChannelInboundHandler:用于处理入站IO事件。
  • ChannelOutboundHandler:用于处理出站IO操作。

ChannelPipline

ChannelPipeline 是聚合了 ChannelHandler 的管道,本质上是一个职责链路(用于处理Channel的入站事件和出站操作),在Worker线程中会对每一个Channel执行其所对应的pipeline链,完成整个生命周期。

蓝色表示 ChannelInboundHandler ,绿色表示 ChannelOutboundHandler,黄色则承担两个角色,而每个Handler又会使用 ChannelHandlerContext 封装起来,在 ChannelPipeline 中组装成双向链表。

ChannelPipeline handler 执行顺序

  • 入站事件流从头到尾执行所有的handler(入站的时候也会经过OutboundChannelHandler,只不过略过了这个ChannelHandler)
  • 出站事件流从尾到头执行所有的handler(出站的时候也会经过InboundChannelHandler,只不过略过了这个ChannelHandler)

注意: 在具体业务处理类ProcessingHandler中将响应数据发出有2种方式

  1. ChannelHandlerContext.writeAndFlush(msg):不用经过TailConext, 从该handler开始往前执行OutboundChannelHandler,性能更好一些
  2. ChannelHandlerContext.pipeline().writeAndFlush(msg):从TailConext开始执行, 往前执行OutboundChannelHandler
1
2
3
4
5
6
7
8
private AbstractChannelHandlerContext findContextOutbound() {
AbstractChannelHandlerContext ctx = this;
do {
// 注意,这里是往前找
ctx = ctx.prev;
} while (!ctx.outbound);
return ctx;
}

EventLoop

EventLoop 是事件循环,对应Reactor线程,以 NioEventLoop 为例,实现原理是:维护了一个线程和任务队列,支持异步提交任务,线程启动时会调用NioEventLooprun 方法,执行IO任务和非IO任务,由于 EventLoop 是单线程,因此在使用时要注意耗时操作,阻塞操作都不要放到 EventLoop 中,其适合处理耗时短并且简单的任务

  • IO任务:即 selectionKey 中事件,如 acceptconnectreadwrite等,由processSelectedKeys方法触发。
  • 非IO任务:添加到 taskQueue 中的任务,如延迟任务,由 runAllTasks 方法触发。

两种任务的执行时间比由变量 ioRatio 控制,默认为50%,则表示允许非IO任务执行的时间与IO任务的执行时间相等

EventLoopGroup

EventLoopGroup包含一个或者多个EventLoop,主要管理EventLoop的生命周期,可以理解为一个线程池,内部维护了一组线程,每个线程(EventLoop)可以负责处理多个Channel上的事件,而一个Channel只能注册于一个EventLoop(防止线程并发问题)

参考

最透彻的Netty原理架构解析

Netty–Reactor模型的应用

热评文章