千載難逢!華為工程師帶你跟著案例學Netty,有圖有真相

2020-10-22 16:00:37

寫在前面

Netty是由JBOSS提供的一個java開源框架。

Netty是一個高效能、非同步事件驅動的NIO框架,它提供了對TCP、UDP和檔案傳輸的支援。作為當前最流行的NIO框架,Netty在網際網路領域、巨量資料分散式計算領域、遊戲行業、通訊行業等獲得了廣泛的應用,一些業界著名的開源元件也基於Netty的NIO框架構建。

作為最有影響力的NIO框架,Netty得到了眾多架構師和程式設計師的喜愛,並且在巨量資料通訊,遊戲,人工智慧,物聯網等領域都有廣泛的應用,尤其在高並行、高效能 RPC 方面,Netty的地位更是不容小覷的。

然而,想要把Netty真正學明白其實並不是件簡單的事。如果沒有一個好的學習方法,只是一味的依靠閱讀原始碼,這樣既浪費時間又很難學明白,最後還很容易半途而廢。

Netty的一個特點就是入門相對容易,但是真正掌握並精通是非常困難的,原因有如下幾個:

  • 涉及的知識面比較廣。Netty作為一個高效能的NIO通訊框架,涉及的知識點包括網路通訊、多執行緒程式設計、序列化和反序列化、非同步和同步、SSL/TLS安全、記憶體池、HTTP等各種協定棧,這些知識點在Java 語言中本身就是難點和重點,如果對這些基礎知識掌握不紮實,是很難真正掌握好Netty的。
  • 偵錯比較困難。因為大量使用非同步程式設計介面,以及訊息處理過程中的各種執行緒切換,相比傳統同步程式碼,Netty程式碼偵錯難度比較大。
  • 類繼承層次比較深,有些程式碼很晦澀(例如記憶體池)。對於初學者而言,通過閱讀程式碼來掌握Netty的難度還是很大的。
  • 程式碼規模龐大。目前,Netty 的程式碼規模已經非常龐大,特別是協定棧部分,提供了對HTTP/2、MQTT、WebSocket 等各種協定的支援,相關程式碼非常多。如果學習方式不當,抓不住重點,則全量閱讀Netty原始碼,既耗時又很難吃透,很容易半途而廢。
  • 資料零散,缺乏與實踐相關的案例。網上Netty的各種資料非常多,但是都以理論講解為主,Netty 在各行業中的應用、問題定位技巧及案例實踐方面的資料很少,缺乏系統性的實踐總結,是Netty學習的一大痛點。

netty筆記目錄

 

千載難逢!華為工程師帶你跟著案例學Netty,有圖有真相

 

千載難逢!華為工程師帶你跟著案例學Netty,有圖有真相

 

千載難逢!華為工程師帶你跟著案例學Netty,有圖有真相

 

千載難逢!華為工程師帶你跟著案例學Netty,有圖有真相

 

千載難逢!華為工程師帶你跟著案例學Netty,有圖有真相

第一章.Netty伺服器端意外退出案例

  • Netty伺服器端意外退出問題
  • Netty優雅退出機制

記憶體溢位和執行緒膨脹

將連線池的連線數上限設定為100, 業務高峰期發生了OOM異常,業務需要重新啟動才能恢復,相關異常紀錄檔如圖所示。

千載難逢!華為工程師帶你跟著案例學Netty,有圖有真相

 

千載難逢!華為工程師帶你跟著案例學Netty,有圖有真相

 

本章通過兩個簡單的案例分析,引出了號誌、Java Daemon 執行緒及Netty優雅退出相關知識。在實際專案中,知識往往是交叉在一起的,要想熟練掌握Netty伺服器端的啟動和退出,編寫更優雅和健壯的程式碼,需要重點掌握如下幾個知識點:

  • 作業系統的號誌和JavaDeamon執行緒工作機制。
  • Netty 的NioEventLoop執行緒工作原理。
  • Netty優雅退出相關的幾個核心類庫。

第2章Net青戶滿連線池資源世局範例

  • Netty連線池資源洩漏問題
  • Netty使用者端建立機制

錯用NIO程式設計模式

前面連線池洩漏的原因是採用BIO模式來呼叫NIO通訊框架,不僅沒達到優化的效果,而且還發生了OOM異常。

