Sentinel(二十四)之Sentinel Dashboard中修改规则同步到ZooKeeper

转载自  Springboot使用Sentinel限流,集成zookeeper完成规则的持久化

上一篇简单介绍了sentinel限流的基本配置和使用,这一篇我们来稍微深入一点,看看如何将zookeeper继承进来,用以保存添加的流控规则。

上一篇中我们启动了dashboard.jar,然后在客户端中指定了dashboard的地址。之后启动项目,随便访问个接口,之后就能在dashboard的界面上看到相应的请求了,并且能在控制台上添加一些规则,保存后客户端就能生效了。

基于内存的推送

那么它的内部原理是什么呢?来简单了解一下。

从官方文档可以看到,客户端在引入了Sentinel后,并指定dashboard的地址,启动后,将会在客户端启动一个http服务,默认占用8719端口。由于我们是引入的SpringCloud的模块,就已经包含了下面的引入。

引入这个transport模块的原因就是为了接收dashboard推送过来的配置规则。可以看看官方文档的介绍,默认就是“原始模式”。所谓的原始模式,就是指客户端启动web服务,连上dashboard后,在dashboard配置的规则,由dashboard发起http请求来修改。修改后的规则,直接保存在客户端内存中,并即时生效。

这种方式原理简单,一般用于入门测试使用,生产环境不能用。基于内存存储,在客户端重启后,所有规则都会丢失,需要重新配置。而且不适用于客户端多个实例,因为彼此之间不共享规则,倘若启动多个实例,需要多次重复配置。很明显,这不是我们想要的那种结果。

官方提供了三种模式,上面的“原始模式”、“pull模式”、“push模式”。pull模式就是搞个文件存着,隔一会去请求一下,看看有没有变化,如果变了,就更新到内存,很明显这种模式存在延迟,也不建议上生产。那就来看看“push模式”吧。

基于zookeeper的推送

从上面可以看到,要想能持久化规则的存储,并且在多个实例间共享,就需要一个第三方的存储。让dashboard对规则的修改能及时存储到第三方并及时通知客户端完成修改。官方给了三种示例推荐,Apollo、Nacos、Zookeeper,它们的使用类似,我们以zookeeper为例来看看怎么使用。

客户端pom文件添加zookeeper的依赖

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId></dependency><dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-datasource-zookeeper</artifactId></dependency>

然后客户端修改获取规则的地方为从zookeeper获取规则。

import com.alibaba.csp.sentinel.datasource.ReadableDataSource;import com.alibaba.csp.sentinel.datasource.zookeeper.ZookeeperDataSource;import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;import com.alibaba.fastjson.JSON;import com.alibaba.fastjson.TypeReference;import org.springframework.beans.factory.annotation.Value;import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;import java.util.List;/*** @author wuweifeng wrote on 2019/7/1.*/@Componentpublic class ZookeeperSentinelConfig {@Value("${spring.application.name}")private String appName;@PostConstructpublic void loadRules() {final String remoteAddress = "127.0.0.1:2181";final String path = "/sentinel_rule_config/" + appName;ReadableDataSource<String, List<FlowRule>> flowRuleDataSource = new ZookeeperDataSource<>(remoteAddress, path,source -> JSON.parseObject(source, new TypeReference<List<FlowRule>>() {}));FlowRuleManager.register2Property(flowRuleDataSource.getProperty());}}

这一步很简单,大家自行去下载个zookeeper的安装文件,启动即可。在方法里指定zookeeper的地址和要监听变化的path,然后注册一下就好了。客户端到这里就完毕了。

重新启动客户端后,就会变成从zookeeper的固定path里获取rule规则。之后对该path做的变化,都会即时更新到客户端,并应用新的规则。

这里我们测试一下:

