Netty是由JBOSS提供的一個java開源框架。
Netty是一個高效能、非同步事件驅動的NIO框架,它提供了對TCP、UDP和檔案傳輸的支援。作為當前最流行的NIO框架,Netty在網際網路領域、巨量資料分散式計算領域、遊戲行業、通訊行業等獲得了廣泛的應用,一些業界著名的開源元件也基於Netty的NIO框架構建。
作為最有影響力的NIO框架,Netty得到了眾多架構師和程式設計師的喜愛,並且在巨量資料通訊,遊戲,人工智慧,物聯網等領域都有廣泛的應用,尤其在高並行、高效能 RPC 方面,Netty的地位更是不容小覷的。
然而,想要把Netty真正學明白其實並不是件簡單的事。如果沒有一個好的學習方法,只是一味的依靠閱讀原始碼,這樣既浪費時間又很難學明白,最後還很容易半途而廢。
Netty的一個特點就是入門相對容易,但是真正掌握並精通是非常困難的,原因有如下幾個:
第一章.Netty伺服器端意外退出案例
記憶體溢位和執行緒膨脹
將連線池的連線數上限設定為100, 業務高峰期發生了OOM異常,業務需要重新啟動才能恢復,相關異常紀錄檔如圖所示。
本章通過兩個簡單的案例分析,引出了號誌、Java Daemon 執行緒及Netty優雅退出相關知識。在實際專案中,知識往往是交叉在一起的,要想熟練掌握Netty伺服器端的啟動和退出,編寫更優雅和健壯的程式碼,需要重點掌握如下幾個知識點:
第2章Net青戶滿連線池資源世局範例
錯用NIO程式設計模式
前面連線池洩漏的原因是採用BIO模式來呼叫NIO通訊框架,不僅沒達到優化的效果,而且還發生了OOM異常。
JavaNIO使用者端建立原理分析
Netty使用者端建立原理分析
Bootstrap是Socket使用者端建立工具類,使用者通過Bootstrap 可以方便地建立Netty的使用者端並行起非同步TCP連線操作,Netty 使用者端建立流程如圖2-10所示。
小結
本章分析了一個生產環境Netty使用者端連線池資源洩漏案例,詳細講解了Netty 使用者端建立的流程和工作原理,以及在實際專案中如何正確地實現連線池,避免發生並行安全和資源不當釋放等問題。
第3章Netty記憶體池洩漏疑雲案例
響應訊息記憶體釋放玄機
對業務ByteBuf申請相關程式碼進行排查,發現響應訊息由業務執行緒建立,但是卻沒有主動釋放,因此懷疑是響應訊息沒有釋放導致的記憶體漏失。因為響應訊息使用的是PooledHeapByteBuf,如果發生記憶體漏失,利用堆記憶體監控就可以找到洩漏點,通過JavaVisualVM工具觀察堆記憶體佔用趨勢,並沒有發現堆記憶體發生洩漏,如圖3-2所示。
記憶體池工作原理分析
Netty記憶體池是一把雙刃劍,使用得當會在很大程度上提升系統的效能,但是誤用則會帶來記憶體漏失問題。從表面上看,只要遵循主動申請和釋放原則即可,但是由於記憶體的申請和釋放可能由Netty框架隱性完成,增加了記憶體管理的複雜性。
通過學習Netty 收發訊息的ByteBuf 申請和釋放機制,可以避免在專案中因誤用ByteBuf而發生記憶體漏失。在熟悉了ByteBuf 的申請和釋放機制後,通過對Netty記憶體池工作原理和關鍵原始碼的分析,讀者可以更好地掌握Netty記憶體池的使用方法。
第4章ByteBuf故障排查案例
ByteBuf參照計數器工作原理和原始碼分析
ByteBuf的申請和釋放可能會跨Netty 的NioEventLoop 和業務執行緒,跨執行緒操作ByteBuf時一定要謹慎,防止發生並行安全和非法參照問題。另外,由於ByteBuf的實現類非常多,不同的實現功能特性存在差異,使用者在使用時一定要認真閱讀API Doc說明,必要時要看原始碼,防止誤用導致出現功能和效能問題。
第5章Netty傳送佇列積壓導致記憶體漏失案例
高井發故障場景
為了便於分析,對真實的業務程式碼做簡化處理,在一個使用者端內部建立一個執行緒,向伺服器端迴圈傳送請求訊息,模擬使用者端高並行場景,範例程式碼如下:
訊息傳送原始碼分析
本章通過傳送佇列積壓案例,對Netty 的訊息傳送原理和原始碼進行了深入講解,熟悉了Netty的傳送佇列工作機制、高低水位機制等,就可以在實際專案中更好地利用這些功能,提升基於Netty構建的通訊框架的可靠性。
第6章API閘道器高並行壓測效能波動案例
主動記憶體漏失定位法
對於高並行接入的API閘道器類產品,需要謹慎處理訊息的記憶體申請和釋放,減少不必要的申請(例如透傳類場景),同時要防止記憶體空間的浪費。借鑑Netty請求訊息讀取的記憶體申請策略和動態擴容機制,並用在實際專案中,可以得到較大的效能提升。
第7章Netty ChannelHandler並行安全案例
ChannelHandler的並行陷阱
ChannelHandler是使用者最常用的介面,掌握了ChannelHandler 及ChannelPipeline工作原理,就清楚了什麼時候該使用共用的ChannelHandler,什麼時候該對ChannelHandler做並行保護。無論缺少保護還是過度保護,都會給業務帶來副作用,甚至嚴重的功能或效能問題,因此ChannelHandler的並行安全性是非常重要的。
第8章車聯網伺服器端接收不到車載終端訊息案例
NioEventLoop執行緒防掛死策略
I/O讀寫操作原理和原始碼分析
Netty多執行緒最佳實踐
當Netty伺服器端接收不到訊息時,首先需要檢查是使用者端沒有傳送到伺服器端,還是伺服器端沒有讀取訊息。導致伺服器端無法讀取訊息的原因有很多,常見的包括GC導致的應用執行緒暫停、伺服器端的NioEventLoop執行緒被意外阻塞等。通過網路I/O執行緒和業務邏輯執行緒分離,可以實現雙方的並行處理,提升系統的可靠性。對於使用者而言,在編寫程式碼時,始終需要考慮NioEventLoop 執行緒是否會被業務程式碼阻塞,只有消除所有可能導致的阻塞點,才能保證程式穩定執行。
第9章Netty 3.X版本升級案例
效能下降原因分析
就Netty而言,掌握執行緒模型的重要性不亞於熟練使用它的API和功能。很多時候業務遇到的功能、效能等問題,都是由於缺乏對Netty執行緒模型和原理的理解導致的。對Netty的版本升級需要從功能、相容性和效能等多個角度進行綜合考慮,切不可只盯著API和功能變更這個「芝麻」,而丟掉了執行緒模型和效能這個「西瓜」。API的變更會導致編譯錯誤,但是效能下降卻隱藏於無形之中,稍不留意就會中招。對於強調快速交付和敏捷開發的網際網路類應用,升級的時候尤其要小心,不能功能調通後簡單驗證就匆忙上線。
第10章Netty並行失效導致效能下降案例
DefaultEventExecutor原理和原始碼分析
業務執行緒池優化策略
Netty框架本身實現了高效能的網路讀寫操作,但是後端業務邏輯執行卻是影響效能的關鍵要素,如果直接將複雜的業務邏輯操作放在I/O執行緒中完成,一些同步阻塞操作可能會導致I/O執行緒被阻塞。當把業務邏輯單獨拆分到業務執行緒池中進行處理,與I/O執行緒隔離時,不同的業務執行緒模型對效能的影響也非常大。Netty 提供了預設的並行排程ChannelHandler的能力,但是如果使用不當,也會帶來效能問題。對於業務自定義實現的執行緒池,如果追求更高的效能,就需要在消除或者減輕鎖競爭上下工夫,執行緒繫結技術是一個不錯的選擇,但是也需要根據業務實際場景來實現,例如TCP長連線就可以使用Channelld做Key,如果是短連線,使用者端的埠是隨機變化的,則不適合使用Channelld.
第11章loT百萬長連線效能調優案例
設定合理的執行緒數
對於執行緒池的調優,主要集中在用於接收海量裝置TCP連線、TLS握手的Acceptor執行緒池(Netty 通常叫boss NioEventLoopGroup) 上,以及用於處理網路資料讀寫、心跳傳送的I/O工作執行緒池(Netty 通常叫work NioEventLoopGroup)上。
I/O執行緒和業務執行緒分離
第12章靜態檢查修改不當引起效能下降案例
Netty的物件拷貝實現策略
第13章Netty效能統計誤區案例
都是同步思維惹的禍
第14章gRPC的Netty HTTP/2實踐案例
RPC框架簡介
RPC框架的目標就是讓遠端服務呼叫更加簡單、透明,RPC框架負責遮蔽底層的傳輸方式(TCP 或者UDP)、序列化方式(XML/JSON/二進位制)和通訊細節。服務呼叫者可以像呼叫本地介面一樣呼叫遠端的服務提供者,而不需要關心底層通訊細節和呼叫過程。
為什麼選擇HTTP/2
伺服器端接收HTTP/2請求訊息原理和原始碼分析
gRPC伺服器端的請求訊息由Netty HTTP/2協定棧負責接入,gRPC通過繼承Http2FrameAdapter,將自定義的FrameListener新增到Netty的Http2ConnectionDecoder中,在HTTP/2請求訊息頭和訊息體被解析成功之後,回撥gRPC的FrameListener,接收並處理HTTP/2請求訊息,如圖14-8所示。
NettyHTTP/2使用者端建立原理和原始碼分析
Google Protobuf簡介
伺服器端執行緒模型
第15章Netty事件觸發策略使用不當案例
ChannelHandler呼叫問題
在生產環境中將某一個服務範例的調測紀錄檔開啟一段時間,以便定位問題。通過介面紀錄檔分析發現,對於同一個HTTP請求訊息,當發生問題時,業務ChannelHandler 的channelReadComplete方法會被呼叫多次,但是大部分訊息都呼叫一次,按照業務的設計初衷,當伺服器端讀到一個完整的HTTP請求訊息時,在channelReadComplete方法中進行業務邏輯處理。如果一個請求訊息的channelReadComplete方法被呼叫多次,則業務邏輯會出現異常。
第16章Netty流量整形應用案例
通用的流量整形功能簡介
流量整形工作原理和原始碼分析
第17章Netty SSL應用案例
SSL安全特性
單向認證
單向認證即使用者端驗證伺服器端的合法性,伺服器端不驗證使用者端,它的工作原理如下。
雙向認證
SSL雙向認證相比單向認證多了一步,即伺服器端傳送認證請求訊息給使用者端,使用者端傳送自簽名證書給伺服器端進行安全認證。
CA認證
Netty SSL實現機制
第18章Nety HTPS服務滿高並行宕機案例
伺服器端記憶體漏失原因分析
高並行場景下缺失的可靠性保護
NettyHTTPS伺服器端可靠性優化
第19章MQTT服務接入超時案例
連線數膨脹原因分析
業務客製化I/O異常
第20章Netty實踐總結
入門知識準備
1. Java NIO類庫
需要熟悉和掌握的類庫主要包括:
(1)緩衝區Buffer
(2)通道Channel
該遊戲是一款歐美卡通風格的MMORPG 遊戲,目前正在研發中,2020年準備釋出在Google Play 上,進軍歐美市場。同時,遊戲技術框架基於國內知名網頁遊戲《回到三國志》
專案概述
這份【Netty進階之路】以及【遊戲專案白皮書】檔案共有364頁,需要完整版的朋友,可以三連此篇,掃描下方直接獲取!!
當然,單單有檔案看是遠遠不夠的,還有視訊和相匹配的課件進行學習提升,努力把neyyt這一塊兒給搞明白,相信一定會有不凡的人生! !
視訊課件
好了,今天就分享到這裡了,希望大家能夠好好學習,把neyyt這一塊兒給提升上來,也希望本文能夠得到大家的喜歡!!