主管:這個版塊用Netty框架就可以了呀,不會嗎?
(此時,公司CTO路過)
某程式員:這個我真不會...
主管:好了好了,那這一塊我交給別人去做,這個也不難啊?!
某程式員:大佬,我一定會好好學習,早日把這一塊弄懂!
主管:行了,你先去忙吧!
CTO:慢著!這是什么情況?專案分配下去了,怎么能又安排其他同事來加班做呢?
主管:總監,專案這個版塊涉及到高性能的開發,這個同事可能搞不定,眼看著專案要上線了,還是讓經驗豐富的工程師來做吧!
CTO(兇狠的對著程式員):那也不行,拿著這么高的工資,這都做不了,Netty都不會用,你怎么好意思拿20K的?
某程式員(委屈地):大佬,我每個月只有8K...
CTO:...哦,算了,當我沒來

我不記得是誰跟我說過,“十個高性能,九個用Netty”,我也不知道是騙我的還是咋的...
Netty到底有這么重要嗎?
我翻閱了一下我手中的各大廠面試真題,問BIO、NIO、異步這一塊的也有,Netty出現的頻次不算很高,也許我看的是初中級的面試題吧,
無論怎么說,想要漲薪升職,高性能、高并發、高可用你就不得不會,
這里,我就來分享一些Netty相關的核心技術點:
注:由于篇幅原因,我就簡單的提取其中部分,獲取完整內容及高清導圖,加威信 mxj94670 來免費領取!

Netty 原理
Netty 是一個高性能、異步事件驅動的 NIO 框架,基于 JAVA NIO 提供的 API 實作,它提供了對TCP、UDP 和檔案傳輸的支持,作為一個異步 NIO 框架,Netty 的所有 IO 操作都是異步非阻塞的,通過 Future-Listener 機制,用戶可以方便的主動獲取或者通過通知機制獲得 IO 操作結果,
Netty 高性能

在 IO 編程程序中,當需要同時處理多個客戶端接入請求時,可以利用多執行緒或者 IO 多路復用技術進行處理,IO 多路復用技術通過把多個 IO 的阻塞復用到同一個 select 的阻塞上,從而使得系統在單執行緒的情況下可以同時處理多個客戶端請求,與傳統的多執行緒/多行程模型比,I/O 多路復用的最大優勢是系統開銷小,系統不需要創建新的額外行程或者執行緒,也不需要維護這些行程和執行緒的運行,降低了系統的維護作業量,節省了系統資源,
與 Socket 類和 ServerSocket 類相對應,NIO 也提供了 SocketChannel 和 ServerSocketChannel兩種不同的套接字通道實作,
1、多路復用通訊方式
Netty 架構按照 Reactor 模式設計和實作,它的服務端通信序列圖如下:

客戶端通信序列圖如下:

