本文共 1803 字,大约阅读时间需要 6 分钟。
Netty客户端连接接入问题整理
1. 关于Netty客户端连接接入问题整理
一、Netty是在哪里检测有新连接接入的?
Netty通过boss线程轮询ACCEPT事件,通过JDK底层Channel的accept()方法创建新的连接。
二、新连接是怎样注册到NioEventLoop线程的?
boss线程调用chooser的next()方法获取NioEventLoop,将新连接注册到该EventLoop的Selector上。
2. Reactor线程模型和服务端启动流程
1. Netty中的Reactor线程模型
Netty有两种关键线程:
- boss线程:负责接收新连接,封装Channel并传递给worker线程。
- worker线程:处理连接上的读写操作。
2. 服务端启动流程
服务端启动在用户线程中,通过ServerBootstrap.bind()启动boss线程,启动后服务器开始监听。
3. Netty新连接接入的整体处理逻辑
一、检测新连接
服务端Channel轮询Selector,检测到ACCEPT事件后,调用服务端Channel的unsafe.read()方法处理。
二、创建NioSocketChannel
通过JDK Channel的accept()方法创建客户端Channel,并将其封装为Netty的NioSocketChannel。
三、分配worker线程及注册Selector
将NioSocketChannel注册到对应的NioEventLoop的Selector,处理读写事件。
四、注册读事件
向Selector注册READ事件,确保新连接的读写事件由worker线程处理。
4. 新连接接入之检测新连接
一、何时会检测到有新连接
服务端启动后,boss线程轮询Selector,检测到ACCEPT事件时有新连接接入。
二、新连接接入的流程梳理
NioMessageUnsafe.read()方法: - 检查Channel是否开放。
- 调用doReadMessages()创建NioSocketChannel。
- 通过pipeline.fireChannelRead()处理新连接。
创建NioSocketChannel: - 通过JDK Channel的accept()方法创建客户端Channel。
- 封装为NioSocketChannel并添加到List中。
三、新连接接入的总结
服务端Channel的NioEventLoop处理ACCEPT事件,创建NioSocketChannel并注册读事件,完成新连接接入。
5. 新连接接入之创建NioSocketChannel
一、doReadMessages()方法相关说明
- 通过javaChannel().accept()创建JDK Channel。
- 封装为NioSocketChannel并添加到List中。
二、创建NioSocketChannel的流程梳理
- 逐层调用父类构造方法,设置非阻塞模式。
- 创建必要的组件(Id、Unsafe、Pipeline)。
- 配置Nagle算法,禁止小数据包聚合。
三、创建NioSocketChannel的总结
创建NioSocketChannel的核心步骤是封装JDK Channel并设置必要配置。
6. Netty中的Channel分类
1. Channel继承Comparable
Channel是可比较的对象,用于区分不同的Channel实例。
2. Channel继承AttributeMap
Channel可以绑定属性,通过channel.attr()方法管理。
3. AbstractChannel实现基本功能
包含Id、Unsafe、Pipeline等基本组件。
4. AbstractNioChannel实现NIO功能
通过Selector处理NIO操作,设置非阻塞模式。
5. 服务端与客户端Channel区别
- 服务端Channel通过反射创建,注册ACCEPT事件。
- 客户端Channel通过new关键字创建,注册READ事件。
- 两者均依赖Unsafe对象实现读写。
6. ChannelConfig实现配置
每个Channel都有对应的ChannelConfig,配置如禁用Nagle算法。
通过以上步骤,Netty实现了高效的客户端连接接入和数据处理流程。
转载地址:http://cvcfk.baihongyu.com/