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