前面兩篇部落格分别介紹了修改Sentinel用戶端,修改Sentinel控制台代碼,實作了在控制台添加限流規則,控制台将限流規則推送到Nacos Server。用戶端配置了Nacos資料源,并且配置了監聽器,Nacos Server的規則發生變化,用戶端會自動更新限流規則。進而實作了Sentinel的“推模式”。流程如現圖所示:
這篇部落格将介紹降級規則推送到Nacos,并且給大家實作的demo,大家可以自己導入工程檢視
demo:https://github.com/xujingle1995/Learn-SpringCloudAlibaba/tree/master/sentinel-client-nacos-flow-degrade
下面介紹降級規則推送到Nacos Server的修改步驟:(是在前面已經完成限流規則推送的控制台代碼基礎上繼續修改的)
修改工具類
添加降級規則字尾
public static final String DEGRADE_DATA_ID_POSTFIX = "-degrade-rules";
添加降級規則推送類
修改Provider和Publisher類,修改下面方框框到的位置
注入降級規則轉換器
規則轉換器是負責将降級規則對象轉換為json字元串
添加注入兩個轉換器
@Bean
public Converter<List<DegradeRuleEntity>, String> degradeRuleEntityEncoder() {
return JSON::toJSONString;
}
@Bean
public Converter<String, List<DegradeRuleEntity>> degradeRuleEntityDecoder() {
return s -> JSON.parseArray(s, DegradeRuleEntity.class);
}
修改Controller
使用NacosPublisher推送規則,代替之前的直接推送到Sentinel用戶端的方式
自動裝配provider以及publisher
@Autowired
@Qualifier("degradeRuleNacosProvider")
private DynamicRuleProvider<List<DegradeRuleEntity>> provider;
@Autowired
@Qualifier("degradeRuleNacosPublisher")
private DynamicRulePublisher<List<DegradeRuleEntity>> publisher;
修改Controller的publishRules方法
private boolean publishRules(String app, String ip, Integer port) {
List<DegradeRuleEntity> rules = repository.findAllByMachine(MachineInfo.of(app, ip, port));
try {
publisher.publish(app, rules);
logger.info("推送限流規則到Nacos資料源成功{}", JSON
.toJSONString(rules.stream().map(DegradeRuleEntity::toDegradeRule).collect(Collectors.toList())));
return true;
} catch (Exception e) {
logger.info("推送限流規則到Nacos資料源失敗{}", JSON
.toJSONString(rules.stream().map(DegradeRuleEntity::toDegradeRule).collect(Collectors.toList())));
e.printStackTrace();
return false;
// return sentinelApiClient.setDegradeRuleOfMachine(app, ip, port,
// rules);
}
}
以上就完成了控制台的修改
以上是在之前降級規則推送修改基礎之上,大家可以自行下載下傳demo來看一下
下面我們開始修改用戶端,也是在之前流控規則完成的基礎上 :
修改配置檔案
添加如下配置:
spring.cloud.sentinel.datasource.ds3.nacos.server-addr=172.16.10.40:8848
spring.cloud.sentinel.datasource.ds3.nacos.dataId=sentinel-client-degrade-rules
spring.cloud.sentinel.datasource.ds3.nacos.groupId=SENTINEL_GROUP
spring.cloud.sentinel.datasource.ds3.nacos.data-type=json
spring.cloud.sentinel.datasource.ds3.nacos.rule-type=degrade
修改配置類DataSourceInitFunc:
@Bean
public DataSourceInitFunc init() throws Exception {
logger.info("[NacosSource初始化,從Nacos中擷取熔斷規則]");
sentinelProperties.getDatasource().entrySet().stream().filter(map -> {
return map.getValue().getNacos() != null;
}).forEach(map -> {
NacosDataSourceProperties nacos = map.getValue().getNacos();
// 限流規則,需要Nacos的dataId中包含flow字元串
if(nacos.getDataId().contains("flow")){
ReadableDataSource<String, List<FlowRule>> flowRuleDataSource = new NacosDataSource<>(nacos.getServerAddr(),
nacos.getGroupId(), nacos.getDataId(),
source -> JSON.parseObject(source, new TypeReference<List<FlowRule>>() {
}));
FlowRuleManager.register2Property(flowRuleDataSource.getProperty());
}
// 降級規則,需要Nacos的dataId中包含degrade字元串
if(nacos.getDataId().contains("degrade")){
ReadableDataSource<String, List<DegradeRule>> flowRuleDataSource = new NacosDataSource<>(nacos.getServerAddr(),
nacos.getGroupId(), nacos.getDataId(),
source -> JSON.parseObject(source, new TypeReference<List<DegradeRule>>() {
}));
DegradeRuleManager.register2Property(flowRuleDataSource.getProperty());
}
});
return new DataSourceInitFunc();
}
測試
啟動用戶端以及控制台
請求:http://localhost:8090/actuator/sentinel
可以檢視到用戶端的啟動時從Nacos中加載的所有規則
如下圖所示:
打開控制台界面,點選熔斷規則界面
如下圖所示,可以看到啟動時,從Nacos中記載了三條熔斷規則
添加新的熔斷規則
添加後重新整理,可以看到新添加了一條
檢視Nacos Server ,可以看到已經添加上了
重新請求localhost:8090/actuator/sentinel
可以看到我們新添加的熔斷規則了: