Netty的工作机制

Posted 逅弈逐码

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Netty的工作机制相关的知识,希望对你有一定的参考价值。

本文简单的介绍下Netty是如何工作的,可以用一个简易的图描述如下:

为什么说这是一个简易的图呢,因为Netty中远不止这些,只是为了大致描述下Netty工作的流程,还有很多细节上的东西都没有描述出来。

首先Netty有一个针对 Socket 的抽象: Channel ,所有的数据读写操作都会在这个 Channel 上执行,每个 Channel 有一个 ChannelPipeline ,他负责管理这个 Channel 中的所有 ChannelHandler 。想要具体了解 ChannelPipeline 可以看笔者写的另一篇文章:。

ChannelPipeline 是一个类似于拦截器模式的设计,数据从 head 传递到 tail ,经过处理之后再从 tail 传递到 head ,你可以在 ChannelPipeline 中进行可重用的业务逻辑处理,在Netty中已经通过这种方式实现了内置的编解码器。

举个简单的例子,我们可以把数据的传递过程想象成很多人在地里摘西瓜。

我们有很多人一个挨一个的从西瓜地一直排到卡车边上,西瓜就是我们要传递的 Data, 每个人就相当于一个 ChannelHandlerContext,他手里有一个扫描的枪就相当于 ChannelHandler

  • 第一个人把西瓜从地里摘起来之后用他的枪扫了下,发现是个完整的西瓜,然后就传给了第二个人;

  • 第二个人拿到西瓜之后也用他的枪扫了一下,发现这个西瓜确实已经熟了,然后就传给了第三个人;

  • 第三个人拿到西瓜之后也用他的枪扫了一下,发现这个西瓜纹理清晰,然后就继续传给了第四个人;

  • 。。。

  • 最后一个人拿到西瓜之后用枪扫了一下,发现这个西瓜的尺寸符合标准,然后就把西瓜装到卡车上了。

至此西瓜已经从地里被运送到了卡车上,但是中间的过程中只要有任何一个人的检测结果不符合他的要求,那么他就可以对这个西瓜做出他自己的处置,比如可以直接将西瓜丢弃掉,或者告诉前一个人说这个西瓜不符合标准。

PS:ChannelHandlerContext是一个将数据从一个ChannelHandler传递到下一个ChannelHandler的辅助类,在ChannelPipeline中所有的ChannelHandlerContext会形成一个双向的链表,这个在后面的章节会详细的介绍。



以上是关于Netty的工作机制的主要内容,如果未能解决你的问题,请参考以下文章

Netty优雅退出机制和原理

Netty对读写空闲检测的支持

图解 Google V8 # 05:函数表达式的底层工作机制

Netty框架之编解码机制二(自定义协议)

Netty框架之编解码机制二(自定义协议)

Netty框架之编解码机制二(自定义协议)