Netty 概览
Netty是网络应用开发框架,具有以下三个特点
- 异步
- 事件驱动
- 基于 NIO
Netty 作为网关适用于:
- 服务端开发
- 客户端开发
- 使用TCP/UDP/HTTP传输的网络应用
协议支持:Netty所支持的各种协议包括数据传输、序列化和反序列化(压缩和解压、编解码)
Zero-Copy-Capable Rich Byte Buffer 零拷贝
TCP/IP是一个多层协议,在传输过程中传输层、物理层会把应用层的数据转换为字节,然后按照自身协议的输出要求选择合适的字节大小进行拆分或者组合,在拆分或者组合的过程中应用层可能需要多次拷贝数据。数据拷贝对性能存在一定影响,Netty提供的ChannelBuffer是一个零拷贝的Buffer,通过CompositeChannelBuffer和SlicedChannelBuffer两个类实现了组合、拆分的零拷贝
————————————————
原文
Netty 特性
作为高性能的协议服务器可以实现:
- 高吞吐
- 低延迟
- 低开销
- 零拷贝
- 可扩容
- 松耦合: 网络和业务逻辑分离
- 使用方便、可维护性好
Netty兼容性
JDK 兼容性::
- Netty 3.x: JDK5及以上
- Netty 4.x: JDK6及以上
协议兼容性:
- 兼容大部分通用协议
- 支持自定义协议
嵌入式(可以使用在多种通信场景):
- HTTP Server
- HTTPS Server
- WebSocket Server
- TCP Server
- UDP Server
- In VM Pipe
Netty涉及的基本概念
- Channel
通道,用于取代直接监听和操作socket,Java NIO 中的基础概念,代表一个打开的连接,可执行读取/写入 IO 操作。Netty 对 Channel 的所有 IO 操作都是非阻塞的 - ChannelFuture
Java 的 Future 接口,只能查询操作的完成情况,或者阻塞当前线程等待操作完成。Netty 封装一个 ChannelFuture 接口,我们可以将回调方法传给 ChannelFuture,在操作完成时自动执行。 - Event & Handler
Netty 基于事件驱动,事件和处理器可以关联到入站和出站数据流 - Encoder & Decoder
处理网络 IO 时,需要进行序列化和反序列化,转换 Java 对象与字节流
对入站数据进行解码,基类是 ByteToMessageDecoder
对出站数据进行编码,基类是MessageToByteEncoder - ChannelPipeline
数据处理管道就是事件处理器链
有顺序、同一 Channel 的出站处理器和入站处理器在同一个列表中
Netty 应用组成
Netty 基于事件驱动, Netty 应用主要组成即为Event & Handler
Event:
- 网络事件
1、 入站事件:
• 通道激活和停用
• 读操作事件
• 异常事件
• 用户事件
2、出站事件:
• 打开连接
• 关闭连接
• 写入数据
• 刷新数据- 应用程序逻辑事件
- Handler
事件处理程序接口:
• ChannelHandler
• ChannelOutboundHandler 应用程序用于通过channel向Socket输出数据的handler
•ChannelInboundHandler 应用程序用于通过channel从Socket读取数据的handler
适配器(空实现,需要继承使用):
• ChannelInboundHandlerAdapter
• ChannelOutboundHandlerAdapter