一篇搞定Sentinel-搭建Spring Cloud Alibaba服務元件Sentinel實現服務資源控制

2023-11-01 12:00:48

1、Sentinel介紹

隨著微服務的流行,服務和服務之間的穩定性變得越來越重要。Sentinel 是面向分散式、多語言異構化服務架構的流量治理元件,主要以流量為切入點,從流量路由、流量控制、流量整形、熔斷降級、系統自適應過載保護、熱點流量防護等多個維度來幫助開發者保障微服務的穩定性。
官網地址

https://sentinelguard.io/zh-cn/

GitHub地址

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中更改如果重新啟動專案則還會恢復原來的設定規則。