Sentinel
一、sentinel背景概述
Sentinel是阿里開源的熔斷斷流框架
1、傳統的微服務架構
服務架構的好處:所有服務都在一個架構里面,部署起來比較方便。
弊端:流量較大時需要擴容,擴容多台機器掛在nginx上,需要部署多台容器並維護他們之間的映射關系。
2、微服務架構
雙十一,訂單服務需要擴展,就擴展訂單服務,隨着雲原生和docker的出現,根據流量對服務進行彈性的伸縮,比如你的服務伸縮后告訴注冊中心少了一台服務或者多了一台服務,注冊中心和網關有一個通信,這樣對服務就能動態的添加和移除。
弊端就是:現在服務多了,拆在不同的容器,跨容器之間的調用存在事務的問題或者其它問題,服務間的調用失敗如何處理。
3、springCloud組件
4、雪崩效應常見的場景
1)硬件故障
如服務器宕機、機房斷電、光纖被挖等
2)流量激增
如異常流量,重試加大流量等
3)緩存穿透
一般發生在應用重啟和緩存失效時,以及短時間內大量緩存失效時。大量的緩存不命中,使請求直擊后端服務,造成服務超負荷運行,引起服務不可用。
4)程序bug
如程序邏輯導致內存泄漏,JVM長時間fullGC等。
5)同步等待
服務間采用的同步調用,同步等待造成的資源耗盡。
5、雪崩場景應對策略
1)硬件故障
多機房容災、異步多活等
2)流量激增
服務自動擴充、流量控制(限流、關閉重試等)等
3)緩存穿透
緩存預加載,緩存異步加載等。
4)程序bug
修改bug及時釋放資源。
5)同步等待
資源隔離、MQ解耦、不可用服務調用快速失敗等。資源隔離是指不同服務之間的調用采用不同的線程池;不可用服務快速失敗一般采用熔斷器模式結合超時機制實現。
二、斷流器框架sentine
1、斷流器框架對比
2、Sentinel是什么
分布式系統的防衛兵。面對分布式服務架構的流量控制組件,他主要從限流、熔斷降級、系統的負載保護、熱點防護等多維度幫助我們保證系統的穩定性。
一般用在雙一大促或者秒殺場景。
提供了一些實時監控和規則配置都可以在控制台里面去做。
對springCloud、dubbo、gRPC、serviceMesh都有很高的擴展點。通過spi擴展接口,定義自己的業務邏輯。
Sentinel主要分兩部分,一部分是核心庫,核心庫不依賴任何框架;
另一部分是控制台,jar包下載下來直接運行。
所有的規則可以通過sentinel控制台設定。設計理念,自由的選擇控制的角度。
3、Sentinel入門
流量控制
1)主程序
2)初始化流控規則
3)查看輸出
~/logs/csp/${appName}-metrics.log.xxx 里看到下面的輸出
4、流量控制
Hytix是通過線程池隔離的方式對資源進行隔離,好處:資源和資源之間最徹底的隔離。確定是:增加了線程切換成本。需要對每個資源做線程池大小的配置,不然會導致Hytix里面的線程池數量特別多。
Sentinel實現有兩種手段,一種是並發線程數進行限制,限制資源並發的數量,減少不穩定資源對資源的影響,這樣既沒有線程切換的資源損耗,也不需要配置線程池的大小。直接影響就是造成線程數的堆積,當堆積到一定程度就會拋出blockexception的異常;另外一種就是通過響應時間快速降級。還提供了自我保護功能,當系統負載較高時,如果還讓請求持續的進入需要限流控制。
5、Sentinel工作流程
Sentinel插槽,創建entry時同時創建插槽。
6、NodeSelectorSlot
負責收集資源的路徑,把調用路徑以樹狀結構存儲起來,用於根據調用路徑進行限流的降級。
不同的服務可以有不同的入口:
可以通過命令查詢樹狀結構
Curl http://localhost:8719/tree?type=root
7、ClusterBuilderSlot
存儲資源的統計信息以及調用者的信息,作為多維度限流降級的依據。
8、statisticSlot
核心功能插槽之一,記錄和統計不同維度runtime的字表。監控指標信息,統計實時調用數據。有一些標注,clusternode的實時統計,originnode不同調用者的統計信息,defaultNode根據上下文區分的資源id和runtime的統計。
底層采用滑動窗口數據結構leapArray來統計實時的秒級指標數據。
根據這些請求達到多少的QPS,根據這些統計做一些限流策略。
9、flowSlot
主要時是做流量控制,根據預設的資源去統計信息,按着固定的次序依次生效。
10、degradeSlot
熔斷降級,主要是根據上面的統計信息做一個熔斷降級。根據資源的平均響應時間、異常比來決定是否被熔斷。
11、systemSlot
對入口資源進行一個動態的配比,它的原理是讓入口流量和當前系統預計的流量達到一個平衡。只對入口流量起作用。
12、流量控制
監控資源的QPS、並發線程數等指標,當達到指定的閾值對流量進行控制,保障應用的穩定性。根據預設的規則以及ClusterBuilderSlot、statisticSlot統計出來的實時信息,進行流量的控制。
限流的最直接表象就是在執行時,拋出一個flowException,而flowException是blockException的子類。
resource:資源名,即限流規則的作用對象。
count:限流閾值
grade:限流閾值類型(QPS和並發線程數)
limitAPP:流控針對的調用來源,若為default則不區分調用來源。
strategy:調用關系限流策略。
controlBehavior:流量控制效果(直接拒絕、warm up、勻速排隊)
13、並發線程數的demo
用於保護業務線程池不被慢調用耗盡,當一個資源調用比較慢,耗時比較長,導致系統不穩定、吞吐量下降。導致線程數的占用,極端情況下導致容器的線程池被耗盡。
14、warm up
預熱冷啟動,系統長時間處於低水位的狀態,突如其來的流量會把系統拉入高水位,有可能使系統垮掉。這樣就使用冷啟動的方式,讓它在一定時間內讓流量緩慢增加,給冷系統一個預熱的時間,避免系統被壓垮。
15、集群的流控
ClusterFlowConfig
集群配置。可以運行jar包或者依賴到應用里面。
16、熔斷降級
不同服務之間的調用,組成復雜的調用鏈路。如何保證它的穩定性。Sentinel提供了一些熔斷策略。
三、sentine實戰
1、配置文件pom.xml
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
</dependency>
2、注解
3、配置vm鏡像
4、啟動成功后,多訪問幾次接口,在sentinel控制台
https://sentinelguard.io/zh-cn/