前言
文章內容輸出來源:拉勾教育Java高薪訓練營;
Spring Cloud 是一站式微服務解決方案,很多公司都在使用 Spring Cloud 組件,我們想要學習 Spring Cloud 微服務架構,就需要學習他們的組件,包含:注冊中心、負載均衡、熔斷處理、程序呼叫、網關服務、配置中心、訊息總線、呼叫鏈路、資料監控等等,
這篇文章帶領大家了解使用 Sentinel ,Sentinel SCA推出的微服務組件,可以用來作為服務降級服務服務限流和服務監控,也是阿里出品,和 Nacos 可以很好的配合使用,
你將了解到:
- Sentinel 介紹
- Sentinel 部署
- Sentinel 關鍵概念
- Sentinel 流量規則
- Sentinel 降級規則
- Nacos 實作 Sentinel 規則持久化
Sentinel 介紹
Sentinel是?個?向云原?微服務的流量控制、熔斷降級組件,替代Hystrix,針對問題:服務雪崩、服務降級、服務熔斷、服務限流
Hystrix:
服務消費者(?動投遞微服務)—>調?服務提供者(簡歷微服務)
在調??引?Hystrix—> 單獨搞了?個Dashboard項?—>Turbine
1、??搭建監控平臺 dashboard
2、沒有提供UI界?進?服務熔斷、服務降級等配置(?是寫代碼,?侵了我們源程式環境)
Sentinel:
1、獨?可部署Dashboard/控制臺組件
2、減少代碼開發,通過UI界?配置即可完成細粒度控制(?動投遞微服務)
Sentinel 分為兩個部分:
-
核?庫:(Java 客戶端)不依賴任何框架/庫,能夠運?于所有 Java 運?時環境,同時對 Dubbo /Spring Cloud 等框架也有較好的?持,
-
控制臺:(Dashboard)基于 Spring Boot 開發,打包后可以直接運?,不需要額外的 Tomcat 等應?容器,
Sentinel 具有以下特征:
-
豐富的應?場景:Sentinel 承接了阿?巴巴近 10 年的雙???促流量的核?場景,例如秒殺(即突發流量控制在系統容量可以承受的范圍)、訊息削峰填?、集群流量控制、實時熔斷下游不可?應?等,
-
完備的實時監控:Sentinel 同時提供實時的監控功能,您可以在控制臺中看到接?應?的單臺機器秒級資料,甚? 500 臺以下規模的集群的匯總運?情況,
-
?泛的開源?態:Sentinel 提供開箱即?的與其它開源框架/庫的整合模塊,例如與 SpringCloud、Dubbo的整合,您只需要引?相應的依賴并進?簡單的配置即可快速地接? Sentinel,
-
完善的 SPI 擴展點:Sentinel 提供簡單易?、完善的 SPI 擴展接?,您可以通過實作擴展接?來快速地定制邏輯,例如定制規則管理、適配動態資料源等,
Sentinel 的主要特性:
Sentinel 的開源?態:
Sentinel 部署
上面說過,Sentinel 分為核心庫和儀表盤,核心庫是在我們的服務中引入依賴,儀表盤就可以來監控管理,
儀表盤
我們先來部署儀表盤,這個官網提供了可直接運行的jar
官網:
https://github.com/alibaba/Sentinel/releases
我這里選擇的是1.7.2
下載之后,運行,
java -jar -Dfile.encoding=UTF-8 sentinel-dashboard-1.7.2.jar
啟動完成之后,瀏覽器輸入:
http://localhost:8080/#/login
?戶名/密碼:sentinel/sentinel
核心庫
上面儀表盤搭建好了,但是沒有資料,因為我們我們還沒有在服務中引入核心庫,并連接到儀表盤上來,所以接下來我們還實作他們,
引入依賴:
<!--sentinel 核?環境 依賴-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
application.yml修改:
spring:
cloud:
sentinel:
transport:
dashboard: 127.0.0.1:8080 # sentinel dashboard/console 地址
port: 8719 # sentinel會在該埠啟動http server,那么這樣的話,控制臺定義的一些限流等規則才能發送傳遞過來,如果8719埠被占用,那么會依次+1
測驗
接下來,我們測驗一下,請求一個介面
http://localhost/api/user/login/1186154608@qq.com/123
可以看到已經可以監控查看啦,說明我們部署成功了,
Sentinel 關鍵概念
資源:
它可以是 Java 應?程式中的任何內容,例如,由應?程式提供的服務,或由應?程式調?的其它應?提供的服務,甚?可以是?段代碼,我們請求的 API 接?就是資源
規則:
圍繞資源的實時狀態設定的規則,可以包括流量控制規則、熔斷降級規則以及系統保護規則,所有規則可以動態實時調整
Sentinel 流量規則模塊
系統并發能?有限,?如系統A的QPS?持1個,如果太多請求過來,那么A就應該進?流量控制了,?如其他請求直接拒絕
資源名:默認請求路徑
針對來源:Sentinel可以針對調?者進?限流,填寫微服務名稱,默認default(不區分來源)閾值型別/單機閾值
QPS:(每秒鐘請求數量)當調?該資源的QPS達到閾值時進?限流
執行緒數:當調?該資源的執行緒數達到閾值的時候進?限流(執行緒處理請求的時候,如果說業務邏輯執?時間很?,流量洪峰來臨時,會耗費很多執行緒資源,這些執行緒資源會堆積,最終可能造成服務不可?,進?步上游服務不可?,最終可能服務雪崩)
是否集群:是否集群限流
流控模式:
直接:資源調?達到限流條件時,直接限流
關聯:關聯的資源調?達到閾值時候限流??
鏈路:只記錄指定鏈路上的流量
流控效果:
快速失敗:直接失敗,拋出例外
Warm Up:根據冷加載因?(默認3)的值,從閾值/冷加載因?,經過預熱時?,才達到設定的QPS閾 值
排隊等待:勻速排隊,讓請求勻速通過,閾值型別必須設定為QPS,否則?效
流控模式之關聯限流:
關聯的資源調?達到閾值時候限流??,?如?戶注冊接?,需要調?身份證校驗接?(往往身份證校驗接?),如果身份證校驗接?請求達到閾值,使?關聯,可以對?戶注冊接?進?限流,
流控模式之鏈路限流:
鏈路模式下會控制該資源所在的調?鏈路??的流量,需要在規則中配置??資源,即該調?鏈路??的上下?名稱,
?棵典型的調?樹如下圖所示:(阿?云提供)
上圖中來??? Entrance1 和 Entrance2 的請求都調?到了資源 NodeA ,Sentinel 允許只根據某個調???的統計資訊對資源限流,?如鏈路模式下設定??資源為 Entrance1 來表示只有從?? Entrance1 的調?才會記錄到 NodeA 的限流統計當中,?不關?經 Entrance2 到來的調?,
流控效果之 Warm up:
當系統?期處于空閑的情況下,當流量突然增加時,直接把系統拉升到??位可能瞬間把系統壓垮,?如電商?站的秒殺模塊,
通過 Warm Up 模式(預熱模式),讓通過的流量緩慢增加,經過設定的預熱時間以后,到達系統處理請求速率的設定值,
Warm Up 模式默認會從設定的 QPS 閾值的 1/3 開始慢慢往上增加? QPS 設定值,
流控效果之排隊等待:
排隊等待模式下會嚴格控制請求通過的間隔時間,即請求會勻速通過,允許部分請求排隊等待,通常?于訊息佇列削峰填?等場景,需設定具體的超時時間,當計算的等待時間超過超時時間時請求就會被拒絕,
很多流量過來了,并不是直接拒絕請求,?是請求進?排隊,?個?個勻速通過(處理),請求能等就等著被處理,不能等(等待時間>超時時間)就會被拒絕.
例如,QPS 配置為 5,則代表請求每 200 ms 才能通過?個,多出的請求將排隊等待通過,超時時間代表最?排隊時間,超出最?排隊時間的請求將會直接被拒絕,排隊等待模式下,QPS 設定值不要超過 1000(請求間隔 1 ms),
Sentinel 降級規則模塊
流控是對外部來的?流量進?控制,熔斷降級的視?是對內部問題進?處理,
Sentinel 降級會在調?鏈路中某個資源出現不穩定狀態時(例如調?超時或例外?例升?),對這個資源的調?進?限制,讓請求快速失敗,避免影響到其它的資源?導致級聯錯誤,當資源被降級后,在接下來的降級時間窗?之內,對該資源的調?都?動熔斷. 這?的降級其實是Hystrix中的熔斷,還記得當時Hystrix的?作流程么
策略
Sentinel不會像Hystrix那樣放過?個請求嘗試?我修復,就是明明確確按照時間窗?來,熔斷觸發后,時間窗?內拒絕請求,時間窗?后就恢復,
-
RT(平均回應時間 )
當 1s 內持續進? >=5 個請求,平均回應時間超過閾值(以 ms 為單位),那么在接下的時間窗?(以 s 為單位)之內,對這個?法的調?都會?動地熔斷(拋出 DegradeException),注意 Sentinel 默認統計的 RT 上限是 4900 ms,超出此閾值的都會算作 4900 ms,若需要變更此上限可以通過啟動配置項 -Dcsp.sentinel.statistic.max.rt=xxx 來配置,
-
例外?例
當資源的每秒請求量 >= 5,并且每秒例外總數占通過量的?值超過閾值之后,資源進?降級狀態,即在接下的時間窗?(以 s 為單位)之內,對這個?法的調?都會?動地回傳,例外?率的閾值范圍是 [0.0, 1.0] ,代表 0% - 100%,
-
例外數
當資源近 1 分鐘的例外數?超過閾值之后會進?熔斷,注意由于統計時間窗?是分鐘級別的,若 timeWindow ?于 60s,則結束熔斷狀態后仍可能再進?熔斷狀態,時間窗? >= 60s
Nacos 實作 Sentinel 規則持久化
?前,Sentinel Dashboard 中添加的規則資料存盤在記憶體,微服務停掉規則資料就消失,在?產環境下不合適,我們可以將 Sentinel 規則資料持久化到 Nacos 配置中?,讓微服務從 Nacos 獲取規則資料,
依賴
首先我們需要在專案中增加依賴
<!-- Sentinel?持采? Nacos 作為規則配置資料源,引?該適配依賴 -->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
增加配置
sentinel:
transport:
dashboard: 127.0.0.1:8080
port: 8719
# Sentinel Nacos資料源配置,Nacos中的規則會自動同步到sentinel流控規則中
datasource:
# 自定義的流控規則資料源名稱
flow:
nacos:
server-addr: ${spring.cloud.nacos.discovery.server-addr}
data-id: ${spring.application.name}-flow-rules
groupId: DEFAULT_GROUP
data-type: json
rule-type: flow # 型別來自RuleType類
# 自定義的降級規則資料源名稱
degrade:
nacos:
server-addr: ${spring.cloud.nacos.discovery.server-addr}
data-id: ${spring.application.name}-degrade-rules
groupId: DEFAULT_GROUP
data-type: json
rule-type: degrade # 型別來自RuleType類
Nacos Server 中配置
接下來需要我們在 Nacos Server 中添加對應規則配置集(public命名空間—>DEFAULT_GROUP中添加)
流控規則配置
[{
"resource":"/user/login/1186154608@qq.com/123",
"limitApp":"default",
"grade":1,
"count":1,
"strategy":0,
"controlBehavior":0,
"clusterMode":false
}]
所有屬性來?原始碼 FlowRule 類
-
resource:資源名稱
-
limitApp:來源應?
-
grade:閾值型別 0 執行緒數 1 QPS
-
count:單機閾值
-
strategy:流控模式,0 直接 1 關聯 2 鏈路
-
controlBehavior:流控效果,0 快速失敗 1 Warm Up 2 排隊等待
-
clusterMode:true/false 是否集群
降級規則配置
[{
"resource":"/user/login/1186154608@qq.com/123",
"grade":2,
"count":1,
"timeWindow":5
}]
所有屬性來?原始碼 DegradeRule 類
-
resource:資源名稱
-
grade:降級策略 0 RT 1 例外?例 2 例外數
-
count:閾值
-
timeWindow:時間窗
注意:
1、?個資源可以同時有多個限流規則和降級規則,所以配置集中是?個json陣列
2、Sentinel 控制臺中修改規則,僅是記憶體中?效,不會修改 Nacos 中的配置值,重啟后恢復原來的值; Nacos 控制臺中修改規則,不僅記憶體中?效,Nacos中持久化規則也?效,重啟后規則依然保持
總結
Sentinel是?個?向云原?微服務的流量控制、熔斷降級組件,我在拉勾訓練營學習的課程中,老師剛好講到了這部分內容,我跟著老師實操下,自己影響更加深刻了,感興趣的小伙伴趕緊動起手來吧~
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/73167.html
標籤:其他