千載難逢!華為工程師帶你跟著案例學Netty,有圖有真相

JavaNIO使用者端建立原理分析

千載難逢!華為工程師帶你跟著案例學Netty,有圖有真相

Netty使用者端建立原理分析

Bootstrap是Socket使用者端建立工具類,使用者通過Bootstrap 可以方便地建立Netty的使用者端並行起非同步TCP連線操作,Netty 使用者端建立流程如圖2-10所示。

千載難逢!華為工程師帶你跟著案例學Netty,有圖有真相

小結

本章分析了一個生產環境Netty使用者端連線池資源洩漏案例,詳細講解了Netty 使用者端建立的流程和工作原理,以及在實際專案中如何正確地實現連線池,避免發生並行安全和資源不當釋放等問題。

第3章Netty記憶體池洩漏疑雲案例

  • Netty記憶體池洩漏問題
  • Netty記憶體池工作機制

響應訊息記憶體釋放玄機

對業務ByteBuf申請相關程式碼進行排查,發現響應訊息由業務執行緒建立,但是卻沒有主動釋放,因此懷疑是響應訊息沒有釋放導致的記憶體漏失。因為響應訊息使用的是PooledHeapByteBuf,如果發生記憶體漏失,利用堆記憶體監控就可以找到洩漏點,通過JavaVisualVM工具觀察堆記憶體佔用趨勢,並沒有發現堆記憶體發生洩漏,如圖3-2所示。

千載難逢!華為工程師帶你跟著案例學Netty,有圖有真相

記憶體池工作原理分析

千載難逢!華為工程師帶你跟著案例學Netty,有圖有真相

 

千載難逢!華為工程師帶你跟著案例學Netty,有圖有真相

 

千載難逢!華為工程師帶你跟著案例學Netty,有圖有真相

Netty記憶體池是一把雙刃劍,使用得當會在很大程度上提升系統的效能,但是誤用則會帶來記憶體漏失問題。從表面上看,只要遵循主動申請和釋放原則即可,但是由於記憶體的申請和釋放可能由Netty框架隱性完成,增加了記憶體管理的複雜性。

通過學習Netty 收發訊息的ByteBuf 申請和釋放機制,可以避免在專案中因誤用ByteBuf而發生記憶體漏失。在熟悉了ByteBuf 的申請和釋放機制後,通過對Netty記憶體池工作原理和關鍵原始碼的分析,讀者可以更好地掌握Netty記憶體池的使用方法。

第4章ByteBuf故障排查案例

  • HTTP協定棧ByteBuf使用問題
  • Netty ByteBuf實現機制

ByteBuf參照計數器工作原理和原始碼分析

千載難逢!華為工程師帶你跟著案例學Netty,有圖有真相

 

ByteBuf的申請和釋放可能會跨Netty 的NioEventLoop 和業務執行緒,跨執行緒操作ByteBuf時一定要謹慎,防止發生並行安全和非法參照問題。另外,由於ByteBuf的實現類非常多,不同的實現功能特性存在差異,使用者在使用時一定要認真閱讀API Doc說明,必要時要看原始碼,防止誤用導致出現功能和效能問題。

第5章Netty傳送佇列積壓導致記憶體漏失案例

  • Netty傳送佇列積壓案例
  • Netty訊息傳送工作機制

高井發故障場景

為了便於分析,對真實的業務程式碼做簡化處理,在一個使用者端內部建立一個執行緒,向伺服器端迴圈傳送請求訊息,模擬使用者端高並行場景,範例程式碼如下:

千載難逢!華為工程師帶你跟著案例學Netty,有圖有真相

 

千載難逢!華為工程師帶你跟著案例學Netty,有圖有真相

訊息傳送原始碼分析

千載難逢!華為工程師帶你跟著案例學Netty,有圖有真相

 

本章通過傳送佇列積壓案例,對Netty 的訊息傳送原理和原始碼進行了深入講解,熟悉了Netty的傳送佇列工作機制、高低水位機制等,就可以在實際專案中更好地利用這些功能,提升基於Netty構建的通訊框架的可靠性。

第6章API閘道器高並行壓測效能波動案例

  • 高並行壓測效能波動問題
  • Netty訊息接入記憶體申請機制

主動記憶體漏失定位法