Netty 的 IO 執行緒 NioEventLoop 由于聚合了多路復用器 Selector,可以同時并發處理成百上千個客戶端 Channel,由于讀寫操作都是非阻塞的,這就可以充分提升 IO 執行緒的運行效率,避免由于頻繁 IO 阻塞導致的執行緒掛起,
- 異步通訊 NIO
由于 Netty 采用了異步通信模式,一個 IO 執行緒可以并發處理 N 個客戶端連接和讀寫操作,這從根本上解決了傳統同步阻塞 IO 一連接一執行緒模型,架構的性能、彈性伸縮能力和可靠性都得到了極大的提升,
- 零拷貝(DIRECT BUFFERS 使用堆外直接記憶體)
1、Netty 的接收和發送 ByteBuffer 采用 DIRECT BUFFERS,使用堆外直接記憶體進行 Socket 讀寫,不需要進行位元組緩沖區的二次拷貝,如果使用傳統的堆記憶體(HEAP BUFFERS)進行 Socket 讀寫,JVM 會將堆記憶體 Buffer 拷貝一份到直接記憶體中,然后才寫入 Socket 中,相比于堆外直接記憶體,訊息在發送程序中多了一次緩沖區的記憶體拷貝,
2、Netty 提供了組合 Buffer 物件,可以聚合多個 ByteBuffer 物件,用戶可以像操作一個 Buffer 那樣方便的對組合 Buffer 進行操作,避免了傳統通過記憶體拷貝的方式將幾個小 Buffer 合并成一個大的Buffer,
3、Netty的檔案傳輸采用了transferTo方法,它可以直接將檔案緩沖區的資料發送到目標Channel,避免了傳統通過回圈 write 方式導致的記憶體拷貝問題,
- 記憶體池(基于記憶體池的緩沖區重用機制)
隨著 JVM 虛擬機和 JIT 即時編譯技術的發展,物件的分配和回收是個非常輕量級的作業,但是對于緩沖區 Buffer,情況卻稍有不同,特別是對于堆外直接記憶體的分配和回收,是一件耗時的操作,為了盡量重用緩沖區,Netty 提供了基于記憶體池的緩沖區重用機制,
- 高效的 Reactor 執行緒模型
常用的 Reactor 執行緒模型有三種,Reactor 單執行緒模型, Reactor 多執行緒模型, 主從 Reactor 多執行緒模型,
Reactor 單執行緒模型
指的是所有的 IO 操作都在同一個 NIO 執行緒上面完成,NIO 執行緒的職責如下:
1) 作為 NIO 服務端,接收客戶端的 TCP 連接;
2) 作為 NIO 客戶端,向服務端發起 TCP 連接;
3) 讀取通信對端的請求或者應答訊息;
4) 向通信對端發送訊息請求或者應答訊息,

由于 Reactor 模式使用的是異步非阻塞 IO,所有的 IO 操作都不會導致阻塞,理論上一個執行緒可以獨立處理所有 IO 相關的操作,從架構層面看,一個 NIO 執行緒確實可以完成其承擔的職責,例如,通過Acceptor 接收客戶端的 TCP 連接請求訊息,鏈路建立成功之后,通過 Dispatch 將對應的 ByteBuffer派發到指定的 Handler 上進行訊息解碼,用戶 Handler 可以通過 NIO 執行緒將訊息發送給客戶端,
Reactor 多執行緒模型
Reactor 多執行緒模型與單執行緒模型最大的區別就是有一組 NIO 執行緒處理 IO 操作, 有專門一個NIO 執行緒-Acceptor 執行緒用于監聽服務端,接收客戶端的 TCP 連接請求; 網路 IO 操作-讀、寫等由一個 NIO 執行緒池負責,執行緒池可以采用標準的 JDK 執行緒池實作,它包含一個任務佇列和 N個可用的執行緒,由這些 NIO 執行緒負責訊息的讀取、解碼、編碼和發送;

主從 Reactor 多執行緒模型
服務端用于接收客戶端連接的不再是個 1 個單獨的 NIO 執行緒,而是一個獨立的 NIO 執行緒池,Acceptor 接收到客戶端 TCP 連接請求處理完成后(可能包含接入認證等),將新創建的SocketChannel 注冊到 IO 執行緒池(sub reactor 執行緒池)的某個 IO 執行緒上,由它負責SocketChannel 的讀寫和編解碼作業,Acceptor 執行緒池僅僅只用于客戶端的登陸、握手和安全認證,一旦鏈路建立成功,就將鏈路注冊到后端 subReactor 執行緒池的 IO 執行緒上,由 IO 執行緒負責后續的 IO 操作,

等等...
Netty RPC 實作

概念
RPC,即 Remote Procedure Call(遠程程序呼叫),呼叫遠程計算機上的服務,就像呼叫本地服務一樣,RPC 可以很好的解耦系統,如 WebService 就是一種基于 Http 協議的 RPC,這個 RPC 整體框架如下:

等等...
以上資料或者檔案 面試資料 有需要的朋友掃描下方直接免費獲取!!

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/227569.html
標籤:其他
