netty的編/解碼器有什麼分類背景(netty-in-action中沒有對此部分詳細陳述)?
解碼器分為以下三種:
- 解碼位元組到消息
- 解碼消息到消息
- 解碼消息到位元組
編碼器分為以下兩種:
- 消息對象編碼成消息對象
- 消息對象編碼成位元組碼
您好,在這裡我們可以發現,在Netty中,ChannelHandler實際上分為兩個定向類型,即入站的(inbound)和出站的(outbound),如果我們套用類型系統,就可以放心這裡其實是個sum type,即ChannelHandler擁有 ChannelInboundHandler 和 ChannelOutboundHandler這兩個子介面。
進一步,入站方向的,即解碼器,都繼承了 ChannelInboundHandlerAdapter ,而出站方向的,即編碼器,都繼承了 ChannelOutboundHandlerAdater。
至於為何會有這樣的分類,其實很簡單,首先,在網路上傳輸的數據都是位元組,其次在我們Java中處理的都是對象,也就是Bean。
那麼就有 位元組數據 和 對象的相互轉換,以及對象和對象的相互轉化了。這也就是 Netty 中為何有
ByteToMessage、MessageToByte 以及 MessageToMessage。
實際上,我們如果把他們看做是一個函數的話,比如在Akka Stream中,無論是編碼器還是解碼器,我們都可以看做是Function1[A,B],即Flow&
所以整體來說,Netty中這樣的劃分,主要是:
1. 出於對兩種轉換的抽象
2. 出於對編程模型的簡化
如果真的是全函數式的思維,那麼就是上面這種了,心智負擔就稍微大了一些。
至於上面提到的Akka,推薦:
《Akka 入門與實踐》 —— 入門,本書是入門的 Akka 書,可以保證您快速地上手 Akka,譯者也是摩根的大牛,清華高材生,雖然只是入門書。
推薦閱讀:
※如何評價《Netty實戰》這本書?
※關於應用層解決拆包粘包問題?
※通俗地講,Netty 能做什麼?
※Netty的Reactor線程組中的每個Reactor線程處理網路I/O為什麼一定要串列化,並行化不是更能提高系統吞吐量嗎?
※為什麼nio效率會比bio高?