栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

sentinel动态数据源接入

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

sentinel动态数据源接入

动态数据源接入apollo
  1. sentinel的配置规则通过map的数据结构存储的内存中,当服务器重启后,规则就会失效。所以需要将规则进行持久化存储。

  2. 部门中使用的配置中心是apollo,并且apollo具有监听配置变化事件的功能。

改造sentinel-dashboard 创建修改规则推送到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后,客户端需要从apollo实时读取规则。

  1. 引入jar

    
        com.alibaba.csp
        sentinel-datasource-apollo
        1.8.1
    
    
  2. 注册规则,通过实现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”}’

  1. sentinel官方文档:https://sentinelguard.io/zh-cn/docs/quick-start.html
  2. sentinel和hystrix:https://mp.weixin.qq.com/s/D8RKfnzofM-br_y4fTLIaA
  3. ognl官网:https://commons.apache.org/proper/commons-ognl/language-guide.html
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/832146.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号