netty入门
简介
官方定义为: Netty是一款异步的事件驱动的网络应用程序框架,支持快速地开发可维护的高性能的面向协议的服务器和客户端
1. Transport Service (通信服务)
Socket&Datagram (TCP/UDP协议)
HTTP Tunnel (Http隧道,Http穿梭)
In-VM Pipe (管道)
2. Protocol Support (项目支持)
HTTP&WebSocket (http/websocket)
SSL StartTLS(SSL/加密通讯协议)
Google Protobuf(序列化)
zlib/gzip Compression (压缩,解压缩)
Large File Transfer (大文件传输)
RTSP(实时流传输协议)
Legacy Text - Binary Protocols with Unit Testability (单元测试)
3. Core(核心组件)
Extensible Event Model (事件驱动模型)
Universal Communication API(通用通讯API)
Zero-Copy-Capable Rich Byte Buffer(零拷贝的Buffer)
包结构
- netty-common
- netty-buffer
- netty-transport
- netty-handler
- codec
- resover
netty-common
common包主要有一些通用的工具类,还有Netty自己封装的一个并发包,里面有它重新实现的future和Promise以及EventExecutor和FastThreadLocal等通用的类,
common包作为netty的一个核心基础包,其他的包都需要依赖他
netty-buffer
buffer包实现了一个设计优美的ByteBuf(最初被设计为接口,后来被改为抽象类)组件,主要用来承载字节,包括字节的写入与读取。除了可以申请堆内存,通过Netty的ByteBuf还可以申请堆外内存,即DirectBuffer。另外对于Buffer的管理,Netty也是非常棒的,它实现了一个内存池,对于已经分配的内存使用完之后可以不释放,而是回收到内存池中去,下次再次申请时可以在池中寻找一个匹配的内存进行分配
netty-transport
transport包中有四种重要的类(或接口): Bootstrap,Channel,ChannelHandler和EventLoop
- Bootstrap是一种辅助应用启动类,它包括服务端和客户端
- Channel则是netty中核心组件之一,它表示一个网络套字节。通过Channel我们可以进行包括绑定端口,连接远程服务器,从网络中读取数据,向网站中写入数据等操作
- ChannelHandler是对IO操作进行处理的一种抽象,通过ChannelHandler我们可以将IO操作简化为一个个Handler类,
并且所有的Handler会在一个叫做ChannelPipeline的接口中进行传递。 - EventLoop是一个具体执行IO操作的容器,每一个EventLoop中有一个线程,一个Channel被创建后将被指定一个EventLoop,该Channel中所有的IO操作都会由分配到EventLoop来进行
执行,知道Channel被销毁,需要注意的是同一个EventLoop可能同时处理着多个Channel的任务,但是一个Channel只会由一个EventLoop处理
netty-handler
handler包中主要是为我们内置实现的一些开箱即用的ChannelHandler的实现类。比如说我们需要记录下所有的时间的日志,那么只要在pipeline中增加一个LogginHandler就可以了,再比如我们需要将一个http协议升级到HTTPS,那么只需要在我们的pipeline中增加一个SslHandler就可以了
codec
codec包只要是实现编解码,只要的两个基础抽象类:ByteToMessageDecoder,MessageToByteEncoder,分别是将字节解码为对象,以及将对应的编码为字节。其他所有的编解码的实现都是基于这两个类。我们可以通过集成这两个类来实现自己的编解码逻辑,也可以使用netty中已有的一些编解码方法,因为netty为我们内置了很多开箱即用的编码类
如:HttpRequestDecoder,HttpResponseEncoder,ProtobufDecoder,LineBasedFrameDecoder等等
resover
resover包主要是实现了一些解析器,包括address,host,name,dns等数据的解析