这是《底层到底做了什么》的第一篇,这个系列用于说明一些常用组件的基础功能的底层执行流程。比如netty建立连接、spring的@async的执行、junit的@ExtendWith的执行等

client发起连接
connection.png

  • 业务 线程
    -- 创建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 异常事件,关闭事件

一句话
12 声望1 粉丝

引用和评论

0 条评论