Netty
異步事件驅動的網絡應用程序框架。
特點
- 高並發
- 通過Reactor模型基於NIO開發的網絡通信框架
- 傳輸快
- 零拷貝
- Netty的接受和發送bytebuffer使用堆外直接內存進行socket讀寫,傳統堆內存進行socket讀寫,JVM將堆內存buffer拷貝到內存,然后寫入socket。相比之下,消息在發送多了一次緩沖區的內存拷貝。
- Netty提供buffer,聚合多個bytebuffer。傳統通過內存拷貝將多個小buffer合並大的buffer。
- Netty文件傳輸使用transferto,直接將文件緩沖區的數據發送到目標channel。傳統通過循環write導致內存拷貝。
- 零拷貝
- 使用簡單
- 封裝NIO,提供調用接口
- 功能強大
- 預置多種編解碼功能
- 支持多種主流協議
- 通過channelhandler對通信框架擴展
- 性能高
- IO線程模型
- 內存零拷貝
- 內存池設計
- 串行化處理讀寫
- 高性能序列化協議
- 穩定
- 修復所有NIO bug
- epoll bug,導致selector空輪詢,最終導致CPU100%
- 修復所有NIO bug
應用場景
- RPC框架實現的基礎通信組件,用於各進程節點間的內部通信
- 定制私有協議棧,Netty提供TCP/UDP和HTTP協議棧
- 跨界點通信
發送消息方式
- 直接寫入channel,消息從channelpipeline的尾部移動
- 寫入channelhandler綁定的channelhandlercontext,消息從channelpipeline的下一個channelhandler移動
事件驅動模型
- 輪詢
- 事件驅動方式。boss線程和work線程,boss線程把事件放入事件隊列,work線程消費事件隊列中的事件,調用對應的handler處理事件。
Reactor線程模型
單Reactor單線程
單Reactor多線程
一個線程負責監聽服務端,接受客戶端TCP連接請求;一個線程同時處理多條鏈路,一個鏈路只對應一個線程
主從Reactor多線程
服務器Netty工作架構
每個端口對應一個boss線程