Netty的整体结构

Netty 的整体结构

https://netty.io/

Netty是一个NIO客户端服务器框架,可以快速轻松地开发网络应用程序,例如协议服务器和客户端。 它极大地简化和简化了诸如TCP和UDP套接字服务器之类的网络编程。

“快速简便”并不意味着最终的应用程序将遭受可维护性或性能问题的困扰。 Netty经过精心设计,结合了许多协议(例如FTP,SMTP,HTTP以及各种基于二进制和文本的旧式协议)的实施经验。 结果,Netty成功地找到了一种无需妥协即可轻松实现开发,性能,稳定性和灵活性的方法。

  • 设计:适用于各种传输类型的统一API-阻塞和非阻塞套接字。基于灵活且可扩展的事件模型,可将关注点明确分离。高度可定制的线程模型:单线程,一个或多个线程池,例如SEDA。真正的无连接数据报套接字支持(从3.1开始)
  • 使用方便:记录良好的Javadoc,用户指南和示例,没有其他依赖关系,JDK 5(Netty 3.x)或6(Netty 4.x)就足够了
  • 表现:更高的吞吐量,更低的延迟。减少资源消耗。减少不必要的内存复制
  • 安全:完整的SSL / TLS和StartTLS支持

1618468980461-4d371eaf-bf22-4c97-b89a-7e7fb37bd393.png

分层设计

  • Core,核心层,主要定义一些基础设施,比如可扩展的事件模型(重点)、通用的通信 API、基于零拷贝的缓冲区等。
  • Transport Service传输服务层,主要定义一些通信的底层能力,或者说是传输协议的支持,比如 TCP、UDP、HTTP 隧道、虚拟机管道等。
  • Protocol Support,协议支持层(编解码),这里的协议比较广泛,不仅仅指编解码协议,还可以是应用层的协议可以自定义的编解码,比如 HTTP、WebSocket、SSL、Protobuf、文本协议、二进制协议、压缩协议、大文件传输等,基本上主流的协议都支持

模块设计

  • 工具netty-common:包主要定义了一些工具类,所有其他模块都依赖此模块:通用比如StringUtil;对于JDK类库的增****强比如Future,FastThreadLocal等等;Netty自定义的并发包,比如EventExecutor等等;Netty 自定义的并发集合包,主要是对HashMap 的增强。

如果你是直接从 github 克隆下来的工程,会发现并没有集合包,那是怎么回事呢?

仔细观察一下 common 包,会发现 src/main 目录下还有两个目录:script 和 templates,一个是 groovy 脚本,一个是模板。粗略地看一下,会发现很像生成集合的代码模板,那么,怎么生成呢?无疑是在 maven 的 pom 文件中定义的,打开 pom.xml,搜索 groovy,果然能找到,而且有generate-sources这样的字眼,还配置了上面脚本的路径,所以,很简单,只要 compile 一下就可以了,当然,这里生成的不是源码,而是生成 class 文件到 target 下面。

  • 工具 netty-buffer:自己实现的Buffer,比JDK的Buffer好用,Netty的优化包含了池化Buffer和组合Buffer。
  • 工具 netty-resolver:地址解析
  • 传输netty-transport:定义服务于传输层的接口和类。比如Channel,ChannelHandler,ChannelHandlerContext,EventLoop等等。还实现了对TCP和UDP的通信协议的支持,另外三个包netty-transport-sctp、netty-transport-rxtx、netty-transport-udt也是对不同协议的支持

TCP,传输控制协议,Java 中一般用 SocketXxx、ServerSocketXxx 表示基于 TCP 协议通信。

UDP,用户数据报文协议,Java 中一般用 DatagramXxx 表示基于 UDP 协议通信,

SCTP,流控制传输协议。

RXTX,串口通讯协议。

UDT,基于 UDP 的数据传输协议。

  • Handler netty-handler:定义了各种不同的 Handler,满足不同的业务需求,比如,IP 过滤、日志、SSL、空闲检测、流量整形等
  • Handler netty-codec:逐步编解码(可以是多个编码器连起来执行)
    • 一系列编解码器。比如,base64、json、marshalling、protobuf、serializaion、string、xml 等,编码、解码、序列化、反序列化方式(序列化和反序列化其实是特殊的编解码),Netty 中都可以支持,它们是一类特殊的 ChannelHandler,专门负责编解码的工作。
    • 还实现了应用层协议编解码器:比如,http、http2、mqtt、redis、stomp 等等,
    • 也可以基于ChannelHandler 接口自定义编解码器来解决。netty-codec与netty-handler是两个平齐的模块,并不互相依赖,没有包含和被包含的关系,ChannelHandler 接口位于netty-transport模块中,两者都依赖于netty-transport模块。
  • 案例 netty-example:案例,discard,echo和worldclock等。

posted on 2025-10-13 01:08  chuchengzhi  阅读(6)  评论(0)    收藏  举报

导航

杭州技术博主,专注分享云计算领域实战经验、技术教程与行业洞察, 打造聚焦云计算技术的垂直博客,助力开发者快速掌握云服务核心能力。

褚成志 云计算 技术博客