天天看点

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数据源

继续阅读