Netty
1、概述
2、线程模型
3、核心组件
3.1 Channel
3.2 ChannelHandler和ChannelPipeline
3.3 EventLoop和EventLoopGroup
3.4 Future和Promise
4、创建过程
4.1 服务端创建过程
4.2 客户端创建过程
5、TCP粘包和拆包
6、序列化与反序列化
-
+
tourist
register
Sign in
服务端创建过程
## 1 创建过程 > Netty为了向使用者屏蔽NIO通信的细节,在和用户交互的边界做了封装,目的就是为了减少用户开发工作量,降低开发难度,ServerBootstrap是Socket服务端的启动辅助类,用户通过ServerBootstrap可以方便的创建Netty的服务端。 ![](/media/202108/2021-08-25_150215_606261.png) 1. **创建ServerBootstrap实例**: 1. ServerBootstrap**是Netty服务端的启动辅助类**,他**提供了一系列的方法用于设置服务端启动相关的参数**,**底层通过门面模式对各种能力进行抽象和封装**,**尽量不需要用户跟过多的底层API打交道**,以**降低用户的开发难度**。 2. **设置并绑定Reactor线程池**: 1. **Netty的Reactor线程池是EventLoopGroup**,他实际就**是[EventLoop](https://notebook.ricear.com/project-49/doc-850)的数组**,EventLoop的职责是**处理所有注册到本线程多路复用器Selector上的Channel**,**Selector的轮询操作是由绑定的EventLoop线程的 `run()`方法驱动的**,**在一个循环体内循环执行**, 2. 值得说明的是**EventLoop的职责不仅仅是处理网络I/O事件**,**用户自定义的Task和定时任务Task也统一由EventLoop负责处理**,这样**线程模型就实现了统一**,**从调度层面看**,也**不存在从EventLoop线程中再启动其他类型的线程用于异步执行另外的任务**,这样就**避免了多线程并发操作和锁竞争**,**提升了I/O线程的处理和调度性能**。 3. **设置并绑定服务端Channel**: 1. 作为NIO服务端,**需要创建ServerSocketChannel**,**Netty对原生的NIO类库进行了封装**,**对应实现是NioServerSocketChannel**。 2. 对于用户而言,不需要关心服务端Channel的底层实现细节和工作原理,只**需要指定具体使用那种服务端Channel**即可。 3. 因此,Netty的ServerBootstrap方法**提供了 `channel()`方法用于指定服务端Channel的类型**,Netty**通过工厂类**,**利用反射创建NioServerSocketChannel对象**,由于**服务端监听端口往往只需要在系统启动时才会调用**,因此**反射对性能的影响并不大**: ```java public B channel(Class<? extends C> channelClass) { return channelFactory(new ReflectiveChannelFactory<C>( ObjectUtil.checkNotNull(channelClass, "channelClass") )); } ``` 4. **链路建立的时候创建并初始化[ChannelPipeline](https://notebook.ricear.com/project-49/doc-848/#2-ChannelPipeline)**: 1. ChannelPipeline并**不是NIO服务端必需的**,他**本质就是一个负责处理网络事件的职责链**,**负责管理和执行[ChannelHandler](https://notebook.ricear.com/project-49/doc-848)**。 2. **网络事件以事件流的形式在ChannelPipeline中流转**,**由ChannelPipeline根据ChannelHandler的执行策略调度ChannelHandler的执行**,典型的网络事件如下: 1. 链路注册。 2. 链路激活。 3. 链路断开。 4. 接收到请求消息。 5. 请求消息接收并处理完毕。 6. 发送应答消息。 7. 链路发生异常。 8. 发生用户自定义事件。 5. **初始化ChannelPipeline完成之后**,**添加并设置ChannelHandler**: 1. **ChannelHandler是Netty给用户定制和扩展的关键接口**,**利用ChannelHandler用户可以完成大多数的功能定制**,例如消息编解码、心跳、安全认证、TSL/SSL认证、流量控制和流量整形等,Netty同时也**提供了大量的系统ChannelHandler供用户使用**,比较实用的系统ChannelHandler总结如下: 1. 系统编解码框架:ByteToMessageCodec。 2. 通用基于长度的半包解码器:LengthFieldBasedFrameDecoder。 3. 码流日志打印Handler:LoggingHandler。 4. SSL安全认证Handler:SslHandler。 5. 链路空闲检测Handler:IdleStateHandler。 6. 流量整形Handler:ChannelTrafficShapingHandler。 7. Base64编解码:Base64Decoder和Base64Encoder。 2. 创建和添加ChannelHandler的代码示例如下: ```java ServerBootstrap serverBootstrap = new ServerBootstrap(); serverBootstrap.childHandler(new ChannelInitializer<SocketChannel>() { @Override protected void initChannel(SocketChannel ch) throws Exception { ChannelPipeline channelPipeline = ch.pipeline(); channelPipeline.addLast(new LoggingHandler()); } }); ``` 6. **绑定并启动监听端口**: 1. **在绑定监听端口之前系统会做一系列的初始化和检测工作**,**完成之后**,**会启动监听端口**,并**将ServerSocketChannel注册到Selector上监听客户端连接**: ```java public ChannelFuture bind(SocketAddress localAddress) { validate(); return doBind(ObjectUtil.checkNotNull(localAddress, "localAddress")); } ``` 7. **Selector轮询**: 1. **由Reactor线程NioEventLoop负责调度和执行Selector轮询操作**,**选择准备就绪的Channel集合**。 8. **调度并执行ChannelHandler**: 1. **当轮询到准备就绪的Channel之后**,就**由Reactor线程NioEventLoop执行ChannelPipeline的相应方法**,**最终调度并执行ChannelHandler**。 9. **执行系统ChannelHandler和用户添加定制的ChannelHandler**: 1. **执行Netty系统ChannelHandler和用户添加定制的ChannelHandler**,**ChannelPipeline根据网络事件的类型**,**调度并执行ChannelHandler**。 ## 参考文献 1. 《Netty 权威指南 第 2 版》
ricear
Aug. 25, 2021, 4:18 p.m.
©
BY-NC-ND(4.0)
转发文档
Collection documents
Last
Next
手机扫码
Copy link
手机扫一扫转发分享
Copy link
Markdown文件
share
link
type
password
Update password