Netty服务端创建

Netty服务端创建教程

前面我们详细讲解了 NIO 的相关知识,Netty 为了向用户屏蔽 NIO 通信的底层细节,在和用户交互的边界做了封装,目的是让用户快速上手,降低开发难度。

Netty服务端创建

netty 的服务端的创建从 ServerBootstrap 开始,一步一步的调用最终的 Handler。具体时序图如下:

01 服务端创建时序图.png

详解

  1. 创建 ServerBootstrap 实例。ServerBootstrap 是 Netty 服务端的启动辅助类,它提供了一系列的方法用于设置服务端启动相关的参数。底层通过门面模式对各种能力进行抽象和封装,尽量不需要用户跟过多的底层 API 打交到,降低用户的开发难度。
  2. 设置并绑定 Reactor 线程池。Netty 的 Reactor 线程池是 EventLoopGroup,它实际是 EventLoop 的数组。EventLoop 的职责是处理所有注册到本线程多路复用器 Selector 上的 Channel,Selector 的轮询操作由绑定的 EventLoop 线程 run 方法驱动,在一个循环体内循环执行。EventLoop 的职责不仅仅是处理网络 I/O 事件,用户自定义的 Task 和定时任务 Task 也统一由 EventLoop 负责处理,这样线程模型就实现了统一。
  3. 设置并绑定服务端 Channel。作为 NIO 服务端,需要创建 ServerSocketChannel,Netty 对原生的 NIO 类库进行了封装,对应实现是 NioServerSocketChannel。对于用户而言,不需要关心服务端 Channel 的底层实现细节和工作原理,只需要指定具体使用哪种服务端 Channel 即可。因此,Netty 的 ServerBootstrap 方法提供了 channel 方法用于指定服务端 Channel 的类型。
  4. 链路建立的时候创建并初始化 ChannelPipeline。ChannelPipeline 并不是 NIO 服务端必须的,它本质就是一个负责处理网络事件的职责链,负责管理和执行 ChannelHandler。网络事件以事件流的形式在 ChannelPipeline 中流转,由 ChannelPipeline 根据 ChannelHandler 的执行策略调度 ChannelHandler 的执行。典型的网络事件如下:
    • 链路注册
    • 链路激活
    • 链路断开
    • 接收到请求消息
    • 请求消息接收并处理完毕
    • 发送应答消息
    • 链路发生异常
    • 发生用户自定义事件
  5. 初始化 ChannelPipeline 完成之后,添加并设置 ChannelHandler。ChannelHandler 是 Netty 提供给用户定制和扩展的关键接口。利用 ChannelHandler 用户可以完成大多数的功能定制。比如系统的编解码框架,通用基于长度的半包解码器等等。
  6. 绑定并启动监听端口。在绑定监听观看之前系统会做一系列的初始化和检测工作,完成之后,会启动监听端口,并将 ServerSocketChannel 注册到 Selector 上监听客户端连接。
  7. Selector 轮询。由 Reactor 线程 NioEventLoop 负责调度和执行 Selector 轮询操作,选择准备就绪的 Channel 集合。
  8. 当轮询到准备就绪的 Channel 之后,就由 Reactor 线程 NioEventLoop 执行 ChannelPipeline 的相应方法,最终调度并执行 ChannelHandler。
  9. 执行 Netty 系统的 ChannelHandler 和用户添加定制的 ChannelHandler。ChannelPipeline 根据网络事件类型,调度并执行 ChannelHandler。

Netty服务端创建总结

本章根据一张时序图,我们对 Netty 这边服务端的创建有了一个整体的了解。Netty 为我们封装了很多操作,让使用者能够快速方便的接入。