阿里Sentinel控制台源码修改-对接Apollo规则持久化

改造背景

前面我们讲解了如何对接Apollo来持久化限流的规则,对接后可以直接通过Apollo的后台进行规则的修改,推送到各个客户端实时生效。

但还有一个问题就是Sentinel控制台没有对接Apollo,Sentinel控制台本来就可以修改限流的规则,目前存在的情况就是通过Sentinel控制台修改的配置无法更新到Apollo中,所以今天我们的主题是改造Sentinel控制台源码,对接Apollo。

配置变更模式

最原始的模式如下图:

1240

Dashboard的推送规则方式是通过 API 将规则推送至客户端并直接更新到内存中,这种做法的好处是简单,无依赖;坏处是应用重启规则就会消失,仅用于简单测试,不能用于生产环境。

我们在生产环境中需要用Push模式来进行,对于 push 模式的数据源,如远程配置中心(ZooKeeper, Nacos, Apollo等等),推送的操作不应由 Sentinel 客户端进行,而应该经控制台统一进行管理,直接进行推送,数据源仅负责获取配置中心推送的配置并更新到本地。因此推送规则正确做法应该是 配置中心控制台/Sentinel 控制台 → 配置中心 → Sentinel 数据源 → Sentinel,而不是经 Sentinel 数据源推送至配置中心。这样的流程就非常清晰了:

1240

改造步骤

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

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

我们只需要实现上面的两个规则即可实现我们想要的效果,官方对于Nacos 和 Apollo 的推送和拉取规则已经有实现好了的代码,在Dashboard源码的test目录下,我们自己改造下就可以了。

首先我们需要把源代码拉到本地,导入开发工具中,找到下面的Apollo的代码:

1240

这部分代码是在test包下,我们需要复制到main包下才行:
1240

复制过去后会发现一个问题,所有Apollo相关的import都报错,需要改下pom.xml中的配置,把scope注释掉:

  <!-- for Apollo rule publisher sample --><dependency><groupId>com.ctrip.framework.apollo</groupId><artifactId>apollo-openapi</artifactId><version>1.2.0</version><!--<scope>test</scope>--></dependency>

ApolloConfig中需要修改的有PortalUrl和token:

 @Beanpublic ApolloOpenApiClient apolloOpenApiClient() {ApolloOpenApiClient client = ApolloOpenApiClient.newBuilder().withPortalUrl("http://localhost:10034").withToken("token").build();return client;}

token的生成需要去Apollo的Portal中进行生成

1240

创建应用信息,生成token,绑定appid

1240

FlowRuleApolloProvider和FlowRuleApolloPublisher需要把Apollo的appId,env,命名空间等改成你自己想用的才行。这边就不贴代码了。

改造完之后,我们需要让控制器使用这两个新的规则,修改FlowControllerV2的@Qualifier的值,注入对应的规则对象

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

这样改完其实还没效果,因为页面上用的是FlowControllerV1的代码,你可以直接在访问uri后面加上v2来访问,但这不是很好,最好是改下页面的代码,让菜单直接跳转到新的页面去,找到下面的代码:
1240

改成下面的样子:

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

默认用的是dashboard.flowV1,这个代码可以在app.js中找到:

1240

改完之后你就可以重新将Dashboard打包啦,这样在Dashboard中修改规则的时候就会直接修改Apollo中的配置,Apollo再推送给客户端。

