前面,已經為Sentinel實現了 Alibaba Sentinel 規則持久化-拉模式-手把手教程(基於文件) ,本文來實現基於
推模式的規則持久化。一、推模式架構圖
TIPS
圖片來自官方。
引用自 https://github.com/alibaba/Sentinel/wiki/在生產環境中使用-Sentinel
二、原理簡述
控制檯推送規則:
•將規則推送到Nacos或其他遠程配置中心
•Sentinel客戶端鏈接Nacos,獲取規則配置;並監聽Nacos配置變化,如發生變化,就更新本地緩存(從而讓本地緩存總是和Nacos一致)
控制檯監聽Nacos配置變化,如發生變化就更新本地緩存(從而讓控制檯本地緩存總是和Nacos一致)
三、微服務改造
1 加依賴
<dependency>
<groupid>com.alibaba.csp/<groupid>
<artifactid>sentinel-datasource-nacos/<artifactid>
/<dependency>
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
rule-type: param-flow
四、Sentinel控制檯改造
控制檯改造主要是為規則實現
•DynamicRuleProvider:從Nacos上讀取配置
•DynamicRulePublisher:將規則推送到Nacos上
1 修改pom.xml,找到:
<dependency>
<groupid>com.alibaba.csp/<groupid>
<artifactid>sentinel-datasource-nacos/<artifactid>
<scope>test/<scope>
/<dependency>
將 <scope>test/<scope> 這一行註釋掉,即改為如下:
<dependency>
<groupid>com.alibaba.csp/<groupid>
<artifactid>sentinel-datasource-nacos/<artifactid>
/<dependency>
2 找到 sentinel-dashboard/src/test/java/com/alibaba/csp/sentinel/dashboard/rule/nacos目錄,將整個目錄拷貝到 sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/nacos,如圖:
3 修改 com.alibaba.csp.sentinel.dashboard.controller.v2.FlowControllerV2 ,找到
@Autowired
@Qualifier("flowRuleDefaultProvider")
private DynamicRuleProvider<list>> ruleProvider;
@Autowired
@Qualifier("flowRuleDefaultPublisher")
private DynamicRulePublisher<list>> rulePublisher;
/<list>/<list>
修改為:
@Autowired
@Qualifier("flowRuleNacosProvider")
private DynamicRuleProvider<list>> ruleProvider;
@Autowired
@Qualifier("flowRuleNacosPublisher")
private DynamicRulePublisher<list>> rulePublisher;
/<list>/<list>
4 修改 sentinel-dashboard/src/main/webapp/resources/app/scripts/directives/sidebar/sidebar.html,找到:
把註釋解開,即改為:
齊活兒啦!終於把流控規則改造成推模式持久化啦!
五、編譯 & 啟動
•執行 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] ,使用1.6.2-NACOS分支即可。
使用說明:https://github.com/eacdy/Sentinel-Dashboard-Nacos/releases[2]
修改的文件:
九、推模式優缺點分析
優點:
•規則持久化
•一致性好
•性能優秀
缺點:
•改動多、並且麻煩
•引入額外的依賴(Nacos)
十、參考文檔
https://github.com/alibaba/Sentinel/wiki/在生產環境中使用-Sentinel#pull模式
閱讀更多 IT牧場 的文章