@RestControllerpublic class TestController {@GetMapping(value = "/hello")public String hello() {return "Hello Sentinel";}@GetMapping(value = "/test")@SentinelResource(value = "TestResource", blockHandler = "handleException")public String test() {return "Hello TestResource";}// Fallback 函数,函数签名与原函数一致或加一个 Throwable 类型的参数.public String handleException(BlockException ex) {return "handleException";}}

上面是一个简单的Controller,里面定义了一个resource。之后,我们通过对zookeeper的path推送该resource的规则,来测试是否生效。

import org.apache.curator.framework.CuratorFramework;import org.apache.curator.framework.CuratorFrameworkFactory;import org.apache.curator.retry.ExponentialBackoffRetry;import org.apache.zookeeper.CreateMode;import org.apache.zookeeper.data.Stat;/*** @author wuweifeng wrote on 2019/7/1.*/public class ZookeeperConfigSender {private static final int RETRY_TIMES = 3;private static final int SLEEP_TIME = 1000;public static void main(String[] args) throws Exception {final String remoteAddress = "localhost:2181";final String rule = "[\n"+ " {\n"+ " \"resource\": \"TestResource\",\n"+ " \"controlBehavior\": 0,\n"+ " \"count\": 1.0,\n"+ " \"grade\": 1,\n"+ " \"limitApp\": \"default\",\n"+ " \"strategy\": 0\n"+ " }\n"+ "]";CuratorFramework zkClient = CuratorFrameworkFactory.newClient(remoteAddress, new ExponentialBackoffRetry(SLEEP_TIME, RETRY_TIMES));zkClient.start();String appName = "your-app-name";String path = "/sentinel_rule_config/" + appName;Stat stat = zkClient.checkExists().forPath(path);if (stat == null) {zkClient.create().creatingParentContainersIfNeeded().withMode(CreateMode.PERSISTENT).forPath(path, null);}zkClient.setData().forPath(path, rule.getBytes());try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}zkClient.close();}}

这就是测试代码,运行后,就会往zookeeper写入一个rule,设置名为TestResource的qps为1,并应用到客户端。无论启动多少个客户端实例,都会生效这个rule。

看到这里,其实已经完成了基于push的动态规则功能了,可以通过zkui这种zookeeper界面工具,或者通过代码来查询、修改zookeeper里的rule配置(json)来完成对客户端规则的控制。

那么可能有人会问了,dashboard呢?用那个界面操作不是更方便吗?

事实上,对客户端的限流,与dashboard没一点关系,只用zookeeper就能完成了。那么这时,你再启动dashboard,当然也是能用的,因为客户端的web服务还是启动着的,也能接收到来自于dashboard的推送。只是来自于dashboard的在客户端重启后会失效,在zookeeper里的会仍然存在。

那么我们应该改造一下dashboard,让在界面上的操作也推送到zookeeper里去,这样就方便多了。

在GitHub上下载Sentinel的源码,里面有dashboard的工程,我们来修改一下它的代码就好了。

先修改一下pom文件,把scope注释掉。

找到rule包,添加个zookeeper文件夹,里面有4个类。

可以直接从工程的test测试代码里,直接把zookeeper包抄过去就行,并把rule下原来的FlowRuleApiProvider和FlowRuleApiPublisher给注释掉。

test源码里已经提供了基于三种中间件的配置代码了,抄过去就行。

抄过去后,修改一下RULE_ROOT_PATH,保持和客户端配置的是一致的。

之后找到Controller包下的v2包,如果你设置的FlowRuleZookeeperProvider和publisher两个bean有名字,可以在autowired时指定为你设置的名字,或者用@Resource。

最后修改一下sidebar.html,将原来的flowV1改为如图。

这样就ok了。

重新启动dashboard项目,重启客户端。这样dashboard就已经和zookeeper关联起来了,dashboard的操作就由原来的操作客户端的api,变成了操作zookeeper。你所有在dashboard界面上做的配置,都会存储到zookeeper中,并实时推送到客户端。客户端重启后,dashboard不受影响。这样就完成了多实例共享流控规则。

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

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

相关文章

微软Azure AspNetCore微服务实战第2期(内附PPT下载)

