Spring Cloud Alibaba基础教程:Sentinel Dashboard中修改规则同步到Apollo

在之前的两篇教程中我们分别介绍了如何将Sentinel的限流规则存储到Nacos和Apollo中。同时,在文末的思考中,我都指出了这两套整合方案都存在一个不足之处:不论采用什么配置中心,限流规则都只能通过Nacos界面或Apollo界面来完成修改才能得到持久化存储,而在Sentinel Dashboard中修改限流规则虽然可以生效,但是不会被持久化到配置中心。而在这两个配置中心里存储的数据是一个Json格式,当存储的规则越来越多,对该Json配置的可读性与可维护性会变的越来越差。所以,下面我们就来继续探讨这个不足之处,并给出相应的解决方案。本文以Apollo存储为例,下一篇介绍Nacos的改在示例。

问题分析

在实际操作之前,我们先通过下图了解一下之前我们所实现的限流规则持久化方案的配置数据流向图:

upload successful

  • 蓝色箭头代表了限流规则由配置中心发起修改的更新路径
  • 橙色箭头代表了限流规则由Sentinel Dashboard发起修改的更新路径

从图中可以很明显的看到,Sentinel Dashboard与业务服务之间本身是可以互通获取最新限流规则的,这在没有整合配置中心来存储限流规则的时候就已经存在这样的机制。最主要的区别是:配置中心的修改都可以实时的刷新到业务服务,从而被Sentinel Dashboard读取到,但是对于这些规则的更新到达各个业务服务之后,并没有一个机制去同步到配置中心,作为配置中心的客户端也不会提供这样的逆向更新方法。

改造方案

关于如何改造,现来解读一下官方文档中关于这部分的说明:

要通过 Sentinel 控制台配置集群流控规则,需要对控制台进行改造。我们提供了相应的接口进行适配。

从 Sentinel 1.4.0 开始,我们抽取出了接口用于向远程配置中心推送规则以及拉取规则:

  • DynamicRuleProvider : 拉取规则
  • DynamicRulePublisher : 推送规则

对于集群限流的场景,由于每个集群限流规则都需要唯一的 flowId,因此我们建议所有的规则配置都通过动态规则源进行管理,并在统一的地方生成集群限流规则。

我们提供了新版的流控规则页面,可以针对应用维度推送规则,对于集群限流规则可以自动生成 flowId。用户只需实现 DynamicRuleProvider 和 DynamicRulePublisher 接口,即可实现应用维度推送(URL: /v2/flow)。

这段内容什么意思呢?简单的说就是Sentinel Dashboard通过DynamicRuleProviderDynamicRulePublisher两个接口来获取和更新应用的动态规则。默认情况下,就如上一节中Sentinel Dashboard与各业务服务之间的两个箭头,一个接口负责获取规则,一个接口负责更新规则。

所以,只需要通过这两个接口,实现对配置中心中存储规则的读写,就能实现Sentinel Dashboard中修改规则与配置中心存储同步的效果。

具体的配置数据流向图如下:

upload successful

其中,绿色箭头为公共公共部分,即:不论从培中心修改,还是从Sentinel Dashboard修改都会触发的操作。这样的话,从上图的两处修改起点看,所有涉及的部分都能获取到一致的限流规则了。

代码实现

下面继续说说具体的代码实现,这里参考了Sentinel Dashboard源码中关于Apollo实现的测试用例。但是由于考虑到与Spring Cloud Alibaba的结合使用,略作修改。

第一步:修改pom.xml中的Apollo OpenAPi的依赖,将<scope>test</scope>注释掉,这样才能在主程序中使用。

<dependency>
<groupId>com.ctrip.framework.apollo</groupId>
<artifactId>apollo-openapi</artifactId>
<version>1.2.0</version>
<!--<scope>test</scope>-->
</dependency>

第二步:找到resources/app/scripts/directives/sidebar/sidebar.html中的这段代码:

<li ui-sref-active="active">
<a ui-sref="dashboard.flowV1({app: entry.app})">
<i class="glyphicon glyphicon-filter"></i>&nbsp;&nbsp;流控规则
</a>
</li>

修改为:

<li ui-sref-active="active">
<a ui-sref="dashboard.flow({app: entry.app})">
<i class="glyphicon glyphicon-filter"></i>&nbsp;&nbsp;流控规则
</a>
</li>

第三步:在com.alibaba.csp.sentinel.dashboard.rule包下新建一个apollo包,用来编写针对Apollo的扩展实现。

第四步:创建Apollo的配置类,定义Apollo的portal访问地址以及第三方应用访问的授权Token(通过Apollo管理员账户登录,在“开放平台授权管理”功能中创建),具体代码如下:

@Configuration
public class ApolloConfig {

@Bean
public Converter<List<FlowRuleEntity>, String> flowRuleEntityEncoder() {
return JSON::toJSONString;
}

@Bean
public Converter<String, List<FlowRuleEntity>> flowRuleEntityDecoder() {
return s -> JSON.parseArray(s, FlowRuleEntity.class);
}

@Bean
public ApolloOpenApiClient apolloOpenApiClient() {
ApolloOpenApiClient client = ApolloOpenApiClient.newBuilder()
.withPortalUrl("https://apollo.xxx.com") // TODO 根据实际情况修改
.withToken("open api token") // TODO 根据实际情况修改
.build();
return client;
}

}

第五步:实现Apollo的配置拉取实现。

@Component("flowRuleApolloProvider")
public class FlowRuleApolloProvider implements DynamicRuleProvider<List<FlowRuleEntity>> {

@Autowired
private ApolloOpenApiClient apolloOpenApiClient;
@Autowired
private Converter<String, List<FlowRuleEntity>> converter;

@Value("${env:DEV}")
private String env;

@Override
public List<FlowRuleEntity> getRules(String appName) throws Exception {
// flowDataId对应
String flowDataId = "sentinel.flowRules";
OpenNamespaceDTO openNamespaceDTO = apolloOpenApiClient.getNamespace(appName, env, "default", "application");
String rules = openNamespaceDTO
.getItems()
.stream()
.filter(p -> p.getKey().equals(flowDataId))
.map(OpenItemDTO::getValue)
.findFirst()
.orElse("");

if (StringUtil.isEmpty(rules)) {
return new ArrayList<>();
}
return converter.convert(rules);
}
}
  • getRules方法中的appName参数是Sentinel中的服务名称,这里直接通过这个名字获取Apollo配置是由于Apollo中的项目AppId与之一致,如果存在不一致的情况,则需要自己做转换。
  • 这里注入了一个env属性,主要由于我们在使用Apollo的时候,通过启动参数来控制不同环境。所以这样就能在不同环境区分不同的限流配置了。
  • 这里的flowDataId对应各个微服务应用中定义的spring.cloud.sentinel.datasource.ds.apollo.flowRulesKey配置,即:Apollo中使用了什么key来存储限流配置。
  • 其他如Cluster、Namepsace都采用了默认值:default和application,这个读者有特殊需求可以做对应的修改。

第六步:实现Apollo的配置推送实现。

