Netty的框架构成
Netty的框架构成
Netty是一个多模块的项目,他的包结构设计的非常完美,但不是一开始就设计成这样的,也是在他发展的过程中慢慢的修改完善,最后形成了一个堪称完美的包结构。
Netty中的jar包
Netty是一个多模块的项目,有众多的jar包,我们可以直接使用它的 all-in-one
的包,也可以单独使用其中的某些包。这些单独的jar包包括:
- netty-common
- netty-buffer
- netty-transport
- netty-handler
- netty-codec
- netty-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中增加一个 LoggingHandler
就可以了,再比如说我们需要将一个http协议升级到https,那么只需要在我们的pipeline中增加一个 SslHandler
就可以了。
netty-codec
codec包主要是实现编解码的,主要的两个基础的抽象类:ByteToMessageDecoder
,MessageToByteEncoder
,分别是将字节解码为对象,以及将对象编码为字节。其他所有的编解码的实现都是基于这两个类。我们可以通过继承这两个类来实现自己的编解码逻辑,也可以使用netty中已有的一些编解码方法,因为netty为我们内置实现了非常多的开箱即用的编解码的类,例如:HttpRequestDecoder
,HttpResponseEncoder
,ProtobufDecoder
,LineBasedFrameDecoder
等等。
netty-resover
resover包主要是实现了一些解析器,包括 address
,host
,name
,dns
等数据的解析。
Netty包结构
让我们通过以下几张图来查看下netty在他发展的过程中包结构的变化:
image-3.1.0.png image-3.2.0.png image-3.3.0.png image-3.4.0.png image-3.5.0.png image-4.0.0.png image-4.0.11.png image-4.0.17.png image-4.0.22.png image-4.0.30.png image-4.0.40.png可以看到在版本不断升级的情况下,Netty的包结构并没有发生太大的变化。这是非常不容易的,要知道Netty的作者从2003就开始了Netty的项目,现在大版本已经发布到4.x了(目前Netty5已经废弃),在这么长的时间中,包结构能保持这么稳定说明Netty项目足够优秀。我们列举了一些流行的框架,比较一下各框架的包结构的变更的比例,结果如下表所示:
image-package-disorder-compare.png上面的表格表示每个项目包结构重新设计的占比,可以看到Netty的包结构是最稳定的。这意味着Netty的包结构从一开始就设计的比较合理,经过长久的发展也没有发生大的变化,从另一方面也反映了Netty是一个非常优秀的项目。
稳定的包结构所带来的好处也是不言而喻的:
- (大)版本升级的代价会比较小
- 统一稳定的API对开发者更友好
- 包结构的温度意味的功能稳定、性能稳定
PS:包结构参考自 http://edmundkirwan.com/general/netty.html
欢迎关注微信公众号我是逅弈,如果文章对您有帮助,欢迎您点赞加关注,并欢迎您关注我的公众号: