Netty 是一个广泛使用的 Java 网络编程框架,对 JDK 自带的 NIO 的 API 进行了封装,主要特点有:

  • 设计优雅:适用于各种传输类型的统一 API 阻塞和非阻塞 Socket;基于灵活且可扩展的事件模型,可以清晰地分离关注点;高度可定制的线程模型 - 单线程,一个或多个线程池;真正的无连接数据报套接字支持(自 3.1 起)
  • 高性能、吞吐量更高:延迟更低;减少资源消耗;最小化不必要的内存复制。
  • 安全:完整的 SSL/TLS 和 StartTLS 支持
  • 社区活跃:社区活跃,版本迭代周期短,发现的 Bug 可以被及时修复,同时,更多的新功能会被加入。

    Netty 实现

    线程模型

    Netty 主要基于主从 Reactors 多线程模型做了一定的修改,其中主从 Reactor 多线程模型有多个 Reactor:

  • MainReactor 负责客户端的连接请求,并将请求转交给 SubReactor;

  • SubReactor 负责相应通道的 IO 读写请求;
  • 非 IO 请求(具体逻辑处理)的任务则会直接写入队列,等待 worker threads 进行处理。

虽然 Netty 的线程模型基于主从 Reactor 多线程,借用了 MainReactor 和 SubReactor 的结构。但是实际实现上 SubReactor 和 Worker 线程在同一个线程池中:

  1. EventLoopGroup bossGroup = newNioEventLoopGroup();
  2. EventLoopGroup workerGroup = newNioEventLoopGroup();
  3. ServerBootstrap server = newServerBootstrap();
  4. server.group(bossGroup, workerGroup)
  5. .channel(NioServerSocketChannel.class)

上面代码中的 bossGroup 和 workerGroup 是 Bootstrap 构造方法中传入的两个对象,这两个 group 均是线程池:

  • bossGroup 线程池则只是在 Bind 某个端口后,获得其中一个线程作为 MainReactor,专门处理端口的 Accept 事件,每个端口对应一个 Boss 线程;
  • workerGroup 线程池会被各个 SubReactor 和 Worker 线程充分利用

参考:
https://www.zhihu.com/question/24322387/answer/282001188
https://www.cnblogs.com/imstudy/p/9908791.html
https://www.cnblogs.com/ronnieyuan/p/12017403.html