@Component("flowRuleApolloPublisher")
public class FlowRuleApolloPublisher implements DynamicRulePublisher<List<FlowRuleEntity>> {

@Autowired
private ApolloOpenApiClient apolloOpenApiClient;
@Autowired
private Converter<List<FlowRuleEntity>, String> converter;

@Value("${env:DEV}")
private String env;

@Override
public void publish(String app, List<FlowRuleEntity> rules) throws Exception {
String flowDataId = "sentinel.flowRules";

AssertUtil.notEmpty(app, "app name cannot be empty");
if (rules == null) {
return;
}

OpenItemDTO openItemDTO = new OpenItemDTO();
openItemDTO.setKey(flowDataId);
openItemDTO.setValue(converter.convert(rules));
openItemDTO.setComment("modify by sentinel-dashboard");
openItemDTO.setDataChangeCreatedBy("apollo");
apolloOpenApiClient.createOrUpdateItem(app, env, "default", "application", openItemDTO);

// Release configuration
NamespaceReleaseDTO namespaceReleaseDTO = new NamespaceReleaseDTO();
namespaceReleaseDTO.setEmergencyPublish(true);
namespaceReleaseDTO.setReleaseComment("release by sentinel-dashboard");
namespaceReleaseDTO.setReleasedBy("apollo");
namespaceReleaseDTO.setReleaseTitle("release by sentinel-dashboard");
apolloOpenApiClient.publishNamespace(app, env, "default", "application", namespaceReleaseDTO);
}
}
  • 这里的大部分内容,如:env、flowDataId、app说明与上一步中的实现一致
  • openItemDTO.setDataChangeCreatedBy("apollo");namespaceReleaseDTO.setReleasedBy("apollo");这两句需要注意一下,必须设置存在并且有权限的用户,不然会更新失败。

第七步:修改com.alibaba.csp.sentinel.dashboard.controller.v2.FlowControllerV2DynamicRuleProviderDynamicRulePublisher注入的Bean,改为上面我们编写的针对Apollo的实现:

@Autowired
@Qualifier("flowRuleApolloProvider")
private DynamicRuleProvider<List<FlowRuleEntity>> ruleProvider;
@Autowired
@Qualifier("flowRuleApolloPublisher")
private DynamicRulePublisher<List<FlowRuleEntity>> rulePublisher;

代码示例

本文介绍内容的客户端代码,示例读者可以通过查看下面仓库中的alibaba-sentinel-dashboard-apollo项目:

  • Github:https://github.com/dyc87112/SpringCloud-Learning/
  • Gitee:https://gitee.com/didispace/SpringCloud-Learning/

如果您对这些感兴趣,欢迎star、follow、收藏、转发给予支持!

系列回顾

  • 《Spring Cloud Alibaba基础教程:使用Nacos实现服务注册与发现》
  • 《Spring Cloud Alibaba基础教程:支持的几种服务消费方式》
  • 《Spring Cloud Alibaba基础教程:使用Nacos作为配置中心》
  • 《Spring Cloud Alibaba基础教程:Nacos配置的加载规则详解》
  • 《Spring Cloud Alibaba基础教程:Nacos配置的多环境管理》
  • 《Spring Cloud Alibaba基础教程:Nacos配置的多文件加载与共享配置》
  • 《Spring Cloud Alibaba基础教程:Nacos的数据持久化》
  • 《Spring Cloud Alibaba基础教程:Nacos的集群部署》
  • 《Spring Cloud Alibaba基础教程:使用Sentinel实现接口限流》
  • 《Spring Cloud Alibaba基础教程:Sentinel使用Nacos存储规则》
  • 《Spring Cloud Alibaba基础教程:Sentinel使用Apollo存储规则》

专题推荐

  • Spring Boot基础教程
  • Spring Cloud基础教程

money.jpg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/477756.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

中科院科研人员自白:我为什么离开北京

文 | 榴莲EDU源 | 知乎北大本硕博毕业&#xff0c;毕业到中科院北京某所。今年是我工作第三年&#xff0c;年前刚刚调动了工作&#xff0c;转战南京某高校。为什么&#xff1f;细说起来一大堆&#xff0c;总结起来就两个字&#xff1a;房子。上学的时候不了解墙外的世界&#x…

评测通知 | 2022年全国知识图谱与语义计算大会评测任务发布

一、任务简介CCKS技术评测旨在为研究人员提供测试知识图谱与语义计算技术、算法、及系统的平台和资源&#xff0c;促进国内知识图谱领域的技术发展&#xff0c;以及学术成果与产业需求的融合和对接。去年&#xff0c;CCKS 2021评测竞赛环节共设立了5个主题共计14个任务&#xf…

