这是《底层到底做了什么》的第一篇,这个系列用于说明一些常用组件的基础功能的底层执行流程。比如netty建立连接、spring的@async的执行、junit的@ExtendWith的执行等
client发起连接
- 业务 线程
-- 创建channel,并初始化pipeline,绑定eventloop
-- 创建connect任务,异步发给 eventloop 执行 - eventloop 线程
-- eventloop调用pipeline connect,pipeline从tail开始处理,然后传给 head handler 实际处理
-- head handler 调用socket异步执行connect
-- 注册监听op_connect到select - eventloop 线程
-- nioeventloop中 select循环,获得 op_connect 消息
-- 取消select监听 op_connect
-- promise设置为success,触发pipeline channel active事件,后续调用业务代码
附上其他基础流程:
server 建立连接
- boss eventloop 线程
-- nioeventloop 的中select 循环,获得消息OP_ACCEPT
-- nioeventloop 调用 nioServerSocketChannel 的read方法(socket accept)
-- nioServerSocketChannel 通过socket accept 请求,创建 NioSocketChannel,放到readBuf中
-- nioServerSocketChannel 调用pipeline的readComplete ,处理NioSocketChannel
-- head handler转发给 ServerBootstrapAcceptor,
-- ServerBootstrapAcceptor 创建新pipeline,把注册任务放入work eventloop线程的任务队列,把定时任务也放入队列 - work eventloop 线程
-- 注册select ,触发pipeline fireChannelActive
-- 启动定时任务,监听select消息
发送消息
- 调用ChannelHandlerContext的writeAndFlush方法
- 通过pipeline,向head转发
- head 调用 channel 的write方法
- 从内存池中分配堆外内存,并存储消息到堆外内存
- 将消息放入channel输出队列
- 调用channel flush
- 调用socket io,实际写出
接收消息
- nioeventloop中select 循环,获得read消息
- 调用nioSocketChannel 的read方法
- 内存池分配内存,并接收消息
- 触发pipeline,read active
- pileline转发head,head转发业务处理handler
client端主动关闭连接,server端处理流程
- nioeventloop中select 循环,获得read消息
- nio channel 读取数据,返回异常
- 异常处理,释放bytebuf内存
- 触发pipeline 异常事件,关闭事件
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。