当前位置: 首页 > 科技观察

谈谈你对Netty中Pipeline工作原理的理解?

时间:2023-03-21 20:18:49 科技观察

一个工作8年的小伙伴去某东的IM部门面试,被问到这样一道面试题。Say,请谈谈你对NettyPipeline的设计原则的理解。当时他说他只用过Netty的Pipline,对原理没有深入了解,然后就没有了。今天给大家讲讲我对NettyPipeline的理解。1.结构设计Netty中的Pipeline本质上是一个双向链表,采用责任链模型。在Netty中,每个Channel都有一个且只有一个ChannelPipeline与之对应,它们的组成关系如下图所示。NEW从上图可以看出,一个Channel包含一个ChannelPipeline,一个ChannelPipeline维护着一个由ChannelHandlerContext组成的双向链表。链表的头部称为HeadContext,链表的尾部称为TailContext,每个ChannelHandlerContext关联一个ChannelHandler。2、工作原理首先看这段代码:NEWBootstrapclient=newBootstrap();client.channel(NioSocketChannel.class).handler(newChannelInitializer(){@OverrideprotectedvoidinitChannel(Channelch)throwsException{//接收类客户端请求处理流程ChannelPipelinepipeline=ch.pipeline();//Objectencoderpipeline.addLast("encoder",newObjectEncoder());//对象解码器pipeline.addLast("encoder",newObjectDecoder());}});对于用过Netty的朋友来说,应该是非常熟悉的。在Netty中,Pipeline的初始化是通过调用Channel的handler()方法,然后在handler()方法中传入一个名为ChannelInitializer的对象,通过SocketChannel构造一个新的Pipeline对象。每次调用addLast()方法时,都会在Pipelie的末尾插入一个ChannelHandlerContext。如图:NEW的每个Context都会包含一个ChannelHandler。我们通过addLast()方法向Pipeline中添加对象,Handlers的添加顺序会影响代码的执行顺序。这些Handler本质上实现了编码和解码的功能,编码器和解码器都必须实现ChannelHandler接口。图中的Handler就是我们的代码程序要执行的逻辑。而Netty默认帮我们实现了很多内置的Handlers,我们只需要直接拿来使用即可。当然我们也可以自己实现ChannelHandler接口来实现自定义的编码器和编码器。比如自定义通信协议等等。当所有的Handler都加入到Pipeline中后,Netty会将这些Handler组装成一个双向链表,实现串行调用。从头到尾执行的Handler称为Inbound,用于接收用户请求,从尾到头执行的Handler称为Outbound,用于响应用户。因此,Inbound可以用来实现解码的功能,Outbound可以用来实现编码的功能。好了,以上就是我对Pipeline设计原则的理解。