Netty 介绍

Netty 介绍1 1 Netty 原理 Netty 是一个高性能 异步事件驱动的 NIO 框架 基于 JAVANIO 提供的 API 实现 它提供了对 TCP UDP 和文件传输的支持 作为一个异步 NIO 框架 Netty 的所有 IO 操作都是异步非阻塞的 通过 Future Listener 机制 用户可以方便的主动获取或者通过通知机制获得 IO 操作结果 1 2 Netty 高性能

1.1. Netty 原理

Netty 是一个高性能、异步事件驱动的 NIO 框架,基于 JAVA NIO 提供的 API 实现。它提供了对

TCPUDP 和文件传输的支持,作为一个异步 NIO 框架,Netty 的所有 IO 操作都是异步非阻塞

的,通过 Future-Listener 机制,用户可以方便的主动获取或者通过通知机制获得 IO 操作结果。

1.2. Netty 高性能

IO 编程过程中,当需要同时处理多个客户端接入请求时,可以利用多线程或者 IO 多路复用技术

进行处理。IO 多路复用技术通过把多个 IO 的阻塞复用到同一个 select 的阻塞上,从而使得系统在

单线程的情况下可以同时处理多个客户端请求。与传统的多线程/多进程模型比,I/O 多路复用的

最大优势是系统开销小,系统不需要创建新的额外进程或者线程,也不需要维护这些进程和线程

的运行,降低了系统的维护工作量,节省了系统资源。与 Socket 类和 ServerSocket 类相对应,NIO 也提供了 SocketChannel ServerSocketChannel两种不同的套接字通道实现。

1.2.1. 多路复用通讯方式

Netty 架构按照 Reactor 模式设计和实现,它的服务端通信序列图如下:

Netty 介绍

客户端通信序列图如下:Netty 介绍Netty 的 IO 线程 NioEventLoop 由于聚合了多路复用器 Selector,可以同时并发处理成百上千个

客户端 Channel,由于读写操作都是非阻塞的,这就可以充分提升 IO 线程的运行效率,避免由于

频繁 IO 阻塞导致的线程挂起。

1.2.1. 异步通讯 NIO

由于 Netty 采用了异步通信模式,一个 IO 线程可以并发处理 N 个客户端连接和读写操作,这从根

本上解决了传统同步阻塞 IO 一连接一线程模型,架构的性能、弹性伸缩能力和可靠性都得到了极

大的提升。

1.2.2. 零拷贝(DIRECT BUFFERS 使用堆外直接内存)

1. Netty 的接收和发送 ByteBuffer 采用 DIRECT BUFFERS,使用堆外直接内存进行 Socket 读写,

不需要进行字节缓冲区的二次拷贝。如果使用传统的堆内存(HEAP BUFFERS)进行 Socket 读写,

JVM 会将堆内存 Buffer 拷贝一份到直接内存中,然后才写入 Socket 中。相比于堆外直接内存,

消息在发送过程中多了一次缓冲区的内存拷贝。

2. Netty 提供了组合 Buffer 对象,可以聚合多个 ByteBuffer 对象,用户可以像操作一个 Buffer 那样

方便的对组合 Buffer 进行操作,避免了传统通过内存拷贝的方式将几个小 Buffer 合并成一个大的Buffer。

3. Netty的文件传输采用了transferTo方法,它可以直接将文件缓冲区的数据发送到目标 Channel

避免了传统通过循环 write 方式导致的内存拷贝问题

1.2.3. 内存池(基于内存池的缓冲区重用机制)

随着 JVM 虚拟机和 JIT 即时编译技术的发展,对象的分配和回收是个非常轻量级的工作。但是对于缓

冲区 Buffer,情况却稍有不同,特别是对于堆外直接内存的分配和回收,是一件耗时的操作。为了尽

量重用缓冲区,Netty 提供了基于内存池的缓冲区重用机制。

1.2.4. 高效的 Reactor 线程模型

常用的 Reactor 线程模型有三种,Reactor 单线程模型, Reactor 多线程模型, 主从 Reactor 多线程模型。

Reactor 单线程模型

Reactor 单线程模型,指的是所有的 IO 操作都在同一个 NIO 线程上面完成,NIO 线程的职责如下:

1) 作为 NIO 服务端,接收客户端的 TCP 连接;

2) 作为 NIO 客户端,向服务端发起 TCP 连接;

3) 读取通信对端的请求或者应答消息;

4) 向通信对端发送消息请求或者应答消息。

Netty 介绍由于 Reactor 模式使用的是异步非阻塞 IO,所有的 IO 操作都不会导致阻塞,理论上一个线程可以独

立处理所有 IO 相关的操作。从架构层面看,一个 NIO 线程确实可以完成其承担的职责。例如,通过

Acceptor 接收客户端的 TCP 连接请求消息,链路建立成功之后,通过 Dispatch 将对应的 ByteBuffer

派发到指定的 Handler 上进行消息解码。用户 Handler 可以通过 NIO 线程将消息发送给客户端。

Reactor 多线程模型

Rector 多线程模型与单线程模型最大的区别就是有一组 NIO 线程处理 IO 操作。 有专门一个

NIO 线程-Acceptor 线程用于监听服务端,接收客户端的 TCP 连接请求; 网络 IO 操作-读、写

