Netty 編碼與資料的寫入
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無法寫入新的資料。