Netty 編碼
業務裏的數據最終需要通過socket寫回到客戶端,我們寫的業務方法都是面向對象來進行編碼的,而channel底層傳輸的是字節,Netty通過定義encoder來完成對象到字節的轉換。自定義的encode可以通過繼承MessageToByteEncoder(encoder也是ChannelHandler),下面是MessageToByteEncoder的處理流程。- 匹配對象的細節如下:
- 分配ByteBuf內存:
HeadContext寫入數據
我們知道通過channelHandle寫入的數據最終會傳入到HeadContext的write方法裏,下面來看看HeadContext是如何處理這個過程的。
write過程
- 調用unsafe對象執行寫入操作:
- driect化ByteBuf並插入寫隊列
- 通過AbstractNioByteChannel類的filterOutboundMessage方法將byteBuf轉成direct類型
- 通過ChannelOutboundBuffer類插入寫隊列
- 修改可寫狀態
flush過程
- flsuh過程的入口
- 列新outboundBuffer的數據
- 調用channel的doWrite方法
- 調用jdk底層API進行自旋寫
-
對ChannelOutboundBuffer緩存節點進行維護
總結:Netty的寫入過程可以分爲write與flush,通過ChannelOutboundBuffer對需要寫入的數據進行緩存,在ChannelOutboundBuffer裏,可以寫入的數據都是direct類型的byteBuf。在默認情況下,如果有超過64Kb的數據沒有flush,會通知channelHandler無法寫入新的數據。