千載難逢!華為工程師帶你跟著案例學Netty,有圖有真相

 

對於高並行接入的API閘道器類產品,需要謹慎處理訊息的記憶體申請和釋放,減少不必要的申請(例如透傳類場景),同時要防止記憶體空間的浪費。借鑑Netty請求訊息讀取的記憶體申請策略和動態擴容機制,並用在實際專案中,可以得到較大的效能提升。

第7章Netty ChannelHandler並行安全案例

  • Netty ChannelHandler並行安全問題
  • Netty ChannelHandler工作機制

ChannelHandler的並行陷阱

千載難逢!華為工程師帶你跟著案例學Netty,有圖有真相

 

千載難逢!華為工程師帶你跟著案例學Netty,有圖有真相

 

千載難逢!華為工程師帶你跟著案例學Netty,有圖有真相

 

ChannelHandler是使用者最常用的介面,掌握了ChannelHandler 及ChannelPipeline工作原理,就清楚了什麼時候該使用共用的ChannelHandler,什麼時候該對ChannelHandler做並行保護。無論缺少保護還是過度保護,都會給業務帶來副作用,甚至嚴重的功能或效能問題,因此ChannelHandler的並行安全性是非常重要的。

第8章車聯網伺服器端接收不到車載終端訊息案例

  • 車聯網伺服器端接收不到車載終端訊息問題
  • NioEventL oop執行緒工作機制

NioEventLoop執行緒防掛死策略

千載難逢!華為工程師帶你跟著案例學Netty,有圖有真相

 

千載難逢!華為工程師帶你跟著案例學Netty,有圖有真相

I/O讀寫操作原理和原始碼分析

千載難逢!華為工程師帶你跟著案例學Netty,有圖有真相

Netty多執行緒最佳實踐

千載難逢!華為工程師帶你跟著案例學Netty,有圖有真相

 

當Netty伺服器端接收不到訊息時,首先需要檢查是使用者端沒有傳送到伺服器端,還是伺服器端沒有讀取訊息。導致伺服器端無法讀取訊息的原因有很多,常見的包括GC導致的應用執行緒暫停、伺服器端的NioEventLoop執行緒被意外阻塞等。通過網路I/O執行緒和業務邏輯執行緒分離,可以實現雙方的並行處理,提升系統的可靠性。對於使用者而言,在編寫程式碼時,始終需要考慮NioEventLoop 執行緒是否會被業務程式碼阻塞,只有消除所有可能導致的阻塞點,才能保證程式穩定執行。

第9章Netty 3.X版本升級案例

  • Netty 3.X的版本升級背景
  • 版本升級後資料被篡改問題
  • 升級後上下文丟失問題
  • 升級後應用遭遇效能下降問題
  • Netty執行緒模型變更分析

效能下降原因分析

千載難逢!華為工程師帶你跟著案例學Netty,有圖有真相

 

千載難逢!華為工程師帶你跟著案例學Netty,有圖有真相

 

就Netty而言,掌握執行緒模型的重要性不亞於熟練使用它的API和功能。很多時候業務遇到的功能、效能等問題,都是由於缺乏對Netty執行緒模型和原理的理解導致的。對Netty的版本升級需要從功能、相容性和效能等多個角度進行綜合考慮,切不可只盯著API和功能變更這個「芝麻」,而丟掉了執行緒模型和效能這個「西瓜」。API的變更會導致編譯錯誤,但是效能下降卻隱藏於無形之中,稍不留意就會中招。對於強調快速交付和敏捷開發的網際網路類應用,升級的時候尤其要小心,不能功能調通後簡單驗證就匆忙上線。

第10章Netty並行失效導致效能下降案例

  • 業務ChannelHandler無法並行執行問題
  • Netty DefaultEventExecutor工作機制

DefaultEventExecutor原理和原始碼分析

千載難逢!華為工程師帶你跟著案例學Netty,有圖有真相

 

業務執行緒池優化策略

千載難逢!華為工程師帶你跟著案例學Netty,有圖有真相

 

千載難逢!華為工程師帶你跟著案例學Netty,有圖有真相

 

Netty框架本身實現了高效能的網路讀寫操作,但是後端業務邏輯執行卻是影響效能的關鍵要素,如果直接將複雜的業務邏輯操作放在I/O執行緒中完成,一些同步阻塞操作可能會導致I/O執行緒被阻塞。當把業務邏輯單獨拆分到業務執行緒池中進行處理,與I/O執行緒隔離時,不同的業務執行緒模型對效能的影響也非常大。Netty 提供了預設的並行排程ChannelHandler的能力,但是如果使用不當,也會帶來效能問題。對於業務自定義實現的執行緒池,如果追求更高的效能,就需要在消除或者減輕鎖競爭上下工夫,執行緒繫結技術是一個不錯的選擇,但是也需要根據業務實際場景來實現,例如TCP長連線就可以使用Channelld做Key,如果是短連線,使用者端的埠是隨機變化的,則不適合使用Channelld.

第11章loT百萬長連線效能調優案例

  • 海量長連線接入面臨的挑戰
  • 智慧家居記憶體漏失問題
  • 作業系統引數調優
  • Netty效能調優
  • JVM相關效能優化

設定合理的執行緒數

對於執行緒池的調優,主要集中在用於接收海量裝置TCP連線、TLS握手的Acceptor執行緒池(Netty 通常叫boss NioEventLoopGroup) 上,以及用於處理網路資料讀寫、心跳傳送的I/O工作執行緒池(Netty 通常叫work NioEventLoopGroup)上。

 

千載難逢!華為工程師帶你跟著案例學Netty,有圖有真相

I/O執行緒和業務執行緒分離

千載難逢!華為工程師帶你跟著案例學Netty,有圖有真相

第12章靜態檢查修改不當引起效能下降案例

  • Edgeo Secie效能嚴重下降問題
  • 克隆和淺拷貝

Netty的物件拷貝實現策略

千載難逢!華為工程師帶你跟著案例學Netty,有圖有真相

 

千載難逢!華為工程師帶你跟著案例學Netty,有圖有真相

第13章Netty效能統計誤區案例

  • 時延毛刺排查相關問題
  • Netty關鍵效能指標採集策略

都是同步思維惹的禍

千載難逢!華為工程師帶你跟著案例學Netty,有圖有真相

第14章gRPC的Netty HTTP/2實踐案例

  • gRPC基礎入門
  • gRPC Netty HTTP/2伺服器端工作機制
  • gRPC Netty HTTP/2使用者端工作機制
  • gRPC訊息序列化機制
  • gRPC執行緒模型

RPC框架簡介

RPC框架的目標就是讓遠端服務呼叫更加簡單、透明,RPC框架負責遮蔽底層的傳輸方式(TCP 或者UDP)、序列化方式(XML/JSON/二進位制)和通訊細節。服務呼叫者可以像呼叫本地介面一樣呼叫遠端的服務提供者,而不需要關心底層通訊細節和呼叫過程。

千載難逢!華為工程師帶你跟著案例學Netty,有圖有真相

為什麼選擇HTTP/2

千載難逢!華為工程師帶你跟著案例學Netty,有圖有真相

 

千載難逢!華為工程師帶你跟著案例學Netty,有圖有真相

伺服器端接收HTTP/2請求訊息原理和原始碼分析

gRPC伺服器端的請求訊息由Netty HTTP/2協定棧負責接入,gRPC通過繼承Http2FrameAdapter,將自定義的FrameListener新增到Netty的Http2ConnectionDecoder中,在HTTP/2請求訊息頭和訊息體被解析成功之後,回撥gRPC的FrameListener,接收並處理HTTP/2請求訊息,如圖14-8所示。

 

千載難逢!華為工程師帶你跟著案例學Netty,有圖有真相

NettyHTTP/2使用者端建立原理和原始碼分析

千載難逢!華為工程師帶你跟著案例學Netty,有圖有真相

 

Google Protobuf簡介

千載難逢!華為工程師帶你跟著案例學Netty,有圖有真相

伺服器端執行緒模型

千載難逢!華為工程師帶你跟著案例學Netty,有圖有真相

 

千載難逢!華為工程師帶你跟著案例學Netty,有圖有真相

第15章Netty事件觸發策略使用不當案例

  • channelReadComplete方法被呼叫多次問題
  • ChannelHandler使用的一些誤區總結

ChannelHandler呼叫問題