等由一个 NIO 线程池负责,线程池可以采用标准的 JDK 线程池实现,它包含一个任务队列和 N

个可用的线程,由这些 NIO 线程负责消息的读取、解码、编码和发送;

主从 Reactor 多线程模型

服务端用于接收客户端连接的不再是个 1 个单独的 NIO 线程,而是一个独立的 NIO 线程池。

Acceptor 接收到客户端 TCP 连接请求处理完成后(可能包含接入认证等),将新创建的

SocketChannel 注册到 IO 线程池(sub reactor 线程池)的某个 IO 线程上,由它负责

SocketChannel 的读写和编解码工作。Acceptor 线程池仅仅只用于客户端的登陆、握手和安全

认证,一旦链路建立成功,就将链路注册到后端 subReactor 线程池的 IO 线程上,由 IO 线程负

责后续的 IO 操作。

Netty 介绍Netty 介绍1.2.5. 无锁设计、线程绑定

Netty 采用了串行无锁化设计,在 IO 线程内部进行串行操作,避免多线程竞争导致的性能下降。

表面上看,串行化设计似乎 CPU 利用率不高,并发程度不够。但是,通过调整 NIO 线程池的线程

参数,可以同时启动多个串行化的线程并行运行,这种局部无锁化的串行线程设计相比一个队列

多个工作线程模型性能更优。

Netty NioEventLoop 读取到消息之后,直接调用 ChannelPipeline

fireChannelRead(Object msg),只要用户不主动切换线程,一直会由 NioEventLoop 调用

到用户的 Handler,期间不进行线程切换,这种串行化处理方式避免了多线程操作导致的锁

的竞争,从性能角度看是最优的。

1.2.6. 高性能的序列化框架

Netty 默认提供了对 Google Protobuf 的支持,通过扩展 Netty 的编解码接口,用户可以实现其它的

高性能序列化框架,例如 Thrift 的压缩二进制编解码框架。

1. SO_RCVBUF SO_SNDBUF:通常建议值为 128K 或者 256K。

 

Netty 介绍Netty 介绍小包封大包,防止网络阻塞

2. SO_TCPNODELAY:NAGLE 算法通过将缓冲区内的小封包自动相连,组成较大的封包,阻止大量

小封包的发送阻塞网络,从而提高网络应用效率。但是对于时延敏感的应用场景需要关闭该优化算

法。

软中断 Hash 值和 CPU 绑定

3. 软中断:开启 RPS 后可以实现软中断,提升网络吞吐量。RPS 根据数据包的源地址,目的地址以

及目的和源端口,计算出一个 hash 值,然后根据这个 hash 值来选择软中断运行的 cpu,从上层

来看,也就是说将每个连接和 cpu 绑定,并通过这个 hash 值,来均衡软中断在多个 cpu 上,提升

网络并行处理性能。

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/211223.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午10:55
下一篇 2026年3月18日 下午10:55


相关推荐

  • select2 api参数的文档

    select2 api参数的文档

    2021年11月9日
    33
  • Windows搭建Ldap服务器

    Windows搭建Ldap服务器Windows搭建Ldap服务器RerferenceSofewareLdapServer安装包openldap-2.2.29-db-4.3.29-openssl-0.9.8a-win32_Setup.exeLdap客户端LdapAdmin.exe安装一路next到install即可。配置文件1slapd.conf2找到include./schema/c

    2022年5月14日
    249
  • formidable接收图片

    formidable接收图片DOCTYPE tml htmllang en head metacharset UTF 8 metaname viewport content width device width initial scale 1 0 metahttp equiv X UA Compatible content ie edge title Do title metahttp equiv X UA Compatible content ie edge metaname viewport content width device width initial scale 1 0 metacharset UTF 8 head htmllang en

    2026年3月17日
    2
  • 格力与京东签署战略合作协议 目标三年销AI空调1000万台

    格力与京东签署战略合作协议 目标三年销AI空调1000万台

    2026年3月14日
    2
  • 微分方程中解、特解、通解的区别

    微分方程中解、特解、通解的区别首先我们先来了解一下 一 什么是微分方程 微分方程指的是含有微分或导数的方程 二 什么是微分方程的解 能够使微分方程恒成立的函数称为微分方程的解 微分方程的解与其他函数方程的解不同 如一元二次函数的方程解是某常数 三 特解与通解各是什么 微分方程的解并不是唯一的 特解 指不含有任意常数的解 实质就是在某一限定条件下能使微分方程成立的解 它是通解中的一员 通解 相互独立的常数的个数与微分方程阶数相同的解 其中微分方程的阶数是指微分方程中所含微分或导数的最高阶数 通解的实质是微分方程

    2026年3月19日
    2
  • WAP产品策划书模版

    WAP产品策划书模版自己要给公司写一份产品首先需要一个产品策划书你会写吗 如果还没写过 不防看下 陌生人 先生为我们提供的这个模版产品策划方案模板根据个人经验总结出以下内容结构以供参考 一份完整的产品策划方案应包含的内容 1 引言描述导致产品创意产生的用户需求 市场需求 市场前景等概述性文字 2 产品简介关于产品的简单介绍 包括内容 功能 特点 与同类产品的比较等 3 实现原理产

    2026年3月16日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号