2018年1月28日&#xff0c;虽然上海的大雪在城区已经见不到踪影&#xff0c;但还是很冷。不过天气再冷&#xff0c;也阻止不了小伙伴参加活动的热情。感谢王振&#xff0c;苏老师以及微软Azure API Management的产品经理Alvin&#xff0c;给大家带来微服务实战&#xff0c;企业…

jzoj3379-查询【主席树】

正题 题目大意 给出一个有序集合AAA&#xff0c;定义Al,rA_{l,r}Al,r​表示集合内l∼rl\sim rl∼r这个范围内的数。 定义加法ABABAB表示两个集合中的所有元素(不去重)。 现在询问&#xff0c;每次询问ki,pik_i,p_iki​,pi​然后给出kik_iki​个区间[lj,rj][l_j,r_j][lj​,rj…

Sentinel(二十五)之Sentinel Dashboard同步Apollo存储规则

转载自 Spring Cloud Alibaba基础教程&#xff1a;Sentinel Dashboard同步Apollo存储规则 在之前的两篇教程中我们分别介绍了如何将Sentinel的限流规则存储到Nacos和Apollo中。同时&#xff0c;在文末的思考中&#xff0c;我都指出了这两套整合方案都存在一个不足之处&#…

为什么选择.NETCore?

为什么选择.NETCore&#xff1f;在开展话题之前先出一张ASP.NETCore VS Node.js的性能对比图 ASP.NET Core VS node.js&#xff1a;继续正文&#xff1a;学习新的开发框架是一项巨大的投资。您需要学习如何在新框架中编写&#xff0c;构建&#xff0c;测试&#xff0c;部署…

欢乐纪中某A组赛【2019.7.10】

前言 好烦我最后写对了T1T1T1的808080分结果交错题导致T2T2T2的404040分没了T1T1T1也没拿多那些分。 话说好像ZDYZDYZDY比我还惨 成绩 这里还是按OJOJOJ上的分数排名 JJJ表示初中&#xff0c;HHH表示高中后面加的是几年级 RankRankRankPersonPersonPersonScoreScoreScoreAAA…

Sentinel(二十六)之Sentinel Dashboard中修改规则同步到Nacos

转载自 Spring Cloud Alibaba基础教程&#xff1a;Sentinel Dashboard中修改规则同步到Nacos 上一篇我们介绍了如何通过改造Sentinel Dashboard来实现修改规则之后自动同步到Apollo。下面通过这篇&#xff0c;详细介绍当使用Nacos作为配置中心之后&#xff0c;如何实现Sentin…

用C#编写Linux守护进程

如果要在Red Hat Enterprise Linux上将.NET Core进程作为后台进程运行&#xff0c;则可以创建自定义systemd单元。今天我将为.NET Core编写两个自定义系统单元的例子。一个是运行.NET Core控制台应用程序的一种类型&#xff0c;另一个是运行ASP.NET Core Web应用程序的简单类型…

P4550-收集邮票【期望dp】

前题 ZYCdalaoZYCdalaoZYCdalao让我推这题&#xff0c;然后我只推出了fff的推导&#xff0c;我还是太菜了QVQQVQQVQ 正题 题目链接:https://www.luogu.org/problemnew/show/P4550 题目大意 nnn种&#xff0c;每次随机买一个邮票(每种的概率均等)&#xff0c;然后第kkk种要kkk元…

Nacos client SDK 订阅式请求坑

一、场景复现 &#xff08;1&#xff09;业务需求 在不同的nacos注册集群&#xff0c;不同的namespace&#xff0c;由页面发起查询nacos集群上注册的服务实例ip。 &#xff08;2&#xff09;故障现象 nacos集群配置推送push超时&#xff0c;查看nacos日志请求一直在20~30qp…

AWS Lambda现已支持.NET Core 2.0

Amazon宣称.NET Core 2.0现在已经支持AWS Lambda以及无服务器应用程序了。开发者们现在可以使用C#和.NET Core 2.0来为AWS Lambda编写代码和编写运行于AWS的无服务器应用程序了。自2017年2月Amazon开始了对C#编程语言的支持&#xff0c;这使得.NET开发者能够使用.NET Core 1.0运…

