本文實現基於拉模式的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
,如圖:
修改 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> 流控規則 V1</a>-->
<!--</li>-->
把註釋解開,即改爲:
<li ui-sref-active="active">
<a ui-sref="dashboard.flow({app: entry.app})">
<i class="glyphicon glyphicon-filter"></i> 流控規則 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
修改的文件:
八、推模式優缺點分析
- 優點
- 規則持久化
- 一致性好
- 性能優秀
- 改動多、並且麻煩
- 引入額外的依賴(Nacos)
九、參考文檔
https://www.imooc.com/article/289464