偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

談談你對Netty中,Pipeline工作原理的理解?

開發(fā) 前端
每個Context中又會包含一個ChannelHandler,我們通過addLast()方法往Pipeline中添加的對象,并且Handler的添加順序會影響代碼的執(zhí)行順序。而這些Handler本質上都是實現(xiàn)編碼和解碼的功能,不管是編碼器還是解碼器都必須實現(xiàn)ChannelHandler接口。

1位工作8年的小伙伴,去某東面試IM部門,被問到這樣一道面試題。說,請你談一談你對Netty Pipeline設計原理的理解。當時,他說只是用過Netty的Pipline,原理沒有深入了解過,然后就沒有然后了。

今天,我給大家講一講,我對Netty Pipeline的理解。

1、結構設計

Netty中的Pipeline本質上是一個雙向鏈表,它采用了責任鏈模式。在Netty中每個Channel都有且僅有一個ChannelPipeline與之對應,它們的組成關系如下圖所示。

圖片

NEW

通過上圖可以看到,一個Channel包含了一個ChannelPipeline,而ChannelPipeline中又維護了一個由ChannelHandlerContext組成的雙向鏈表。這個鏈表的頭叫HeadContext,鏈表的尾叫TailContext,并且每個ChannelHandlerContext中又關聯(lián)著一個ChannelHandler。

2、工作原理

首先來看這樣一段代碼:

圖片

NEW

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。如圖所示:

圖片

NEW

每個Context中又會包含一個ChannelHandler,我們通過addLast()方法往Pipeline中添加的對象,并且Handler的添加順序會影響代碼的執(zhí)行順序。而這些Handler本質上都是實現(xiàn)編碼和解碼的功能,不管是編碼器還是解碼器都必須實現(xiàn)ChannelHandler接口。

圖中的Handler就是我們代碼程序要執(zhí)行的邏輯。而Netty默認幫我們實現(xiàn)了非常多內置Handler,我們只需要直接拿過來用就可以了。當然,我們也可以自己實現(xiàn)ChannelHandler接口,來實現(xiàn)自定義的編、碼器。比如自定義通信協(xié)議等等。

當所有的Handler全部添加到Pipeline中以后,Netty就會將這些Handler組裝成一個雙向鏈表,從而實現(xiàn)串行化調用。從頭部往尾部執(zhí)行的Handler被稱為Inbound,用來接收用戶請求,從尾部往頭部執(zhí)行的Handler被稱為Outbound,用來給用戶響應。所以,Inbound可以用來實現(xiàn)解碼的功能、而Outbound可以用來實現(xiàn)編碼的功能。

好了,以上就是我對Pipeline設計原理的理解。

責任編輯:武曉燕 來源: Tom彈架構
相關推薦

2022-10-09 15:18:31

SwaggerOpenAPI工具

2022-08-14 07:14:50

Kafka零拷貝

2023-11-28 12:25:02

多線程安全

2022-06-30 09:10:33

NoSQLHBaseRedis

2022-09-23 11:00:27

KafkaZookeeper機制

2024-05-31 08:10:58

Netty線程模型多路復用模型

2021-07-16 07:57:34

ReduxDOM組件

2022-08-26 00:02:03

RocketMQ單體架構MQ

2024-09-02 16:10:19

vue2前端

2022-08-29 16:03:33

狀態(tài)流轉Java

2024-09-20 05:46:00

2024-09-11 16:49:55

2022-09-19 07:57:59

云服務互聯(lián)網(wǎng)基礎設施

2022-09-28 16:37:59

SpringMVC框架

2022-09-09 10:15:06

OAuthJava

2025-03-07 00:11:00

JWTJSONSession

2024-12-06 14:34:00

Spring過濾器

2024-09-27 15:43:52

零拷貝DMAIO

2025-02-21 15:25:54

虛擬線程輕量級

2025-08-18 00:00:00

零拷貝系統(tǒng)調用函數(shù)
點贊
收藏

51CTO技術棧公眾號