netty

launch發表於2024-10-07

目錄
1為什麼Netty 會誕生 1
2說說netty是什麼? 1
3為什麼使用netty? 1
4netty可以用來做什麼事情? 1
5netty的核心元件瞭解嗎?分別有什麼作用? 2
5.1網路通訊層有三個核心元件,Bootstrap、ServerBootStrap、Channel。 2
6說說Netty 有幾種執行緒模型吧? 2
6.1談談你對這三種執行緒Reactor模型的理解?原理?分別起到什麼作用? 3

1為什麼Netty 會誕生
為了解決NI0 編碼複雜,但是又想使用NIO,所以netty來了,netty 透過對nio複雜的api進行了封裝,使得netty在具備高效能、高吞吐量、低延遲的前提下,還能方便開發人員進行快速開發。

2說說netty是什麼?
Netty是一個基於NIO模型的高效能網路通訊框架。其實可以認為是對NIO網路模型的封裝,提供了簡單易用的api,我們可以利用這樣一些封裝好的api去快速開發自己的網路程式,netty在NIO的基礎上做了很多最佳化,比如零複製機制,高效能無鎖佇列,記憶體池,因此效能要比nio要高。Netty可以支援多種通訊協議,比如http,websocket協議,並且針對資料通訊,拆包粘包的一些問題,內建了拆包策略,所以我們在整個使用過程中非常方便。

3為什麼使用netty?
Netty相對於直接去使用jdk自帶的nio相關的api來說,會更加簡單,具備一些特點:
第一, 統一的api,支援多種傳輸型別,比如阻塞,非阻塞,以及epoll,poll等模型。
第二, 可以使用非常少的程式碼來實現。多執行緒reactor模型以及主從多執行緒reactor模型。
第三, 自帶編解碼器,去解決tcp粘包,拆包的問題。
第四, 自帶各種通訊協議。
第五, 相對於自己使用java庫裡面的nio的話,它提供了一個更高的吞吐量,以及更低的延遲,更低的資源消耗和更少的記憶體複製。
第六, 安全性很好,有完整的ssl/tls的支援,
第七, 社群活躍度非常好,版本迭代非常穩定。經歷了各種大的專案的考驗,比如dubbo、zookeeper、rocketMQ,他們都有用到netty
4netty可以用來做什麼事情?
我們之所以要用netty,核心的點還是解決伺服器如何去承載更多的使用者同時訪問的問題,傳統的bio模型,由於他阻塞的一個特性,使得我們在高併發的場景中很難去支援更高的吞吐量,後來我們去基於nio多路複用模型。雖然可以在阻塞方面進行最佳化,但是他的api使用比較複雜,對於初學者來說不是特別友好,而netty是基於nio的一個封裝,提供了成熟簡單易用的api,降低了使用成本和學習成本。
本質上來說,netty和nio所扮演的角色是相同的,都是為了去提升服務端的吞吐量,讓使用者獲得更好的產品體驗。另外,netty這個中介軟體經歷了很多年的考證,本質上來說netty和nio所扮演的角色是一樣的,都是為了更好的使用者的產品體驗。
5netty的核心元件瞭解嗎?分別有什麼作用?
Netty是由三層結構構成的,網路通訊層,事件排程層,服務編排層。
5.1網路通訊層有三個核心元件,Bootstrap、ServerBootStrap、Channel。
Bootstrap呢負責客戶端啟動,並且去連線遠端的nettyServer,而serverBootStrap是為了負責服務端的監聽,用來監聽指定的一個埠,channel呢是網路通訊的一個載體(事件排程器),事件排程器有兩個核心角色,EventLoopCroup與EventLoop。
EventLoopGroup呢本上是一個執行緒池,主要去負責接收IO請求,並分配執行緒去執行處理請求。
EventLoop是相對於執行緒池裡面的一個具體執行緒,在服務編排層呢有三個核心元件,ChannelPipeline,ChannelHandle以及 channelHandlerContext。

ChannelPipeline是負責處理多個Channelhandler。他會把多個Channelhandler的構成一個鏈,去形成一個PipeLine。

ChannelHandle呢主要是針對 IO 資料的一個處理器,資料處理接收。資料接收後呢,透過指定的一個Handler進行處理。

ChannelHandleContext是用來去儲存ChannelHandler的一個上下文資訊的

6說說Netty 有幾種執行緒模型吧?
Netty提供了三種reactor模型的一個支援,第一種是單執行緒單Reactor模型,第二種是 多執行緒單Reactor模型,第三種是多執行緒多Reactor模型,也叫主從多執行緒Reactor模型。

6.1談談你對這三種執行緒Reactor模型的理解?原理?分別起到什麼作用?
Reactor他有三個重要的元件,第一個是reactor是負責將io事件,分派給對應的handler。第二個是acceptor,他是處理客戶端的連線請求。第三個是handlers,去執行我們的業務邏輯的讀寫操作。這是最基本的reactor的模型元件。

連線進來到io事件處理都是一個執行緒來處理的、單執行緒但reactor模型

多執行緒單reactor模型。

單reactoe多執行緒模型,所有的業務場景都由reactor來處理io,小容量場景沒什麼問題,高併發情況下,很容易會因為單reactor的阻塞或者帶來的一個效能瓶頸。導致整個吞吐量有影響。所以當這個執行緒的超過負載之後,處理速度會變慢,就會導致大量客戶端連線超時,超時以後就會重發,這反而加重了這個執行緒的一個負載,最終會導致大量的訊息的積壓和處理的超時,成為了整個系統的效能瓶頸。所以我們還可以進行進一步的最佳化,也就是引入多執行緒多reactor模型,所謂多執行緒多reactor模型也叫做
主從模型。MainReactor它是負責接收客戶的連線請求。然後把接受的請求傳遞給subReactor,其中subReactor我們可以配置多個。這樣的話我們可以進行靈活的擴容和縮容。具體的業務io由subReactor去完成,最終去繫結給對應的handler,那麼subreactor他還是扮演一個請求。接收者沒有發生變化。那麼subreactor他還是會扮演一個請求,接收者沒有任何變化,他會把接受的請求呢,轉發到mainReactor來處理,MainReactor再去交給subreactor來進行真正意義上的分發。

相關文章