SpringCloud Alibaba Sentinel限流熔断降级(六)--------------控制台推送限流\熔断规则到Nacos数据源

前面两篇博客分别介绍了修改Sentinel客户端,修改Sentinel控制台代码,实现了在控制台添加限流规则,控制台将限流规则推送到Nacos  Server。客户端配置了Nacos数据源,并且配置了监听器,Nacos Server的规则发生变化,客户端会自动更新限流规则。从而实现了Sentinel的“推模式”。流程如现图所示:

SpringCloud Alibaba Sentinel限流熔断降级(六)--------------控制台推送限流\熔断规则到Nacos数据源_第1张图片


这篇博客将介绍降级规则推送到Nacos,并且给大家实现的demo,大家可以自己导入工程查看

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

SpringCloud Alibaba Sentinel限流熔断降级(六)--------------控制台推送限流\熔断规则到Nacos数据源_第2张图片


 

下面介绍降级规则推送到Nacos Server的修改步骤:(是在前面已经完成限流规则推送的控制台代码基础上继续修改的) 

修改工具类


SpringCloud Alibaba Sentinel限流熔断降级(六)--------------控制台推送限流\熔断规则到Nacos数据源_第3张图片
添加降级规则后缀

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

 

添加降级规则推送类

SpringCloud Alibaba Sentinel限流熔断降级(六)--------------控制台推送限流\熔断规则到Nacos数据源_第4张图片

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

 SpringCloud Alibaba Sentinel限流熔断降级(六)--------------控制台推送限流\熔断规则到Nacos数据源_第5张图片

SpringCloud Alibaba Sentinel限流熔断降级(六)--------------控制台推送限流\熔断规则到Nacos数据源_第6张图片

注入降级规则转换器 

规则转换器是负责将降级规则对象转换为json字符串

SpringCloud Alibaba Sentinel限流熔断降级(六)--------------控制台推送限流\熔断规则到Nacos数据源_第7张图片

添加注入两个转换器

    @Bean
    public Converter, String> degradeRuleEntityEncoder() {
        return JSON::toJSONString;
    }

    @Bean
    public Converter> degradeRuleEntityDecoder() {
        return s -> JSON.parseArray(s, DegradeRuleEntity.class);
    }

 修改Controller

使用NacosPublisher推送规则,代替之前的直接推送到Sentinel客户端的方式

SpringCloud Alibaba Sentinel限流熔断降级(六)--------------控制台推送限流\熔断规则到Nacos数据源_第8张图片

自动装配provider以及publisher 

	@Autowired
	@Qualifier("degradeRuleNacosProvider")
	private DynamicRuleProvider> provider;

	@Autowired
	@Qualifier("degradeRuleNacosPublisher")
	private DynamicRulePublisher> publisher;

 修改Controller的publishRules方法

private boolean publishRules(String app, String ip, Integer port) {
	List 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> flowRuleDataSource = new NacosDataSource<>(nacos.getServerAddr(),
					nacos.getGroupId(), nacos.getDataId(),
					source -> JSON.parseObject(source, new TypeReference>() {
					}));
			FlowRuleManager.register2Property(flowRuleDataSource.getProperty());
		}
		
		// 降级规则,需要Nacos的dataId中包含degrade字符串
		if(nacos.getDataId().contains("degrade")){
			ReadableDataSource> flowRuleDataSource = new NacosDataSource<>(nacos.getServerAddr(),
					nacos.getGroupId(), nacos.getDataId(),
					source -> JSON.parseObject(source, new TypeReference>() {
					}));
			DegradeRuleManager.register2Property(flowRuleDataSource.getProperty());
		}
		
	});
	return new DataSourceInitFunc();
}

测试

 启动客户端以及控制台

请求:http://localhost:8090/actuator/sentinel

可以查看到客户端的启动时从Nacos中加载的所有规则

如下图所示:

打开控制台界面,点击熔断规则界面

如下图所示,可以看到启动时,从Nacos中记载了三条熔断规则 

SpringCloud Alibaba Sentinel限流熔断降级(六)--------------控制台推送限流\熔断规则到Nacos数据源_第9张图片

 添加新的熔断规则

SpringCloud Alibaba Sentinel限流熔断降级(六)--------------控制台推送限流\熔断规则到Nacos数据源_第10张图片

添加后刷新,可以看到新添加了一条

SpringCloud Alibaba Sentinel限流熔断降级(六)--------------控制台推送限流\熔断规则到Nacos数据源_第11张图片

查看Nacos Server ,可以看到已经添加上了

重新请求localhost:8090/actuator/sentinel

可以看到我们新添加的熔断规则了:

 SpringCloud Alibaba Sentinel限流熔断降级(六)--------------控制台推送限流\熔断规则到Nacos数据源_第12张图片

你可能感兴趣的:(springcloud,alibaba)