难倒了80%程序员的题,谈谈你对Netty中,Pipeline工作原理的理解

简介: 1位工作8年的小伙伴,去某东面试IM部门,被问到这样一道面试题。说,请你谈一谈你对Netty Pipeline设计原理的理解。当时,他说只是用过Netty的Pipline,原理没有深入了解过,然后就没有然后了。

1位工作8年的小伙伴,去某东面试IM部门,被问到这样一道面试题。说,请你谈一谈你对Netty Pipeline设计原理的理解。当时,他说只是用过Netty的Pipline,原理没有深入了解过,然后就没有然后了。


今天,我给大家讲一讲,我对Netty Pipeline的理解。

1、结构设计

Netty中的Pipeline本质上是一个双向链表,它采用了责任链模式。在Netty中每个Channel都有且仅有一个ChannelPipeline与之对应,它们的组成关系如下图所示。

fbe9fa78ccd385554a894c450cea7519.jpg

通过上图可以看到,一个Channel包含了一个ChannelPipeline,而ChannelPipeline中又维护了一个由ChannelHandlerContext组成的双向链表。这个链表的头叫HeadContext,链表的尾叫TailContext,并且每个ChannelHandlerContext中又关联着一个ChannelHandler。

2、工作原理

首先来看这样一段代码:

e4b2c7e3d8673faa5430529d575182a9.jpg

Bootstrap client = new Bootstrap();
        client.channel(NioSocketChannel.class)
        .handler(new ChannelInitializer() {
            @Override
            protected void initChannel(Channel ch) throws Exception {
                //接收课客户端请求的处理流程
                ChannelPipeline pipeline = ch.pipeline();
                //对象编码器
                pipeline.addLast("encoder",new ObjectEncoder());
               //对象解码器
                pipeline.addLast("encoder",new ObjectDecoder());
            }
        });

对于用过Netty的小伙伴来说,应该非常熟悉。在Netty中,Pipeline的初始化,是通过调用Channel的handler()方法,然后在handler()方法中传入一个叫做ChannelInitializer的对象,通过SocketChannel构建出一个新的Pipeline对象。每次调用addLast()方法,都会在Pipelie的末端插入一个ChannelHandlerContext。如图所示:

3bda2a44ddc3bc60212a6eef573c285d.jpg

每个Context中又会包含一个ChannelHandler,我们通过addLast()方法往Pipeline中添加的对象,并且Handler的添加顺序会影响代码的执行顺序。而这些Handler本质上都是实现编码和解码的功能,不管是编码器还是解码器都必须实现ChannelHandler接口。


图中的Handler就是我们代码程序要执行的逻辑。而Netty默认帮我们实现了非常多内置Handler,我们只需要直接拿过来用就可以了。当然,我们也可以自己实现ChannelHandler接口,来实现自定义的编、码器。比如自定义通信协议等等。


当所有的Handler全部添加到Pipeline中以后,Netty就会将这些Handler组装成一个双向链表,从而实现串行化调用。从头部往尾部执行的Handler被称为Inbound,用来接收用户请求,从尾部往头部执行的Handler被称为Outbound,用来给用户响应。所以,Inbound可以用来实现解码的功能、而Outbound可以用来实现编码的功能。


好了,以上就是我对Pipeline设计原理的理解。


我是被编程耽误的文艺Tom,关注我,面试不再难!

9106b97c16b34d06af118b23d081cde9.gif

相关文章
|
3月前
|
网络协议
【Netty 网络通信】Socket 通信原理
【1月更文挑战第9天】【Netty 网络通信】Socket 通信原理
|
7月前
|
缓存 安全 Java
由浅入深Netty基础知识NIO三大组件原理实战 2
由浅入深Netty基础知识NIO三大组件原理实战
47 0
|
7月前
|
Java
由浅入深Netty基础知识NIO三大组件原理实战 1
由浅入深Netty基础知识NIO三大组件原理实战
61 0
|
2月前
|
Java Unix Linux
【Netty技术专题】「原理分析系列」Netty强大特性之Native transports扩展开发实战
当涉及到网络通信和高性能的Java应用程序时,Netty是一个强大的框架。它提供了许多功能和组件,其中之一是JNI传输。JNI传输是Netty的一个特性,它为特定平台提供了高效的网络传输。 在本文中,我们将深入探讨Netty提供的特定平台的JNI传输功能,分析其优势和适用场景。我们将介绍每个特定平台的JNI传输,并讨论其性能、可靠性和可扩展性。通过了解这些特定平台的JNI传输,您将能够更好地选择和配置适合您应用程序需求的网络传输方式,以实现最佳的性能和可靠性。
57 7
【Netty技术专题】「原理分析系列」Netty强大特性之Native transports扩展开发实战
|
1天前
|
存储 前端开发
Netty核心源码Pipeline详细详解
Netty核心源码Pipeline详细详解
4 0
|
3月前
|
前端开发 UED
Netty Review - Netty自动重连机制揭秘:原理与最佳实践
Netty Review - Netty自动重连机制揭秘:原理与最佳实践
82 0
|
3月前
|
监控 网络协议 调度
Netty Review - 深入探讨Netty的心跳检测机制:原理、实战、IdleStateHandler源码分析
Netty Review - 深入探讨Netty的心跳检测机制:原理、实战、IdleStateHandler源码分析
112 0
|
3月前
|
前端开发 网络协议 Dubbo
Netty - 回顾Netty高性能原理和框架架构解析
Netty - 回顾Netty高性能原理和框架架构解析
250 0
|
4月前
|
JSON 网络协议 Java
Netty底层原理
NIO有一个非常重要的组件——多路复用器,其底层有3种经典模型,分别是epoll、select和poll。与传统IO相比,一个多路复用器可以处理多个Socket连接,而传统IO对每个连接都需要一条线程去同步阻塞处理。NIO有了多路复用器后只需要一条线程即可管理多个Socket连接的接入和读写事件。
|
11月前
|
存储 Java
Netty网络编程(四):Event、Handler和Pipeline
Netty网络编程(四):Event、Handler和Pipeline
81 0