channel是NIO中的Socket通道,而pipeline呢從字面理解,也是數據流通的管道。這2個東東,在新人眼裡還是不容易理解的。為何有了channel管道了,又搞個pipeline是幹啥呢?
其實channel就是通道,維護socket上IO的write、read、connect等相關操作。
另外,Netty中Channel接口中還包含了一個子接口:Unsafe;這個名字看起來有點奇葩吧,這個Unsafe和JDK的Unsafe沒半毛錢關系,不要混起來。從字面理解,既然是Unsafe,哪肯定不能給外面的用戶用,畢竟不安全的嗎,這玩意自己内部用用就好了。它主要用來操作底層的Socket,比如connect、close、read、write。這Socket底層操作,Channel直接操作不就行了,再整個Unsafe出來幹嘛?小編認為這是為了軟件的解耦,比如在一個公司,一個經理,他會吩咐一個爪牙來跟下面的人溝通,而不是自己直接出面。軟件中也是一樣,很多功能不是自己胡子眉毛一把抓,盡量把功能分割出來,讓不同的模塊去完成。
下面,我們來看下Netty中Channel和Unsafe的類圖:
圖1 Netty中的channel類圖
看起來很複雜,簡直讓人頭爆,是吧?這就對了,軟件不是簡單地寫個hello world就夠了,一個設計優秀的軟件,不光要考慮當前的功能,還要考慮性能和以後的擴展。
圖2 Netty中的Unsafe類圖
Channel講完了,Channel的爪牙Unsafe也了解了,下面讓我們來看看pipeline吧,這玩意到底有啥用?
程序簡單說就是數據和對數據的處理,這數據傳到了channel,肯定要做處理的。而且這處理方法還多種多樣,衆口難調呢。比如,他要紅燒,他要清蒸,他要碳烤... ...現在,我把這些方法都寫到channel裡,哪可就麻煩了。一是這個channel功能過于龐雜,難堪了;二是數據處理功能需要靈活添加或删除,這channel再來搞這個功能,恐怕也不方便。于是,爪牙又現身了,把這些任務交給pipeline來幹吧。其實pipeline可以稱之為pipeline模型,它有pipeline, context, handler組成。這pipeline模型呢,就是用來處理channel中流動的數據的。
圖3 pipeline對數據的處理
最後,小編再簡單總結下:
1)channel就是socket通道,用于維護socket上IO的read, write, connect等操作;而這些IO的底層操作呢,在Netty中是通過Unsafe這個不能被外部用戶訪問的類來完成的。
2)pipeline是一個數據處理模型,用來處理channel中的數據。它采用一種叫責任鍊的模式來順序處理流過的數據。
3)一個是底層通道,一個是對通道中流通的數據的處理模型,其他2個根本就是差别很大的東東。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!