Spring Cloud Alibaba基础教程版本升级:0.2.1-gt;0.2.2

最近Spring Cloud Alibaba发布了最新版本&#xff0c;其中包含了一些比较重要的内容&#xff0c;比如&#xff1a;Nacos 1.0.0支持&#xff0c;Dubbo的支持等。所以把之前的系列文章中内容以及代码案例都做了升级&#xff0c;其中包括&#xff1a; Spring Cloud Alibaba 从 0.…

Google掀桌了,GLUE基准的时代终于过去了?

文 | Severus大家好&#xff0c;我是Severus&#xff0c;一个在某厂做中文文本理解的老程序员。今年11月&#xff0c;Google 在 NeurIPS2021 投稿了一篇文章&#xff0c;名为 AI and the Everything in the Whole Wide World Benchmark&#xff0c;矛头直指评估AI模型“通用”能…

技术动态 | W3C计划成立RDF-star工作组

转载公众号 | W3C资讯W3C 计划成立 RDF-star 工作组&#xff0c;现开始筹备小组工作章程&#xff0c;界定标准化范畴及工作模式。详情参见以下章程草案&#xff1a;https://w3c.github.io/rdf-star-wg-charter/RDF-star&#xff08;最初拼写为 RDF*&#xff09;是 RDF 的一种扩…

LeetCode 1282. 用户分组(桶排序思想)

1. 题目 有 n 位用户参加活动&#xff0c;他们的 ID 从 0 到 n - 1&#xff0c;每位用户都 恰好 属于某一用户组。给你一个长度为 n 的数组 groupSizes&#xff0c;其中包含每位用户所处的用户组的大小&#xff0c;请你返回用户分组情况&#xff08;存在的用户组以及每个组中用…

Spring Cloud Alibaba 新版本发布:众多期待内容整合打包加入!

在Nacos 1.0.0 Release之后&#xff0c;Spring Cloud Alibaba也终于发布了最新的版本。该版本距离上一次发布&#xff0c;过去了整整4个月&#xff01;下面就随我一起看看&#xff0c;这个大家期待已久的版本都有哪些内容值得我们关注。 版本变化 之前在《Spring Cloud Aliba…

MSRA-万字综述 直击多模态文档理解

文 | 付奶茶随着最近几年多模态大火的&#xff0c;越来越多的任务都被推陈出新为多模态版本。譬如&#xff0c;传统对话任务&#xff0c;推出了考虑视觉信息的多模态数据集&#xff1b;事件抽取&#xff0c;也推出视频形式的多模态版本&#xff1b;就连 grammar induction&…

LeetCode 991. 坏了的计算器(逆向思考)

1. 题目 在显示着数字的坏计算器上&#xff0c;我们可以执行以下两种操作&#xff1a; 双倍&#xff08;Double&#xff09;&#xff1a;将显示屏上的数字乘 2&#xff1b;递减&#xff08;Decrement&#xff09;&#xff1a;将显示屏上的数字减 1 。 最初&#xff0c;计算器…

Spring Cloud Alibaba基础教程:Sentinel使用Apollo存储规则

上一篇我们介绍了如何通过Nacos的配置功能来存储限流规则。Apollo是国内用户非常多的配置中心&#xff0c;所以&#xff0c;今天我们继续说说Spring Cloud Alibaba Sentinel中如何将流控规则存储在Apollo中。 使用Apollo存储限流规则 Sentinel自身就支持了多种不同的数据源来…

评测 | CCKS2022-面向数字商务的知识图谱比赛重磅上线,奖金等你来拿!

转载公众号 | 夕小瑶的卖萌屋CCKS 2022面向数字商务的知识图谱评测赛题介绍阿里巴巴商品数据规模庞大&#xff0c;商品知识图谱为海量异构的商品数据的组织、管理和利用提供了有效的方式。商品数据模态丰富&#xff0c;动态性高&#xff0c;数据存在噪声&#xff0c;这些都对商…

