Spring Cloud Alibaba 教程(基於首個畢業版)(十一):Sentinel 規則持久化-推模式

本文實現基於拉模式的Alibaba Sentinel規則持久化。

一、原理簡述

  • 控制檯推送規則:
    • 將規則推送到Nacos或其他遠程配置中心
    • Sentinel客戶端鏈接Nacos,獲取規則配置;並監聽Nacos配置變化,如發生變化,就更新本地緩存(從而讓本地緩存總是和Nacos一致)
  • 控制檯監聽Nacos配置變化,如發生變化就更新本地緩存(從而讓控制檯本地緩存總是和Nacos一致)

二、微服務改造

2.1 加依賴

<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-datasource-nacos</artifactId>
</dependency>

2.2 添加配置

spring:
  cloud:
    sentinel:
      datasource:
        # 名稱隨意
        flow:
          nacos:
            server-addr: localhost:8848
            dataId: ${spring.application.name}-flow-rules
            groupId: SENTINEL_GROUP
            # 規則類型,取值見:
            # org.springframework.cloud.alibaba.sentinel.datasource.RuleType
            rule-type: flow
        degrade:
          nacos:
            server-addr: localhost:8848
            dataId: ${spring.application.name}-degrade-rules
            groupId: SENTINEL_GROUP
            rule-type: degrade
        system:
          nacos:
            server-addr: localhost:8848
            dataId: ${spring.application.name}-system-rules
            groupId: SENTINEL_GROUP
            rule-type: system
        authority:
          nacos:
            server-addr: localhost:8848
            dataId: ${spring.application.name}-authority-rules
            groupId: SENTINEL_GROUP
            rule-type: authority
        param-flow:
          nacos:
            server-addr: localhost:8848
            dataId: ${spring.application.name}-param-flow-rules
            groupId: SENTINEL_GROUP

三、Sentinel 控制檯改造(需要下載源碼)

控制檯改造主要是爲規則實現

  • DynamicRuleProvider:從Nacos上讀取配置
  • DynamicRulePublisher:將規則推送到Nacos上

3.1 修改pom.xml,找到:

<!-- for Nacos rule publisher sample -->
  <dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-datasource-nacos</artifactId>
    <scope>test</scope>
  </dependency>

<scope>test</scope> 這一行註釋掉,即改爲如下:

<!-- for Nacos rule publisher sample -->
<dependency>
  <groupId>com.alibaba.csp</groupId>
  <artifactId>sentinel-datasource-nacos</artifactId>
  <!--<scope>test</scope>-->
</dependency>

找到 sentinel-dashboard/src/test/java/com/alibaba/csp/sentinel/dashboard/rule/nacos目錄,將整個目錄拷貝到 sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/nacos,如圖:
image-20190715172024539
修改 com.alibaba.csp.sentinel.dashboard.controller.v2.FlowControllerV2 ,找到

@Autowired
@Qualifier("flowRuleDefaultProvider")
private DynamicRuleProvider<List<FlowRuleEntity>> ruleProvider;
@Autowired
@Qualifier("flowRuleDefaultPublisher")
private DynamicRulePublisher<List<FlowRuleEntity>> rulePublisher;

修改爲:

@Autowired
@Qualifier("flowRuleNacosProvider")
private DynamicRuleProvider<List<FlowRuleEntity>> ruleProvider;
@Autowired
@Qualifier("flowRuleNacosPublisher")
private DynamicRulePublisher<List<FlowRuleEntity>> rulePublisher;

修改 sentinel-dashboard/src/main/webapp/resources/app/scripts/directives/sidebar/sidebar.html,找到:

<!--<li ui-sref-active="active">-->
  <!--<a ui-sref="dashboard.flow({app: entry.app})">-->
    <!--<i class="glyphicon glyphicon-filter"></i>&nbsp;&nbsp;流控規則 V1</a>-->
<!--</li>-->

把註釋解開,即改爲:

<li ui-sref-active="active">
  <a ui-sref="dashboard.flow({app: entry.app})">
    <i class="glyphicon glyphicon-filter"></i>&nbsp;&nbsp;流控規則 V1</a>
</li>

四、編譯&啓動

  • 執行 mvn clean package -DskipTests
  • 在項目的 target 目錄找到sentinel-dashboard.jar ,執行 java -jar sentinel-dashboard.jar 啓動控制檯。

五、測試

  • 測試1:用Sentinel控制檯【菜單欄的 流控規則 V1 】推送流控規則,規則會存儲到Nacos;
  • 測試2:直接在Nacos上修改流控規則,然後刷新Sentinel控制檯,控制檯上的顯示也會被修改;
  • 測試3:重啓Sentinel控制檯,並重啓微服務;刷新控制檯,可以發現規則依然存在。

六、萬里長征才進行了第一步…

以上,其實只實現了流控規則的持久化。Sentinel有若干種規則,例如降級規則、系統規則、授權規則、熱點規則等,都需要使用類似的方式,修改 com.alibaba.csp.sentinel.dashboard.controller 包中對應的Controller,才能實現持久化。
 

七、懶人包

筆者已經基於Sentinel Dashboard 1.6.2做了修改,爲如下規則提供了持久化:

  • 流控規則
  • 降級規則
  • 系統規則
  • 授權規則
  • 參數熱點規則

GitHub地址:https://github.com/eacdy/Sentinel-Dashboard-Nacos ,使用1.6.2-NACOS分支即可。

使用說明:https://github.com/eacdy/Sentinel-Dashboard-Nacos/releases

修改的文件:
img

八、推模式優缺點分析

  • 優點
    • 規則持久化
    • 一致性好
    • 性能優秀
  • 改動多、並且麻煩
  • 引入額外的依賴(Nacos)

九、參考文檔

https://www.imooc.com/article/289464

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章