本書分為14章,涵蓋的知識主要包括:限流與熔斷等基礎(chǔ)概念、Sentinel的特性與性能壓測,Sentinel概念、核心類與數(shù)據(jù)結(jié)構(gòu),Sentinel整體工作流程,資源指標數(shù)據(jù)統(tǒng)計,限流與流量效果控制,熔斷降級與熔斷器,授權(quán)與系統(tǒng)自適應(yīng)功能,擴展Sentinel實現(xiàn)開關(guān)降級,Sentinel動態(tài)數(shù)據(jù)源,Sentinel適配主流框架的實現(xiàn)原理,熱點參數(shù)限流,集群限流,異步調(diào)用鏈的支持,資源指標數(shù)據(jù)的收集與持久化。本書內(nèi)容豐富,概念通俗易懂,讓讀者不僅能夠深入理解Sentinel的實現(xiàn)原理,還能夠從Sentinel中學(xué)習(xí)到一些技術(shù),如Java SPI的應(yīng)用、責(zé)任鏈設(shè)計模式的應(yīng)用、高并發(fā)性能優(yōu)化、滑動窗口的實現(xiàn)、勻速限流與冷啟動算法、信號量隔離的目的與實現(xiàn)等。
前言
Sentinel的使用前景
隨著微服務(wù)的發(fā)展及DDD領(lǐng)域驅(qū)動設(shè)計的興起,越來越多的企業(yè)開始使用微服務(wù)架構(gòu)。無論是項目重構(gòu),還是新項目的開發(fā),即使項目初期沒有多大的流量,但從長遠考慮,企業(yè)也基本會優(yōu)先使用微服務(wù)架構(gòu)。但“魚和熊掌不可兼得”,項目微服務(wù)化在提升開發(fā)效率及降低后期維護成本的同時,也加大了服務(wù)部署運維及問題排查的難度,并且容易導(dǎo)致服務(wù)崩潰出現(xiàn)級聯(lián)效應(yīng),也就是“服務(wù)雪崩”。
為了應(yīng)對微服務(wù)化帶來的難題,一批微服務(wù)組件與應(yīng)用涌現(xiàn)出來,如輔助問題排查的分布式調(diào)用鏈追蹤探針、簡化部署運維的Kubernetes,以及本書介紹的熔斷器組件等。
熔斷器組件用于實現(xiàn)服務(wù)的自我保護,一般都具備限流、熔斷功能。限流用于限制流量超過服務(wù)的臨界點,避免突發(fā)流量導(dǎo)致服務(wù)崩潰;而熔斷用于保護自身不受下游服務(wù)的影響,在感知到下游服務(wù)不穩(wěn)定時自動斷開請求,在下游服務(wù)恢復(fù)時再恢復(fù)請求。
并非流量大時才需要熔斷器。一方面,微服務(wù)的調(diào)用錯綜復(fù)雜,若一個服務(wù)不可用,則有很大的概率影響到其周邊服務(wù),使其不可用,并且這種現(xiàn)象就像病毒一樣具有擴散性,因此需要使用熔斷器;另一方面,若項目對接一些第三方的接口,則在無法預(yù)估第三方接口的最大QPS及穩(wěn)定性的情況下,添加熔斷器能保證服務(wù)自身穩(wěn)定運行。
Sentinel是熔斷器的實現(xiàn)組件之一,具有擴展性強、對應(yīng)用性能影響小、配置靈活,支持異步鏈路與響應(yīng)式項目等特點,因此Sentinel很快在國內(nèi)流行起來,成為國內(nèi)眾多開發(fā)者和架構(gòu)師首選的熔斷器組件。
筆者的使用體會
筆者有這樣一個經(jīng)歷,即將一個項目從單體架構(gòu)重構(gòu)為微服務(wù)架構(gòu),并且擔(dān)任該項目的主程序師,負責(zé)技術(shù)選型、微服務(wù)劃分及框架搭建。在這個過程中,系統(tǒng)發(fā)生了一次服務(wù)雪崩,筆者至今記憶猶新,也是從那時起才認識到熔斷器組件對于微服務(wù)的重要性。
Sentinel使用簡單、配置靈活,可將Sentinel的動態(tài)數(shù)據(jù)源接口與配置中心結(jié)合使用,動態(tài)地改變流量規(guī)則。Sentinel提供的流量控制功能有限流、熔斷、系統(tǒng)自適應(yīng)、授權(quán)等。筆者當時使用了熔斷和系統(tǒng)自適應(yīng)功能應(yīng)對突增流量導(dǎo)致服務(wù)雪崩的問題,同時使用限流功能并結(jié)合信號量隔離、勻速限流效果控制器,應(yīng)對內(nèi)部定時任務(wù)瞬時高并發(fā)調(diào)用某服務(wù)接口的問題。
在后續(xù)開發(fā)的項目中,筆者也經(jīng)常使用Sentinel,如在某跨境電商項目的支付服務(wù)中使用Sentinel的熔斷器功能;在其他微服務(wù)中擴展Sentinel實現(xiàn)開關(guān)降級,從而在促銷活動開始前對不重要的接口進行降級處理,為大促銷活動保駕護航。為了使用Kubernetes的ConfigMap資源存儲限流規(guī)則,筆者還自行實現(xiàn)了Sentinel動態(tài)數(shù)據(jù)源,并基于Spring Cloud動態(tài)配置實現(xiàn)了限流規(guī)則的動態(tài)配置。
本書的特色
本書以“概念、核心類、整體工作流程、核心功能”為主脈絡(luò),系統(tǒng)、全面地對Sentinel的源碼進行了分析,以圖文結(jié)合的方式詳細介紹了Sentinel的一些晦澀難懂的概念及數(shù)據(jù)結(jié)構(gòu),講解了勻速限流算法、冷啟動限流算法及Sentinel的代碼實現(xiàn),并分析了Sentinel中的一些代碼為何如此編寫,揣摩代碼背后的設(shè)計思想。
本書讀者對象
q 正在進行微服務(wù)項目的開發(fā)者或組織
q 對Sentinel工作原理尚未了解的開發(fā)者
q 在響應(yīng)式編程項目中對Sentinel感到困惑的開發(fā)者
引言 筆者經(jīng)歷的一次服務(wù)雪崩
第1章 基礎(chǔ)知識
1.1 服務(wù)降級、限流、熔斷、流量效果控制
1.1.1 限流降級
1.1.2 熔斷降級
1.1.3 開關(guān)降級
1.2 Sentinel的特性
1.3 Sentinel性能壓測
1.3.1 JMH基準測試
1.3.2 使用JMH進行Sentinel壓測
1.4 小結(jié)
第2章 了解概念與核心類
2.1 了解Sentinel的一些概念
2.1.1 資源、規(guī)則、資源指標數(shù)據(jù)
2.1.2 調(diào)用鏈與調(diào)用樹
2.1.3 處理器插槽
2.2 資源指標數(shù)據(jù)統(tǒng)計相關(guān)類
2.2.1 ResourceWrapper
2.2.2 Node
2.3 調(diào)用鏈上下文與入口類
2.3.1 Context
2.3.2 Entry
2.3.3 調(diào)用樹與ROOT節(jié)點
2.4 處理器插槽:ProcessorSlot
2.5 小結(jié)
第3章 了解整體工作流程
3.1 SPI在Sentinel中的應(yīng)用
3.1.1 Java SPI實現(xiàn)原理與適用場景
3.1.2 Java SPI在Sentinel中的應(yīng)用
3.1.3 自定義組裝ProcessorSlotChain
3.2 責(zé)任鏈模式在Sentinel中的應(yīng)用
3.3 Sentinel的整體工作流程分析
3.4 小結(jié)
第4章 資源指標數(shù)據(jù)統(tǒng)計
4.1 基于滑動窗口實現(xiàn)資源指標數(shù)據(jù)統(tǒng)計
4.1.1 Bucket
4.1.2 滑動窗口
4.1.3 WindowWrap
4.1.4 通過時間戳定位Bucket
4.1.5 獲取當前時間戳的前一個Bucket
4.2 資源指標數(shù)據(jù)統(tǒng)計全解析
4.2.1 節(jié)點選擇器插槽
4.2.2 ClusterNode構(gòu)造器插槽
4.2.3 資源指標數(shù)據(jù)統(tǒng)計插槽
4.2.4 資源指標數(shù)據(jù)的收集過程
4.3 小結(jié)
第5章 限流
5.1 限流功能實現(xiàn)原理
5.1.1 限流規(guī)則
5.1.2 限流規(guī)則加載器
5.1.3 限流處理器插槽
5.1.4 限流規(guī)則檢查器
5.2 流量效果控制
5.2.1 經(jīng)典限流算法
5.2.2 流量效果控制器
5.2.3 快速失敗流量效果控制器
5.2.4 勻速限流效果控制器
5.2.5 冷啟動限流效果控制器
5.3 小結(jié)
第6章 熔斷降級
6.1 舊版熔斷降級
6.1.1 熔斷降級規(guī)則
6.1.2 熔斷降級的實現(xiàn)原理
6.2 新版熔斷降級
6.2.1 舊版熔斷降級的不足
6.2.2 新版本的改進
6.2.3 熔斷器的實現(xiàn)原理
6.3 熔斷器
6.3.1 抽象熔斷器
6.3.2 異常熔斷器
6.3.3 慢請求熔斷器
6.4 小結(jié)
第7章 授權(quán)與系統(tǒng)自適應(yīng)
7.1 授權(quán)功能的實現(xiàn)原理
7.1.1 授權(quán)規(guī)則
7.1.2 授權(quán)處理器插槽
7.1.3 授權(quán)規(guī)則檢查器
7.2 系統(tǒng)自適應(yīng)功能的實現(xiàn)原理
7.2.1 系統(tǒng)自適應(yīng)限流規(guī)則
7.2.2 系統(tǒng)自適應(yīng)限流判斷流程
7.2.3 獲取系統(tǒng)的平均負載和CPU使用率
7.2.4 checkBbr
7.3 小結(jié)
第8章 實現(xiàn)開關(guān)降級
8.1 使用AOP實現(xiàn)開關(guān)降級
8.2 擴展Sentinel實現(xiàn)開關(guān)降級
8.3 小結(jié)
第9章 動態(tài)數(shù)據(jù)源
9.1 實現(xiàn)規(guī)則動態(tài)配置的兩種方式
9.2 使用Redis動態(tài)數(shù)據(jù)源
9.3 動態(tài)配置的實現(xiàn)原理
9.3.1 SentinelProperty
9.3.2 ReadableDataSource
9.4 基于Spring Cloud動態(tài)配置實現(xiàn)動態(tài)數(shù)據(jù)源
9.5 小結(jié)
第10章 適配主流框架
10.1 適配Spring MVC框架
10.1.1 使用步驟
10.1.2 適配原理
10.2 適配OpenFeign框架
10.2.1 使用步驟
10.2.2 Sentinel與OpenFeign整合的實現(xiàn)原理
10.3 適配Dubbo框架
10.3.1 使用步驟
10.3.2 適配原理
10.4 注解切面
10.4.1 @SentinelResource
10.4.2 SentinelResourceAspect
10.5 小結(jié)
第11章 熱點參數(shù)限流
11.1 熱點參數(shù)限流功能的實現(xiàn)
11.1.1 熱點參數(shù)指標數(shù)據(jù)統(tǒng)計
11.1.2 熱點參數(shù)限流的實現(xiàn)原理
11.2 流量效果控制
11.2.1 快速失敗
11.2.2 勻速排隊
11.3 小結(jié)
第12章 集群限流
12.1 本地限流與集群限流
12.2 集群限流的兩種模式
12.2.1 嵌入式模式
12.2.2 獨立應(yīng)用模式
12.3 集群限流功能的實現(xiàn)
12.3.1 集群限流規(guī)則
12.3.2 集群限流規(guī)則的動態(tài)配置
12.3.3 集群限流客戶端配置
12.3.4 集群限流服務(wù)端配置
12.3.5 動態(tài)配置為嵌入式模式提供支持
12.3.6 集群限流核心類介紹
12.3.7 集群限流客戶端的實現(xiàn)
12.3.8 集群限流服務(wù)端的實現(xiàn)
12.3.9 集群限流指標數(shù)據(jù)統(tǒng)計的實現(xiàn)
12.4 小結(jié)
第13章 異步調(diào)用鏈的支持
13.1 Sentinel異步調(diào)用鏈的支持
13.2 適配Reactor框架的實現(xiàn)原理
13.2.1 Reactive Streams規(guī)范
13.2.2 Reactor發(fā)布-訂閱流程
13.2.3 Reactor響應(yīng)式流的構(gòu)造原理
13.2.4 Reactor的Context傳遞過程
13.2.5 Sentinel適配Reactor框架的原理
13.3 適配WebFlux框架的實現(xiàn)原理
13.4 小結(jié)
第14章 Sentinel Dashboard
14.1 資源指標數(shù)據(jù)收集的實現(xiàn)原理
14.2 如何將資源指標數(shù)據(jù)輸出到metrics日記文件中
14.3 如何持久化資源指標數(shù)據(jù)
14.4 小結(jié)
結(jié)束語