前面两篇博客分别介绍了修改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
可以看到我们新添加的熔断规则了: