Netty 基本組件小結--Channel、EventLoop、Bootstrap等

1、什麼是Channel?

Channel按照其字面意思很是容易理解,那就是"管道"。自來水通遍千家萬戶須要架設管道,暖氣也須要架設管道,一樣,網絡通訊也須要架設管道,這個管道就是咱們的Socket。咱們發現,自來水管道中流通的是自來水,暖氣管道中流通的是暖氣,那麼Socket中流通的當屬咱們的字節流了。網絡

說了這麼多,那麼到底什麼是Channel呢?小編理解,Channel就是鏈接網絡Socket和具備read, write, connect, and bind能力的組件的一條通道。多線程

一個Channel一般擁有下面幾種屬性:異步

  • 一、Channel 自己組件的狀態state,好比說是否是處於打開open狀態,是否處於鏈接connected狀態
  • 二、Channel 自己將會跟一個ChannelConfig對象相關聯,用於對該Channel進行配置,好比接收緩衝區的大小
  • 三、Channel 自己將會跟一個ChannelPipeline對象相關聯,用於處理I/O事件events

Netty 中的 Channel 在Java NIO基礎之上封裝了更多的操做。在 Netty 中,全部的I/O操做都是異步的。這意味着咱們不能在調用I/O操做以後當即獲得I/O操做的結果,所以Netty中提供了一個ChannelFuture,每次調用異步I/O以後會返回該對象。工具

在 Netty 中,Channel是具備繼承結構的,咱們能夠經過調用Channel的parent()方法獲取,parent()方法的返回取決於該Channel是怎麼建立出來的。好比一個SocketChannel由一個ServerSocketChannel接收,所以當調用SocketChannelparent()方法時將返回ServerSocketChanneloop

每次當處理完Channel操做時,咱們應該顯式調用其close()close(ChannelPromise)對資源進行釋放,這將確保全部資源都以正確的方式釋放掉~操作系統

2、Netty中Channel的類型有哪些?分別有什麼做用?

總的來講,不一樣的協議,不一樣用途會對應不一樣類型的Channel。下面貼出Channel的接口繼承圖:線程

  • 一、UnixChannel :此類Channel只暴露一些在Unix類操做系統上面纔會有的操做
  • 二、DatagramChannel :一個處理UDP/IP協議的 Channel
  • 三、DuplexChannel :一個擁有兩個端點並能在每一個端點獨立關閉的全雙工Channel
  • 四、Http2StreamChannel :支持HTTP/2協議的 Channel
  • 五、SctpChannel :一個處理SCTP/IP協議的Channel
  • 六、ServerChannel :一個接收新鏈接而後建立子Channel的Channel組件,ServerSocketChannel就是一個很好的例子,ServerSocketChannel接受鏈接,而後建立出SocketChannel

3、Netty中Channel和EventLoopGroup、EventLoop之間的關係

一個EventLoop是一條單純的線程,用於處理註冊在其上面的全部I/O事件,也就是說,Channel是須要註冊到EventLoop上面去的,並且一個EventLoop一般會有多個Channel註冊,而EventLoopGroup則是EventLoop的集合。3d

4、Netty中EventLoop等事件線程組件繼承圖

小編貼出一張簡單的繼承圖,以下所示:指針

從圖中其實能夠發現,Netty中線程模型基本上就是從一個叫EventExecutorGroupEventExecutorGroup繼承了JDK中的ScheduledExecutorService接口,所以在Netty中咱們能夠利用它作一些定時任務之類的配置。code

  • 一、EventExecutorGroup:負責經過其next()方法來建立一系列的EventExecutor,除此以外,也負責管理其建立的EventExecutor生命週期並提供全局關閉方法。
  • 二、EventLoopGroup是一個特殊的EventExecutorGroup,主要用於註冊Channel以便後續在事件循環中使用
  • 三、EventExecutor是一個特殊的EventExecutorGroup,它提供一些便捷的方法用來判斷一個線程是否在一個EnentLoop中執行
  • 四、MultithreadEventExecutorGroup顧名思義,就是容許任務在多線程中去執行

5、Netty中的Bootstrap家族

其實Netty中的Bootstrap啓動類家族不是很龐大,至關於工具類吧!BootstrapServerBootstrap屬於上面第二章節說到的ServerChannel範疇,總共有3個大類,類圖以下:

  • 一、Bootstrap:用於爲客戶端打開一條通道Channel,一般bind()方法用於建立一個基於UDP的無狀態的連接,對於一般的TCP連接,咱們則使用其connect()方法建立
  • 二、ServerBootStrap:用於在服務端中打開一個ServerChannel

6、Netty中的ChannelHandler

ChannelHandler能夠用來處理I/O事件或者用於接收I/O操做,並將指針指向ChannelPipeline中的下一個Handler。其中ChannelPipelineChannelHandler提供了一個容器。

ChannelInboundHandler用於爲狀態(open close connect)的更改設置相應的回調操做,簡而言之,ChannelInboundHandler攔截和處理入站事件,ChannelOutboundHandler攔截和處理出站事件.

相關文章
相關標籤/搜索