1. 概述
Netty 是由JBOSS 提供的一個Java 開源架構。Netty 提供異步的、基于事件驅動的網絡應用程式架構,用以快速開發高性能、高可靠性的網絡IO 程式。
Netty 是一個基于NIO 的網絡程式設計架構,使用Netty 可以幫助你快速、簡單的開發出一個網絡應用,相當于簡化和流程化了NIO 的開發過程。作為目前最流行的NIO 架構,Netty 在網際網路領域、大資料分布式計算領域、遊戲行業、通信行業等獲得了廣泛的應用,知名的Elasticsearch 、Dubbo 架構内部都采用了Netty。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAjM2EzLcd3LcJzLcJzdllmVldWYtl2Pn5GcuUWMkRGM3M2NmV2NlJDNhNmYyQmNwQGZ2cDN4M2YlljYvwVN1QjM1MTMtUGall3LcVmdhNXLwRHdo9CXt92YucWbpRWdvx2Yx5yazF2Lc9CX6MHc0RHaiojIsJye.png)
image.png
2. netty整體設計
2.1 線程模型
單線程模型
伺服器端用一個線程通過多路複用搞定所有的IO 操作(包括連接配接,讀、寫等),編碼簡單,清晰明了,但是如果用戶端連接配接數量較多,将無法支撐,咱們前面的NIO 案例就屬于這種模型。
image.png
線程池模型
伺服器端采用一個線程專門處理用戶端連接配接請求,采用一個線程池負責IO 操作。在絕大多數場景下,該模型都能滿足使用。
image.png
Netty模型
image.png
比較類似于上面的線程池模型,Netty 抽象出兩組線程池,BossGroup 專門負責接收用戶端連接配接,WorkerGroup 專門負責網絡讀寫操作。NioEventLoop 表示一個不斷循環執行處理任務的線程,每個NioEventLoop 都有一個selector,用于監聽綁定在其上的socket 網絡通道。NioEventLoop 内部采用串行化設計,從消息的讀取->解碼->處理->編碼->發送,始終由IO 線程NioEventLoop 負責。
- 一個NioEventLoopGroup 下包含多個NioEventLoop
- 每個NioEventLoop 中包含有一個Selector,一個taskQueue
- 每個NioEventLoop 的Selector 上可以注冊監聽多個NioChannel
- 每個NioChannel 隻會綁定在唯一的NioEventLoop 上
- 每個NioChannel 都綁定有一個自己的ChannelPipeline
2.2 異步模型
FUTURE, CALLBACK 和HANDLER
image.png
Netty 的異步模型是建立在future 和callback 的之上的。callback 大家都比較熟悉了,這裡重點說說Future,它的核心思想是:假設一個方法fun,計算過程可能非常耗時,等待fun傳回顯然不合适。那麼可以在調用fun 的時候,立馬傳回一個Future,後續可以通過Future去監控方法fun 的處理過程。在使用Netty 進行程式設計時,攔截操作和轉換出入站資料隻需要您提供callback 或利用future 即可。這使得鍊式操作簡單、高效, 并有利于編寫可重用的、通用的代碼。Netty 架構的目标就是讓你的業務邏輯從網絡基礎應用編碼中分離出來、解脫出來。