Netty入門
1、簡介
Netty是一個非同步事件驅動的網路應用程式框架用於快速開發可維護的高效能協議伺服器和客戶端。Netty是一個NIO客戶端伺服器框架,可以快速輕鬆地開發協議伺服器和客戶端等網路應用程式。 它極大地簡化並簡化了TCP和UDP套接字伺服器等網路程式設計。Netty經過精心設計,具有豐富的協議,如FTP,SMTP,HTTP以及各種二進位制和基於文字的傳統協議。 架構圖如下:
(1)適用於各種傳輸型別的統一API - 阻塞和非阻塞套接字
(2)基於靈活且可擴充套件的事件模型,可以清晰地分離關注點
(3)高度可定製的執行緒模型 - 單執行緒,一個或多個執行緒池,如SEDA
(4)真正的無連線資料包套接字支援(自3.1起)
3、效能
吞吐量更高,延遲更低
減少資源消耗
最小化不必要的記憶體複製
4、安全
完全支援SSL/TSL
5、Netty執行緒模型
netty執行緒模型採用“服務端監聽執行緒”和“IO執行緒”分離的方式,與多執行緒Reactor模型類似。
5.1 序列化設計避免執行緒競爭
Netty採用了序列化設計理念,從訊息的讀取、編碼以及後續Handler的執行,始終都由IO執行緒NioEventLoop負責,這就意外著整個流程不會進行執行緒上下文的切換,資料也不會面臨被併發修改的風險,對於使用者而言,甚至不需要了解Netty的執行緒細節。
一個NioEventLoop聚合了一個多路複用器Selector,因此可以處理成百上千的客戶端連線,Netty的處理策略是每當有一個新的客戶端接入,則從NioEventLoop執行緒組中順序獲取一個可用的NioEventLoop,當到達陣列上限之後,重新返回到0,通過這種方式,可以基本保證各個NioEventLoop的負載均衡。一個客戶端連線只註冊到一個NioEventLoop上,這樣就避免了多個IO執行緒去併發操作它。
5.2 定時任務與時間輪演算法
在Netty中,有很多功能依賴定時任務,比較典型的有兩種:
(1)客戶端連線超時控制;
(2)鏈路空閒檢測。
6、Reactor模型
- 6.1 單執行緒模型
Reactor單執行緒模型,指的是所有的IO操作都在同一個NIO執行緒上面完成,NIO執行緒的職責如下:
1)作為NIO服務端,接收客戶端的TCP連線;
2)作為NIO客戶端,向服務端發起TCP連線;
3)讀取通訊對端的請求或者應答訊息;
4)向通訊對端傳送訊息請求或者應答訊息。
Reactor單執行緒模型示意圖如下所示:
- 6.2 多執行緒模型
Rector多執行緒模型與單執行緒模型最大的區別就是有一組NIO執行緒處理IO操作。
Reactor多執行緒模型的特點:
1)有專門一個NIO執行緒-Acceptor執行緒用於監聽服務端,接收客戶端的TCP連線請求;
2)網路IO操作-讀、寫等由一個NIO執行緒池負責,執行緒池可以採用標準的JDK執行緒池實現,它包含一個任務佇列和N個可用的執行緒,由這些NIO執行緒負責訊息的讀取、解碼、編碼和傳送;
Reactor多執行緒模型示意圖如下所示:
- 6.3 主從多執行緒模型
主從Reactor執行緒模型的特點:
服務端用於接收客戶端連線的不再是個1個單獨的NIO執行緒,而是一個獨立的NIO執行緒池。Acceptor接收到客戶端TCP連線請求處理完成後(可能包含接入認證等),將新建立的SocketChannel註冊到IO執行緒池(sub reactor執行緒池)的某個IO執行緒上,由它負責SocketChannel的讀寫和編解碼工作。Acceptor執行緒池僅僅只用於客戶端的登陸、握手和安全認證,一旦鏈路建立成功,就將鏈路註冊到後端subReactor執行緒池的IO執行緒上,由IO執行緒負責後續的IO操作。
執行緒模型如下圖所示:
參考: (1) www.infoq.com/cn/articles…
(2) netty.io/