-
sentinel的配置规则通过map的数据结构存储的内存中,当服务器重启后,规则就会失效。所以需要将规则进行持久化存储。
-
部门中使用的配置中心是apollo,并且apollo具有监听配置变化事件的功能。
实现DynamicRulePublisher,通过apollo的openapi接口实现配置项的操作。核心代码如下:
// 创建或者更新配置项
String flowDataId = ApolloConfigUtil.getFlowDataId(app);
OpenItemDTO openItemDTO = new OpenItemDTO();
openItemDTO.setKey(flowDataId);
openItemDTO.setValue(converter.convert(rules));
openItemDTO.setComment("由400操作");
openItemDTO.setDataChangeCreatedBy("400");
apolloOpenApiClient.createOrUpdateItem(sentinelClientAppId, apolloEvn, "default", "public-rules", openItemDTO);
// 发布修的配置
NamespaceReleaseDTO namespaceReleaseDTO = new NamespaceReleaseDTO();
namespaceReleaseDTO.setEmergencyPublish(true);
namespaceReleaseDTO.setReleaseComment("由400操作");
namespaceReleaseDTO.setReleasedBy("400");
namespaceReleaseDTO.setReleaseTitle("由400操作");
apolloOpenApiClient.publishNamespace(sentinelClientAppId, apolloEvn, "default", "public-rules", namespaceReleaseDTO);
客户端规则修改为从apollo获取
实现DynamicRuleProvider,通过apollo的openapi接口实现获取配置项,核心代码如下:
@Override public List实例getRules(String appName) throws Exception { String flowDataId = ApolloConfigUtil.getFlowDataId(appName); OpenItemDTO openItemDTO = apolloOpenApiClient .getItem(sentinelClientAppId, apolloEvn, "default", "public-rules", flowDataId); String rules = Objects.nonNull(openItemDTO) ? openItemDTO.getValue() : ""; if (StringUtil.isEmpty(rules)) { return new ArrayList<>(); } return converter.convert(rules); }
控制台创建规则
apollo数据
规则通过控制台操作保存到apollo后,客户端需要从apollo实时读取规则。
-
引入jar
com.alibaba.csp sentinel-datasource-apollo 1.8.1 -
注册规则,通过实现InitializingBean,在初始化bean的时候初始化规则注册,核心代码如下:
@Component public class ApolloConfigDatasource implements InitializingBean { @Override public void afterPropertiesSet() throws Exception { //流控规则 registerFlowRuleProperty("public-rules", ""); } private void registerFlowRuleProperty(String namespaceName, String defaultRules) { ReadableDataSource> flowRuleDataSource = new ApolloDataSource<>(namespaceName, "test-demo-flow-rules", defaultRules, source -> JSON.parseObject(source, new TypeReference - >() {
}));
FlowRuleManager.register2Property(flowRuleDataSource.getProperty());
}
}
新建ApolloDataSource对象的时候,会初始化apollo的配置项事件监听和加载配置。
查看内存中规则是否更新结合arthas,通过ognl查询客户端内存中的规则
流控规则命令:getstatic com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager flowRules ‘value.entrySet().iterator.{? #this.key==“hello”}’
熔断规则命令:getstatic com.alibaba.csp.sentinel.slots.block.degrade.DegradeRuleManager ruleMap ‘entrySet().iterator.{? #this.key==“hello”}’
- sentinel官方文档:https://sentinelguard.io/zh-cn/docs/quick-start.html
- sentinel和hystrix:https://mp.weixin.qq.com/s/D8RKfnzofM-br_y4fTLIaA
- ognl官网:https://commons.apache.org/proper/commons-ognl/language-guide.html