在生產環境中將某一個服務範例的調測紀錄檔開啟一段時間,以便定位問題。通過介面紀錄檔分析發現,對於同一個HTTP請求訊息,當發生問題時,業務ChannelHandler 的channelReadComplete方法會被呼叫多次,但是大部分訊息都呼叫一次,按照業務的設計初衷,當伺服器端讀到一個完整的HTTP請求訊息時,在channelReadComplete方法中進行業務邏輯處理。如果一個請求訊息的channelReadComplete方法被呼叫多次,則業務邏輯會出現異常。

千載難逢!華為工程師帶你跟著案例學Netty,有圖有真相

第16章Netty流量整形應用案例

  • Netty流量整形功能
  • Netty流量整形應用
  • Netty流量整形工作機制

通用的流量整形功能簡介

千載難逢!華為工程師帶你跟著案例學Netty,有圖有真相

流量整形工作原理和原始碼分析

千載難逢!華為工程師帶你跟著案例學Netty,有圖有真相

 

千載難逢!華為工程師帶你跟著案例學Netty,有圖有真相

第17章Netty SSL應用案例

  • Netty SSL功能簡介
  • Netty使用者端SSL握手超時問題
  • SSL握手效能問題
  • SSL事件監聽機制

SSL安全特性

單向認證

單向認證即使用者端驗證伺服器端的合法性,伺服器端不驗證使用者端,它的工作原理如下。

千載難逢!華為工程師帶你跟著案例學Netty,有圖有真相

 

千載難逢!華為工程師帶你跟著案例學Netty,有圖有真相

雙向認證

SSL雙向認證相比單向認證多了一步,即伺服器端傳送認證請求訊息給使用者端,使用者端傳送自簽名證書給伺服器端進行安全認證。

CA認證

千載難逢!華為工程師帶你跟著案例學Netty,有圖有真相

Netty SSL實現機制

千載難逢!華為工程師帶你跟著案例學Netty,有圖有真相

第18章Nety HTPS服務滿高並行宕機案例

  • Netty HTTPS伺服器端宕機問題
  • 功能層面的可靠性優化
  • 架構層面的可靠性優化

伺服器端記憶體漏失原因分析

千載難逢!華為工程師帶你跟著案例學Netty,有圖有真相

高並行場景下缺失的可靠性保護

千載難逢!華為工程師帶你跟著案例學Netty,有圖有真相

NettyHTTPS伺服器端可靠性優化

千載難逢!華為工程師帶你跟著案例學Netty,有圖有真相

第19章MQTT服務接入超時案例

  • MQTT服務接入超時問題
  • 基於Netty的可靠性設計

連線數膨脹原因分析

千載難逢!華為工程師帶你跟著案例學Netty,有圖有真相

業務客製化I/O異常

千載難逢!華為工程師帶你跟著案例學Netty,有圖有真相

 

千載難逢!華為工程師帶你跟著案例學Netty,有圖有真相

第20章Netty實踐總結

  • Netty學習策略
  • Netty故障定位技巧

入門知識準備

1. Java NIO類庫

需要熟悉和掌握的類庫主要包括:

(1)緩衝區Buffer

(2)通道Channel

千載難逢!華為工程師帶你跟著案例學Netty,有圖有真相

 

千載難逢!華為工程師帶你跟著案例學Netty,有圖有真相

專案實戰落地白皮書

該遊戲是一款歐美卡通風格的MMORPG 遊戲,目前正在研發中,2020年準備釋出在Google Play 上,進軍歐美市場。同時,遊戲技術框架基於國內知名網頁遊戲《回到三國志》

專案概述

千載難逢!華為工程師帶你跟著案例學Netty,有圖有真相

 

千載難逢!華為工程師帶你跟著案例學Netty,有圖有真相

這份【Netty進階之路】以及【遊戲專案白皮書】檔案共有364頁,需要完整版的朋友,可以三連此篇,掃描下方直接獲取!!

當然,單單有檔案看是遠遠不夠的,還有視訊和相匹配的課件進行學習提升,努力把neyyt這一塊兒給搞明白,相信一定會有不凡的人生! !

千載難逢!華為工程師帶你跟著案例學Netty,有圖有真相

視訊課件

千載難逢!華為工程師帶你跟著案例學Netty,有圖有真相

好了,今天就分享到這裡了,希望大家能夠好好學習,把neyyt這一塊兒給提升上來,也希望本文能夠得到大家的喜歡!!