安利几个优质NLP开源项目!搜索、问答、情感分析…

自然语言处理技术在各行业有着广泛的应用&#xff0c;然而长久以来&#xff0c;其落地并不是一帆风顺的。针对这些棘手的问题&#xff0c;百度飞桨深耕产业界&#xff0c;选取NLP领域三大高频场景——检索、问答、情感分析&#xff0c;推出面向真实应用场景的系统功能&#xff…

Spring Cloud Alibaba基础教程:Sentinel使用Nacos存储规则

通过上一篇《使用Sentinel实现接口限流》的介绍&#xff0c;相信大家对Sentinel已经有了初步的认识。在Spring Cloud Alibaba的整合封装之下&#xff0c;接口限流这件事情可以非常轻易的整合到我们的Spring Cloud应用中。但是&#xff0c;通过上篇的整合&#xff0c;依然还不能…

LeetCode 539. 最小时间差(哈希)

1. 题目 给定一个 24 小时制&#xff08;小时:分钟&#xff09;的时间列表&#xff0c;找出列表中任意两个时间的最小时间差并已分钟数表示。 示例 1&#xff1a; 输入: ["23:59","00:00"] 输出: 1备注: 列表中时间数在 2~20000 之间。 每个时间取值在 0…

论文浅尝 | Seq2Seq 知识图谱补全与问答

笔记整理&#xff1a;李行&#xff0c;天津大学硕士论文题目&#xff1a;Sequence-to-Sequence Knowledge Graph Completion and Question Answering链接&#xff1a;https://arxiv.org/pdf/2203.10321.pdf动机知识图嵌入 (KGE) 模型用低维嵌入向量表示知识图 (KG) 的每个实体和…

刀功:谈推荐系统特征工程中的几个高级技巧

前言记得我入算法这一行的第一份工作面试的时候&#xff0c;最终的boss面的面试官是前微软工程院的副院长。面试进行得很顺利&#xff0c;不免向前院长卖弄一番&#xff0c;谈了谈我对算法的理解。我说算法工程师就好比厨师&#xff0c;模型是灶上功夫&#xff0c;而数据预处理…

Spring Cloud Alibaba基础教程:使用Sentinel实现接口限流

最近管点闲事浪费了不少时间&#xff0c;感谢网友libinwalan的留言提醒。及时纠正路线&#xff0c;继续跟大家一起学习Spring Cloud Alibaba。 Nacos作为注册中心和配置中心的基础教程&#xff0c;到这里先告一段落&#xff0c;后续与其他结合的内容等讲到的时候再一起拿出来说…

【报名开启】CCKS2022技术评测任务五“开放知识图谱问答”

转载公众号 | 图谱学苑CCKS2022评测任务五&#xff1a;开放知识图谱问答评测在线报名通道正式开启请通过扫描下方二维码或点击文末阅读原文填写报名信息欢迎大家踊跃报名参赛任务五&#xff1a;开放知识图谱问答任务描述&#xff1a;在互联网软硬件相关技术飞速发展的今天&…

年末回顾:2021年 AI 领域十大研究趋势及必读论文

编 | 小轶&#xff0c;Yimin_饭煲在本文中&#xff0c;我们将梳理近百篇的最新深度学习论文&#xff0c;以总结出“2021 年十大 AI 研究趋势”。AI 领域的论文可谓层出不穷。这篇文章或许能帮助你跟踪总体趋势和重要研究。下文中提及的部分工作可能并不发表于 2021 年&#xff…

LeetCode 445. 两数相加 II(链表大数加法)

1. 题目 给定两个非空链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储单个数字。将这两数相加会返回一个新的链表。 你可以假设除了数字 0 之外&#xff0c;这两个数字都不会以零开头。 进阶: 如果输入链表不能修改该如何处理&#xff1f;换句话…