欢迎加入我的知识星球,一起交流技术,免费学习猿天地的课程(http://cxytiandi.com/course)

PS:目前星球中正在星主的带领下组队学习Sentinel,等你哦!

微信扫码加入猿天地知识星球

猿天地

转载于:https://www.cnblogs.com/yinjihuan/p/10708862.html

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

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

相关文章

第八节:EF Core连接MySql和Sqlite数据库

。。。 转载于:https://www.cnblogs.com/yaopengfei/p/11507557.html

Flask--WebSocket

flask websocket websocket原理 Socket&#xff1a; FTP - 文件服务 Django Flask Http - TCP: 1.一次请求 一次响应 断开 2.客户端永远处于主动状态 3.服务器永远处于被动状态 4.Http无状态 - 在服务器不保存客户端的信息 5.服务器无法主动找到客户端 1.轮询 客户端向服务器…

jQuery第一天

课程回顾&#xff1a; ​ 正则&#xff1a;匹配字符组合模式; ​ 创建&#xff1a;var reg1 new RegExp(/abc/); var reg2 /abc/; ​ 测试&#xff1a;reg1.test(‘abc’); ​ 特殊字符&#xff1a;元字符 ​ 边界符&#xff1a;^&#xff0c;$ ​ 字符类&#xff1a;[…

Python学习(一)

一、版本&#xff1a; Python2.X /Python3.x 官方宣布2020 年 1 月 1 日&#xff0c; 停止 Python 2 的更新。 Python3.x不兼容Python2.x  二、安装&#xff08;以mac 为例&#xff09; MAC 系统一般都自带有 Python2.x版本 的环境&#xff0c;你也可以在链接 https://www.py…

jQuery—淘宝精品服饰案例

<body><div class"wrapper"><ul id"left"><li><a href"#">女靴</a></li><li><a href"#">雪地靴</a></li><li><a href"#">冬裙</a>&l…

Python机器学习实践:决策树判别汽车金融违约用户

文章发布于公号【数智物语】 &#xff08;ID&#xff1a;decision_engine&#xff09;&#xff0c;关注公号不错过每一篇干货。 转自 | 法纳斯特&#xff08;公众号ID:walker398&#xff09; 作者 | 小F 决策树呈树形结构&#xff0c;是一种基本的回归和分类方法。 决策树模型的…

Python学习(二)语言基础

一、变量与类型 在程序设计中&#xff0c;变量是一种存储数据的载体 整型&#xff1a;Python中可以处理任意大小的整数浮点型&#xff1a;浮点数也就是小数字符串型&#xff1a;字符串是以单引号或双引号括起来的任意文本布尔型&#xff1a;布尔值只有True、False两种值&#x…

jQuery—tab栏切换

<div class"tab"><div class"tab_list"><ul><li class"current">商品介绍</li><li>规格与包装</li><li>售后保障</li><li>商品评价&#xff08;50000&#xff09;</li><l…

MongoDB分组查询,聚合查询,以及复杂查询

准备数据 from pymongo import MongoClient import datetimeclientMongoClient(mongodb://localhost:27017) tableclient[db1][emp]l[ (张飞,male,18,20170301,,7300.33,401,1), #以下是教学部 (张云,male,78,20150302,teacher,1000000.31,401,1), (刘备,male,81,20130305,teac…

Python学习(三)基础

一、函数与模块 定义函数&#xff1a; 函数代码块以 def 关键词开头&#xff0c;后接函数标识符名称和圆括号 ()。任何传入参数和自变量必须放在圆括号中间&#xff0c;圆括号之间可以用于定义参数。函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。函数内容以…

操作系统原理之I/O设备管理(第六章上半部分)

一、I/O系统的组成 I/O系统不仅包括各种I/O设备&#xff0c;还包括与设备相连的设备控制器&#xff0c;有些系统还配备了专⻔⽤ 于输⼊/输出控制的专⽤计算机&#xff0c;即通道。此外&#xff0c;I/O系统要通过总线与CPU、内存相连。 I/O系统的结构&#xff1a; I/O设备的分类…

js控制a标签点击事件 触发下载

问题背景&#xff0c;动态获取data把url赋值到a标签的url中&#xff0c;让a标签自动下载 首先想到的应该是$(xxx).click(), 查资料明白&#xff1a;js中的$(...).click()事件只能触发绑定的onClick方法&#xff0c;不能跳转到href。 第二种方法&#xff1a;获取到url之后locat…

操作系统原理之I/O设备管理(第六章下半部分)

五、I/O软件原理 输入输出软件的总体目标是将软件组织成一种层次结构 低层软件用来屏蔽硬件的具体细节高层软件则主要是为用户提供一个简洁、规范的界面设备管理的4个层次&#xff1a; 用户层软件 -》向系统发出I/O请求&#xff0c;显示I/O操作的结果&#xff0c;提供⽤户与设备…

jQuery第二天

课程回顾&#xff1a; ​ jQuery&#xff1a;JavaScript库 ​ 入口函数&#xff1a;$(function () {}); ​ jQuery&#xff1a;jQuery对象&#xff0c;DOM对象 ​ jQuery转成DOM&#xff1a;$(‘元素’)[索引值] ​ DOM转成jQuery&#xff1a;$(DOM对象); ​ 筛选方法&am…

切换Debug/Release编译模式和Archive的作用

&#xfeff;在学这个之前&#xff0c;以为很难&#xff0c;也起不到什么作用&#xff0c;但是等真正运用到工程里面&#xff0c;才发现&#xff0c;这个能帮你省下很多工作量。 1&#xff0c;Debug和Release版本区别&#xff1f; 进行iOS开发&#xff0c;在Xcode调试程序时&am…

Linux 防火墙:Netfilter iptables

一、Netfilter 简介 (1) Netfilter 是 Linux 内置的一种防火墙机制&#xff0c;我们一般也称之为数据包过滤机制&#xff0c;而 iptables 只是操作 netfilter 的一个命令行工具(2) Netfilter 是 Linux CentOS 6 内置的防火墙机制&#xff0c;Firewall 是 Linux CentOS 7 内置的…

无法加载 DLL“SQLite.Interop.DLL”: 找不到指定的模块。 (异常来自 HRESULT:0x8007007E)。...

无法加载 DLL“SQLite.Interop.DLL”: 找不到指定的模块。 (异常来自 HRESULT:0x8007007E)。 在项目里添加 现有项 把SQLite.Interop.DLL文件添加进来&#xff0c;然后点击属性 修改一个属性 把 属性 复制到输出目录 改为 始终复制 然后打开你的项目属性 进入生成的 页面&a…

jQuery第三天

课程回顾&#xff1a; ​ 动画效果&#xff1a;基本动画&#xff0c;滑动动画&#xff0c;淡入淡出&#xff0c;自定义动画效果(animate) ​ 事件切换&#xff1a;hover(over&#xff0c;out); ​ 停止动画&#xff1a;stop ​ 操作属性&#xff1a;prop&#xff08;固有属…

C语言程序设计II—第八周教学

第八周教学总结&#xff08;15/4-21/4&#xff09; 教学内容 本周的教学内容为&#xff1a;   8.4 电码加密 知识点&#xff1a;指针与字符串&#xff0c;重难点&#xff1a;字符指针与字符串的关联和区别&#xff1b;   8.5 任意个整数求和 知识点&#xff1a;动态内存分配…

AFNetworking 对数据进行https ssl加密

参考来源&#xff1a;http://www.cnblogs.com/jys509/p/5001566.html 现在在工作中的工作需求&#xff1a;https请求验证证书一般来讲如果app用了web service , 我们需要防止数据嗅探来保证数据安全.通常的做法是用ssl来连接以防止数据抓包和嗅探其实这么做的话还是不够的 。…