java中的Channel抽象
三層抽象

- 第一層:Channel層只是抽象了channel最頂層的兩個方法
- 第二層:可選的Channel抽象,只抽象了Channel跟Selector的交互
- 第三層:直接的具體抽象,以Socket為例,SocketChannel是用戶讀寫數據的,ServerSocketChannel是用於創建SocketChannel,所以兩者其實看起來沒有啥可公共抽象的
Netty中的Channel抽象
四層抽象

- 第一層:channel層抽象抽象了所有Channel的公共行為,不管是客戶端服務端。包含的是Netty本身設計的一些抽象,比如Channel會有id,每個Channel都會綁定一個EventLoop、一個ChannelPipeline、一個ChannelConfig,底層使用Unsafe進行實際傳輸。
- 第二層:NIO抽象對NIO層的行為進行抽象,比如NIO都會有一個SelectableChannel進行實際處理,都會得到一個SelectionKey
- 第三層:讀寫層抽象,這里已經限定在了NIO中,以Socket為例:客戶端讀寫的是ByteBuffer,服務端用於接受鏈接,可以抽象成讀到的是Channel,因此分為了實際數據的讀寫的Channel和讀取消息的服務端Channel,比如在NIO的服務端,讀取的消息就是創建的Channel。
- 第四層:具體實現消息讀寫、連接、綁定等
總結
- 從宏觀上理解,Netty的Channel更具業務能力,我們在很多地方可以直接傳遞Channel,就可以直接得到關聯的組件。同時,他的分層也比較適合層層遞進,從全局Channel到NIO層抽象,再到讀寫層,再到具體應用,每一層的抽象極致復用到下一層。
- Java本身的抽象,在具體實現層承載了幾乎全部的實際Channel能力,沒有在客戶端服務端上進行抽象。
- Netty的讀寫層抽象得益於一個巧妙的想法:服務端讀取的是Channel,客戶端讀取的是ByteBuffer,可以抽象層出都是讀取消息
- Netty的Channel是依賴與Java的Channel的,本身還是只是封裝