jzoj3236-矮人排队【权值线段树】

正题 题目链接:https://jzoj.net/senior/#main/show/3236 题目大意 一个序列两个操作 1XY:1\ X\ Y:1 X Y:交换XXX和YYY两个数2AB:2\ A\ B:2 A B:询问A∼BA\sim BA∼B这些数再序列中是否是连续的一段区间(不一定按顺序) 解题思路 先不考虑交换&#xff0c;对于询问我们发现它…

Nacos(一)之简介

转载自 什么是 Nacos Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集&#xff0c;帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。 Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现…

开源纯C#工控网关+组态软件(八)表达式编译器

一、 引子监控画面的主要功能之一就是跟踪下位机变量变化&#xff0c;并将这些变化展现为动画。大部分时候&#xff0c;界面上一个图元组件的某个状态&#xff0c;与单一变量Tag绑定&#xff0c;比如电机的运行态&#xff0c;绑定一个MotorRunning信号&#xff1b;但有些时候…

jzoj3237-间谍派遣【最小生成树,并查集】

正题 题目大意 一张图&#xff0c;第iii个点参加任务需要mkimk_imki​元&#xff0c;连接一条边需要一定费用&#xff0c;要求每个联通图都有参加任务的点&#xff0c;求最小费用。 解题思路 其实就是求若干个最小生成树然后这个最小生成树的权值就是这个棵树的所有边权加上最…

g4e基础篇#6 了解Git历史记录

Git的版本历史记录采用了与传统集中式版本管理系统完全不同的方式进行组织&#xff0c;在刚开始使用Git的时候我们往往会不知所措&#xff0c;比如看到这样的历史记录。看到这个七拐八拐的图形&#xff0c;你可能完全不知道它代表了什么。其实这正是Git的特别之处&#xff0c;G…

Nacos(二)之概念

转载自 Nacos 概念 NOTE: Nacos 引入了一些基本的概念&#xff0c;系统性的了解一下这些概念可以帮助您更好的理解和正确的使用 Nacos 产品。 地域 物理的数据中心&#xff0c;资源创建成功后不能更换。 可用区 同一地域内&#xff0c;电力和网络互相独立的物理区域。同一可…

bzoj3482,jzoj3238-超时空旅行hiperprostor【最短路,凸包,斜率优化】

正题 题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id3482 题目大意 一张有向图有正整数边权也有xxx边权。其中xxx可以取任何值(但是要注意所有的xxx边必须长度相等)&#xff0c;每次询问求SSS到TTT的可能最短路长度个数和它们的和。 解题思路 分层图&#xff…

Ray框架QA

Orleans与Akka对比&#xff0c;为什么选用Orleans&#xff1f;答: Akka对参与开发的人员要求更高一些&#xff0c;普遍是专家级别&#xff0c;Orleans框架进一步抽象了一层&#xff0c;结合C#语言特性&#xff0c;能普遍降低开发难度。下面是知乎网友的答案&#xff0c;可以参考…

Nacos(三)之架构

转载自 Nacos 架构 基本架构及概念 服务 (Service) 服务是指一个或一组软件功能&#xff08;例如特定信息的检索或一组操作的执行&#xff09;&#xff0c;其目的是不同的客户端可以为不同的目的重用&#xff08;例如通过跨进程的网络调用&#xff09;。Nacos 支持主流的服务…

欢乐纪中某A组赛【2019.7.11】

前言 话说今天好像放做题导致BBB组贼难AAA组还好。 成绩 JJJ表示初中&#xff0c;HHH表示高中后面加的是几年级 RankRankRankPersonPersonPersonScoreScoreScoreAAABBBCCC101010(J−2)WYC(J-2)WYC(J−2)WYC250250250100100100100100100505050282828(J−2)ZYC(J-2)ZYC(J−2)ZYC…