學習資料
https://juejin.im/book/5b4bc28bf265da0f60130116/section/5b6a1a9cf265da0f87595521
收獲:
轉載
1. Netty 是什么? 經過我們整個小冊的學習,我們可以了解到,Netty 其實可以看做是對 BIO 和 NIO 的封裝,並提供良好的 IO 讀寫相關的 API,另外還提供了非常多的開箱即用的 handler,工具類等等。
2. 服務端和客戶端啟動 Netty 提供了兩大啟動輔助類,ServerBootstrap 和 Bootstrap, 他們的啟動參數類似,都是分為 配置 IO 類型,配置線程模型。 配置 TCP 參數,attr 屬性。 配置 handler。server 端除了配置 handler,還需要配置 childHandler,他是定義每條連接的處理器。
3. ByteBuf 接着,我們又學習了 Netty 對二進制數據的抽象類 ByteBuf,ByteBuf 底層又可以細分為堆內存和堆外內存,它的 API 要比 jdk 提供的 ByteBuffer 要更好用,ByteBuf 所有的操作其實都是基於讀指針和寫指針來進行操作的,把申請到的一塊內存划分為可讀區、可寫區,另外還提供了自動擴容的功能。
4. 自定義協議拆包與編解碼 通常,我們要實現客戶端與服務端的通信,需要自定義協議,說白了就是雙方商量在字節流里面,對應位置的字節段分別表示什么含義。 我們用的最多的協議呢就是基於長度的協議,一個協議數據包里面包含了一個長度字段,我們在解析的時候,首先第一步就是從字節流里面根據自定義協議截取出一個個數據包,使用的最多的拆包器就是 LengthFieldBasedFrameDecoder,只需要給他配置一些參數,即可實現自動拆包。 拆包之后呢,我們就拿到了代表字節流區段的一個個 ByteBuf,我們的解碼器的作用就是把這些個 ByteBuf 變成一個個 java 對象,這樣我們后續的 handler 就可以進行相應的邏輯的處理。
5. handler 與 pipeline Netty 對邏輯處理流的處理其實和 TCP 協議棧的思路非常類似,分為輸入和輸出,也就是 inBound 和 outBound 類型的 handler,inBound 類 handler 的添加順序與事件傳播的順序相同,而 outBound 類 handler 的添加順序與事件傳播的順序相反,這里一定要注意。 無狀態的 handler 可以改造為單例模式,但是千萬記得要加 @ChannelHandler.Sharable 注... https://juejin.im 掘金 — 一個幫助開發者成長的社區
需要掌握的東西有以下
netty的整體架構:
線程模型:主從reactor模型
https://mrdear.cn/2018/08/07/framework/netty/netty--reactor_model/
netty的核心組件:
- Channel:表示客戶端與服務端建立起的連接通道
- EventLoop:不斷的循環多路復用器中事件的一個Reactor線程,對於NIO多路復用器則為
java.nio.channels.Selector - ChannelPipeline:業務邏輯執行鏈封裝,比如對消息的decode,compute,encode等
這三個實現也是Netty線程模型的核心,接下來逐一分析。
不同場景的可解決方案:
