博客
关于我
Netty源码—4.客户端接入流程一
阅读量:789 次
发布时间:2023-02-15

本文共 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/

    你可能感兴趣的文章