Netty的整体结构
Netty 的整体结构
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支持

分层设计
- 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) 收藏 举报
浙公网安备 33010602011771号