歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Netty的ChannelPipeline

1、如何理解Netty的ChannelPipeline

在Netty中,每個Channel被創建的時候都需要被關聯一個對應的pipeline(通道),這種關聯關系是永久的(整個程序運行的生命周期中)。ChannelPipeline可以理解成一個消息( 或消息事件,ChanelEvent)流轉的通道,在這個通道中可以被附上許多用來處理消息的handler,當消息在這個通道中流轉的時候,如果有與這個消息類型相對應的handler,就會觸發這個handler去執行相應的動作。它實現了Intercepting Filter模式(個人理解與Filter Chain模式類似)。

可以通過下面這句話來理解一些相關的概念:ChannelEvents are processed by ChannelHandlers in a ChannelPipeline

2、ChannelPipeline的創建方式

Netty的作者建議采用輔助類org.jboss.netty.channel.Channels的靜態無參函數pipeline來創建一個ChannelPipeline對象,從源代碼上看其實就是調用了DefaultChannelPipeline的無參構造函數,返回new出來的對象而已。

3、消息的流轉

Netty中消息的流轉有兩個方向:上行、下行

因此,處理消息事件(ChannelEvent)的處理器(ChannelHandler)大致可以分為兩個方向:ChannelUpstreamHandler、ChannelDownstreamHandler

* I/O Request

* via {@link Channel} or * {@link ChannelHandlerContext} * | * +----------------------------------------+--------------- + * | ChannelPipeline | | * | \|/ | * | + ----------------------+ +----------- +------------+ | * | | Upstream Handler N | | Downstream Handler 1 | | * | + ----------+----------- + +-----------+ ------------+ | * | /|\ | | * | | \|/ | * | + ----------+----------- + +-----------+ ------------+ | * | | Upstream Handler N -1 | | Downstream Handler 2 | | * | + ----------+----------- + +-----------+ ------------+ | * | /|\ . | * | . . | * | [ sendUpstream() ] [ sendDownstream() ] | * | [ + INBOUND data ] [ + OUTBOUND data ] | * | . . | * | . \|/ | * | + ----------+----------- + +-----------+ ------------+ | * | | Upstream Handler 2 | | Downstream Handler M -1 | | * | + ----------+----------- + +-----------+ ------------+ | * | /|\ | | * | | \|/ | * | + ----------+----------- + +-----------+ ------------+ | * | | Upstream Handler 1 | | Downstream Handler M | | * | + ----------+----------- + +-----------+ ------------+ | * | /|\ | | * +-------------+ --------------------------+--------------- + * | \|/ * +-------------+ --------------------------+--------------- + * | | | | * | [ Socket.read() ] [ Socket.write() ] | * | | * | Netty Internal I/O Threads (Transport Implementation) | * +--------------------------------------------------------+

以upstream為例,從socket讀出來的數據,逐漸往上進行傳遞,即原始數據依次往上被進行解析,可能因為所需要的業務數據外面包裹著許多其它附加的數據。如加密、驗證、簽名等。

downstream與此相反,即把業務數據進行一層層地加密、簽名等處理後,寫到socket中發出去。這個模型其實可以參考(TCP的七層模型)

4 、pipeline中的handlers順序如何理解

在添加handler的時候,如果理解順序。可以把pipeline理解成一個隊列,addLast是添加到隊列的尾部,addFirst是添加到隊列的頭部。

upstream的方向是從頭到尾,downstream的方向是從尾到頭。

Netty 的詳細介紹:請點這裡
Netty 的下載地址:請點這裡

Copyright © Linux教程網 All Rights Reserved