天天看點

SpringCloud Alibaba Sentinel限流熔斷降級(六)--------------控制台推送限流\熔斷規則到Nacos資料源

前面兩篇部落格分别介紹了修改Sentinel用戶端,修改Sentinel控制台代碼,實作了在控制台添加限流規則,控制台将限流規則推送到Nacos  Server。用戶端配置了Nacos資料源,并且配置了監聽器,Nacos Server的規則發生變化,用戶端會自動更新限流規則。進而實作了Sentinel的“推模式”。流程如現圖所示:

SpringCloud Alibaba Sentinel限流熔斷降級(六)--------------控制台推送限流\熔斷規則到Nacos資料源

這篇部落格将介紹降級規則推送到Nacos,并且給大家實作的demo,大家可以自己導入工程檢視

demo:https://github.com/xujingle1995/Learn-SpringCloudAlibaba/tree/master/sentinel-client-nacos-flow-degrade

SpringCloud Alibaba Sentinel限流熔斷降級(六)--------------控制台推送限流\熔斷規則到Nacos資料源

下面介紹降級規則推送到Nacos Server的修改步驟:(是在前面已經完成限流規則推送的控制台代碼基礎上繼續修改的) 

修改工具類

SpringCloud Alibaba Sentinel限流熔斷降級(六)--------------控制台推送限流\熔斷規則到Nacos資料源

添加降級規則字尾

public static final String DEGRADE_DATA_ID_POSTFIX = "-degrade-rules";
           

添加降級規則推送類
SpringCloud Alibaba Sentinel限流熔斷降級(六)--------------控制台推送限流\熔斷規則到Nacos資料源

 修改Provider和Publisher類,修改下面方框框到的位置

SpringCloud Alibaba Sentinel限流熔斷降級(六)--------------控制台推送限流\熔斷規則到Nacos資料源
SpringCloud Alibaba Sentinel限流熔斷降級(六)--------------控制台推送限流\熔斷規則到Nacos資料源

注入降級規則轉換器 

規則轉換器是負責将降級規則對象轉換為json字元串

SpringCloud Alibaba Sentinel限流熔斷降級(六)--------------控制台推送限流\熔斷規則到Nacos資料源

添加注入兩個轉換器

@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用戶端的方式

SpringCloud Alibaba Sentinel限流熔斷降級(六)--------------控制台推送限流\熔斷規則到Nacos資料源

自動裝配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中加載的所有規則

如下圖所示:

SpringCloud Alibaba Sentinel限流熔斷降級(六)--------------控制台推送限流\熔斷規則到Nacos資料源

打開控制台界面,點選熔斷規則界面

如下圖所示,可以看到啟動時,從Nacos中記載了三條熔斷規則 

SpringCloud Alibaba Sentinel限流熔斷降級(六)--------------控制台推送限流\熔斷規則到Nacos資料源

 添加新的熔斷規則

SpringCloud Alibaba Sentinel限流熔斷降級(六)--------------控制台推送限流\熔斷規則到Nacos資料源

添加後重新整理,可以看到新添加了一條

SpringCloud Alibaba Sentinel限流熔斷降級(六)--------------控制台推送限流\熔斷規則到Nacos資料源

檢視Nacos Server ,可以看到已經添加上了

SpringCloud Alibaba Sentinel限流熔斷降級(六)--------------控制台推送限流\熔斷規則到Nacos資料源

重新請求localhost:8090/actuator/sentinel

可以看到我們新添加的熔斷規則了:

SpringCloud Alibaba Sentinel限流熔斷降級(六)--------------控制台推送限流\熔斷規則到Nacos資料源

繼續閱讀