1、Sentinel介紹
隨著微服務的流行,服務和服務之間的穩定性變得越來越重要。Sentinel 是面向分散式、多語言異構化服務架構的流量治理元件,主要以流量為切入點,從流量路由、流量控制、流量整形、熔斷降級、系統自適應過載保護、熱點流量防護等多個維度來幫助開發者保障微服務的穩定性。
官網地址:
https://sentinelguard.io/zh-cn/
https://github.com/alibaba/Sentinel
新手指南:
https://github.com/alibaba/Sentinel/wiki/%E6%96%B0%E6%89%8B%E6%8C%87%E5%8D%97
2、首先下載Sentinel控制檯
Sentinel下載地址:
https://github.com/alibaba/Sentinel/releases
選擇合適的Sentinel版本進行下載。下載版本需要和Spring Cloud Alibaba版本進行對比,以防下載的版本和其他元件不相容。這裡附加版本說明地址:
https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E#2021x-%E5%88%86%E6%94%AF
我使用的Spring Cloud Alibaba Version為2.2.6.RELEASE版本,通過版本關係對比需要下載的Sentinel版本為1.8.1,找到該版本進行下載:
這裡直接選擇jar包下載,也可以自己下載原始碼進行編譯。
3、啟動Sentinel控制檯
由於下載的為jar包所以需要有JDK安裝環境,安裝環境是學習java必備的技能這裡不做介紹,直接啟動jar包:
java -jar sentinel-dashboard-1.8.1.jar
這裡啟動的預設埠號為8080。存取IP:8080登入sentinel,預設賬號密碼:sentinel
登入成功我們會發現控制檯只有一個首頁其他的什麼的沒有。因為目前沒有服務程式接入,所以sentinel檢測不到服務。我們可以修改啟動命令,新增引數,讓sentinel也能檢測到自己。命令:
java -Dserver.port=8820 -Dcsp.sentinel.dashboard.server=localhost:8820 -Dcsp.sentinel.api.port=8719 -Dproject.name=spring-cloud -jar sentinel-dashboard-1.8.1.jar
-Dserver.port=8820 #指定控制檯埠,不使用預設埠
-Dcsp.sentinel.dashboard.server=localhost:8820 #指定控制檯地址和埠。
-Dcsp.sentinel.api.port=8719 #使用者端監控 API 的埠預設是 8719,如果該埠佔用,會在預設埠+1。如果+1後8020埠也被佔用,則還會持續+1,直到發現沒有佔用的埠為止。
-Dproject.name=spring-cloud #指定應用的名稱
這裡只設定這幾個引數。如果想要設定更多引數,可以檢視官網啟動設定項,檔案地址:
https://sentinelguard.io/zh-cn/docs/startup-configuration.html
執行上面Java命令,啟動Sentinel。存取IP:8820登入sentinel,預設賬號密碼:sentinel
登入成功,我們會發現控制檯多個一個應用程式,這個就是通過上面Java啟動命令修改的應用名稱,sentinel檢測到的自己的服務。
4、使用者端接入控制檯
通過上面三步驟,Sentinel控制檯就安裝並啟動成功了,接下來我們該通過程式碼接入使用者端。首先開啟我們的SpringCloud專案,在模組module的pom中新增sentinel依賴,這裡我加到我專案的訂單模組中order-module:
<!--服務熔斷降級--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency>
如果之前沒有搭建過SpringCloud專案,可以檢視我之前寫的隨筆進行搭建。點選文章連結:
https://www.cnblogs.com/eternality/p/17757310.html
jar包引入成功後,就可以在組態檔中加入設定資訊了。設定如下:
spring:
profiles:
active: dev
application:
# 服務名稱
name: order-service-model
cloud:
sentinel:
enabled: true #開啟Sentinel
eager: true # 取消控制檯懶載入,專案啟動即連線Sentinel
transport:
dashboard: localhost:8080 #控制檯地址
啟動專案,檢視sentinel控制檯:
這裡我啟動了兩個訂單模組服務,可以發現,sentinel中顯示了訂單模組,說明在order-module中成功接入控制檯了。
注意:
如果在組態檔中沒有設定取消懶載入spring.cloud.sentinel.eager: true 則專案啟動成功在sentinel控制檯不會顯示模組資訊。需要存取一次介面才會顯示,因為預設為懶載入模式。
接下來就可以測試Sentinel是否連線成功了,存取介面在實時監控和簇點鏈路中檢視是否有介面資訊。
如果想要對外暴露更多資訊,我們可以整合SpringBoot的Actuator,對外暴露端點endpoint。Actuator可以瞭解服務的各種情況,健康檢查,服務狀態之類。
<!--監控--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
在組態檔中加入暴露端點資訊:
#暴露端點
management:
endpoints:
web:
exposure:
include: '*'
5、規則設定
控制規則、降級規則、熱點規則、系統規則、授權規則本次不做相關介紹,可以在官方上面學習。點選連結進行檢視:
https://github.com/alibaba/Sentinel/wiki/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8
6、Sentinel設定規則持久化
Sentinel設定的規則預設不是真實存在的,只要重新啟動微服務專案,之前新增的規則都會消失,需要重新新增。所以需要設定規則持久化,將設定資訊儲存在註冊中心nacos中,這樣不管重啟多少次專案,最初建立的規則還在。
首先在pom中加入依賴:
<!-- Sentinel規則持久化至Nacos設定 --> <dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-datasource-nacos</artifactId> </dependency>
依賴加入成功後,就可以在專案組態檔中加入設定資訊了:
spring:
profiles:
active: dev
application:
# 服務名稱
name: order-service-model
cloud:
sentinel:
enabled: true
eager: true # 取消控制檯懶載入,專案啟動即連線Sentinel
transport:
dashboard: localhost:8080 #控制檯地址
#port: 8722
datasource:
#五種規則持久化到Nacos中 authority(授權規則)、degrade(降級規則)、flow(流控規則)、param-flow(熱點規則)、system(系統規則)
#sentinel 資料持久化-控流
ds1:
nacos:
server-addr: 127.0.0.1:8848 # 設定nacos server 註冊中心地址
dataId: order-service-model-sentinel # 和nacos中保持對應
groupId: DEFAULT_GROUP # 和 nacos中保持對應
data-type: json # 規則型別:流控
namespace: 23857f22-27ac-4947-988a-1b88d4eeb807
# 對於 nacos 資料型別 注意閘道器流控規則對應 gw-flow
rule-type: flow #表示流控規則,可設定規則:flow,degrade,authority,system,param-flow,gw-flow,gw-api-group
#sentinel 資料持久化-降級
ds2:
nacos:
server-addr: 127.0.0.1:8848 # 設定nacos server 註冊中心地址
dataId: order-service-model-sentinel-demotion # 和nacos中保持對應
groupId: DEFAULT_GROUP # 和 nacos中保持對應
data-type: json # 規則型別:流控
namespace: 23857f22-27ac-4947-988a-1b88d4eeb807
# 對於 nacos 資料型別
rule-type: degrade #表示降級規則,可設定規則:flow,degrade,authority,system,param-flow,gw-flow,gw-api-group
#sentinel 資料持久化-熱點
ds3:
nacos:
server-addr: 127.0.0.1:8848 # 設定nacos server 註冊中心地址
dataId: order-service-model-sentinel-hotspot # 和nacos中保持對應
groupId: DEFAULT_GROUP # 和 nacos中保持對應
data-type: json # 規則型別:流控
namespace: 23857f22-27ac-4947-988a-1b88d4eeb807
# 對於 nacos 資料型別
rule-type: PARAM_FLOW #表示降級規則,可設定規則:flow,degrade,authority,system,param-flow,gw-flow,gw-api-group
在nacos的設定列表中新增相關組態檔:
控流檔案:order-service-model-sentinel
降級檔案:order-service-model-sentinel-demotion
熱點規則檔案:order-service-model-sentinel-hotspot
order-service-model-sentinel設定資訊:
[
{
"resource": "redis",
"limitApp": "default",
"grade": 1,
"count": 1,
"strategy": 0,
"controlBehavior": 0,
"clusterMode": false
}
]
https://github.com/alibaba/Sentinel/wiki/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8#%E6%B5%81%E9%87%8F%E6%8E%A7%E5%88%B6%E8%A7%84%E5%88%99-flowrule
order-service-model-sentinel-demotion設定資訊:
[
{
"resource": "com.itmy.user.service.IUserExternalService:selectUserAll()",
"grade": 0,
"count": 100.0,
"passCount": 0,
"timeWindow": 20,
"minRequestAmount":1,
"statIntervalMs":2002,
"slowRatioThreshold":0.1
}
]
https://github.com/alibaba/Sentinel/wiki/熔斷降級
order-service-model-sentinel-hotspot設定資訊:
[
{
"resource": "sentinelTest",
"count": 2,
"paramIdx":0,
"durationInSec":1000
}
]
熱點引數限流規則說明:
https://github.com/alibaba/Sentinel/wiki/熱點引數限流
上面設定成功後,重新啟動專案進行測試。我們可以看到不管重新啟動多少次,設定的規則依然在。持久化規則就設定成功了。
注意:
如果後面需要更改設定規則,則需要在nacos的設定中進行修改。在Sentinel中更改如果重新啟動專案則還會恢復原來的設定規則。