网站首页 > 技术文章 正文
欢迎关注头条号:老顾聊技术
精品原创技术分享,知识的组装工
前言
之前老顾介绍了Sentinel相关的业务介绍,小伙伴们用的怎么样呢?今天老顾来介绍另一个话题,就是Sentinel一旦重启,配置规则就会消失。那肯定是不能够用在生产环境的,我们需要把规则持久化,老顾来介绍一下nacos里面。顺便解决一个DashBoard的源码一个bug
动态限流规则
Sentinel 动态规则扩展
Sentinel 的理念是开发者只需要关注资源的定义,当资源定义成功后可以动态增加各种流控降级规则。Sentinel 提供两种方式修改规则:
- 通过 API 直接修改 (loadRules)
- 通过 DataSource 适配不同数据源修改
通过API编码的方式
FlowRuleManager.loadRules(List<FlowRule> rules); //修改流控规则
DegradeRuleManager.loadRules(List<DegradeRule> rules); // 修改降级规
编码的方式一般仅用于测试和演示,生产上一般通过动态规则源的方式来动态管理规则
规则管理和推送
官网介绍,规则推送有三种模式:
1)原生模式:API 将规则推送至客户端并直接更新到内存中;规则保存在内存中,重启即消失。严重不建议用于生产环境
2)pull模式:即拉模式,客户端主动向某个规则管理中心定期轮询拉取规则,这个规则中心可以是 RDBMS、文件 等;实时性不保证,拉取过于频繁也可能会有性能问题。
3)push模式:即推模式,规则中心统一推送,客户端通过注册监听器的方式时刻监听变化,比如使用 Nacos、Zookeeper 等配置中心。这种方式有更好的实时性和一致性保证。生产环境下一般采用 push 模式的数据源
Push模式与DataSource 扩展
生产环境下一般更常用的是push模式的数据源。对于push模式的数据源,如远程配置中心(ZooKeeper, Nacos, Apollo等等),推送的操作不应由 Sentinel 客户端进行,而应该经控制台统一进行管理,直接进行推送,数据源仅负责获取配置中心推送的配置并更新到本地。因此推送规则正确做法应该是 配置中心控制台/Sentinel 控制台 → 配置中心 → Sentinel 数据源 → Sentinel,而不是经 Sentinel 数据源推送至配置中心。这样的流程就非常清晰了:
本人介绍和nacos相结合的方式
Nacos
准备环境
因为同时使用到Nacos和Sentinel Dashboard,所以可以先把Nacos和Sentinel Dashboard启动起来。
默认配置下启动后,它们的访问地址为:
- Nacos:http://localhost:8848/
- Sentinel Dashboard:http://localhost:8081/
POM依赖
在某个微服务下,引入依赖Spring Cloud Alibaba的Sentinel模块和Nacos存储扩展
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
不要忘了 引用sentinel-datasource-nacos哦
配置
- spring.cloud.sentinel.transport.dashboard:sentinel dashboard的访问地址
- spring.cloud.sentinel.datasource.ds1-flow.nacos.server-addr:nacos的访问地址
- spring.cloud.sentinel.datasource.ds1-flow.nacos.groupId:nacos中存储规则的groupId
- spring.cloud.sentinel.datasource.ds1-flow.nacos.dataId:nacos中存储规则的dataId
- spring.cloud.sentinel.datasource.ds1-flow.nacos.rule-type:该参数是spring cloud alibaba升级到0.2.2之后增加的配置,用来定义存储的规则类型。所有的规则类型可查看枚举类:org.springframework.cloud.alibaba.sentinel.datasource.RuleType,每种规则的定义格式可以通过各枚举值中定义的规则对象来查看,比如限流规则可查看:com.alibaba.csp.sentinel.slots.block.flow.FlowRule。
Nacos中创建限流规则的配置
在Nacos控制台,对应的namespace ,新建一个json配置文件:DataID为scb-content-service-flow-rules,Group为SENTINEL_GROUP;如下
为什么DataId的后缀为flow-rules,这个和下面的Sentinel控制台相结合的时候决定的。
配置内容json格式化一下
配置内容:是不是看上去很多信息,也不知道是什么含义。上面的信息是全部flow流控的配置信息。小伙伴可以看一个简洁版的
[
{
"resource": "/test",
"limitApp": "default",
"grade": 1,
"count": 10,
"strategy": 0,
"controlBehavior": 0,
"clusterMode": false
}
]
可以看到上面配置规则是一个数组类型,数组中的每个对象是针对每一个保护资源的配置对象,每个对象中的属性解释如下:
- resource:资源名,即限流规则的作用对象
- limitApp:流控针对的调用来源,若为 default 则不区分调用来源
- grade:限流阈值类型(QPS 或并发线程数);0代表根据并发数量来限流,1代表根据QPS来进行流量控制
- count:限流阈值
- strategy:调用关系限流策略
- controlBehavior:流量控制效果(直接拒绝、Warm Up、匀速排队)
- clusterMode:是否为集群模式
启动scb-content-service应用,注册到nacos到,打开Sentinel控制台,可以看到上面nacos新建的限流规则,如下:
注意:
在完成了上面的整合之后,对于接口流控规则的修改就存在两个地方了:Sentinel控制台、Nacos控制台。
这个时候,通过Nacos修改该条规则是可以同步到Sentinel的,但是通过Sentinel控制台修改或新增却不可以同步到Nacos。因为当前版本的Sentinel控制台不具备同步修改Nacos配置的能力。
而Nacos由于可以通过在客户端中使用Listener来实现自动更新。所以,在整合了Nacos做规则存储之后,需要知道在下面两个地方修改存在不同的效果:
Sentinel控制台中修改规则:仅存在于服务的内存中,不会修改Nacos中的配置值,重启后恢复原来的值。
Nacos控制台中修改规则:服务的内存中规则会更新,Nacos中持久化规则也会更新,重启后依然保持。
下面我们通过对Sentinel Dashboard的改造,使得Nacos与Sentinel可以互相同步限流规则。
Nacos与Sentinel互相同步限流规则
1、控制台推送规则
Sentinel控制台推送规则
- 将规则推送到Nacos或其他远程配置中心
- Sentinel客户端链接Nacos,获取规则配置;并监听Nacos配置变化,如发生变化,就更新本地缓存。
控制台监听Nacos配置变化,如发生变化就更新本地缓存。从而让控制台本地缓存总是和Nacos一致。
2、改造sentinel-dashboard
git官网下载Sentinel 源代码1.8版本
修改sentinel-dashboard 控制台模块的pom.xml,将<scope>test</scope>注释掉
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
<!--<scope>test</scope>-->
</dependency>
修改nacos相关java代码
找到如下目录(位于test目录)
sentinel-dashboard/src/test/java/com/alibaba/csp/sentinel/dashboard/rule/nacos
将整个目录拷贝到
sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/nacos
即把NacosConfig和NacosConfigUtil移植过来;NacosConfig类再做些改造,增加
即初始化nacos的ConfigService对象,这里需要配置好serverAddr、namespace、以及nacos的用户名和密码。
对应的DashboardConfig也需要改造,增加配置项
启动的时候,需要再jvm参数中加上对应的配置项
增加NacosProvider和NacosPublisher
添加多个规则的的拉取、推送实现类
流控规则拉取和推送
其中原理就是,拉取从nacos的配置文件读取;在Sentinel控制台设置流控规则时,就把信息推送到nacos服务中。
其他的规则,很类似,代码差不多;唯一区别就是 Entity,如下
老顾就不罗列 其他的规则了。
我们再看看NacosConfigUtil
这个就是不同规则的DataId的后缀,如:flow就是以flow-rules为后缀
现在明白为什么上面定义的DataId会有后缀了吧
改造Controller
修改流控规则 FlowControllerV1
添加我们flow的 Publisher 和 Provider
新增推送到nacos的方法
将原来的读取方法中的 List rules = sentinelApiClient.fetchFlowRuleOfMachine(app, ip, port);
改为List<FlowRuleEntity> rules = ruleProvider.getRules(app);
将原来设置更新方法中的publishRules(entity.getApp(), entity.getIp(), entity.getPort()).get(5000, TimeUnit.MILLISECONDS);改为publishRules(entity.getApp());
其他规则的controller是一样的改造。
修复源码bug
在降级规则设置时,Sentinel控制台界面缺失了统计时长的设置,如果不设置,默认是1秒;这个就不是太友好了。我们需要把统计时长放到界面上设置
修改降级界面,在此界面中增加统计时长的属性
<div class="form-group">
<label class="col-sm-2 control-label">统计时长</label>
<div class="col-sm-4">
<div class="input-group">
<input type='number' min="1" class="form-control highlight-border" ng-model='currentRule.statIntervalMs'
placeholder="统计时长(ms)" />
<span class="input-group-addon">ms</span>
</div>
</div>
</div>
改造完后,界面如下
微服务工程改造
增加 sentinel与nacos整合后的依赖后,还需要加上
<!-- sentilen用 nacos 做 持久化-->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
配置文件中加入
这样到此为止就改造好了
这样无论是重启 nacos也好,sentinel也罢,业务工程也罢,都不会丢失sentinel信息。而且可以很好的用Sentinel控制台进行设置,是不是很酷啊
总结
这篇文章比较长,但非常实用,小伙伴们要仔细看哦。今天就介绍到这里,谢谢!!!
---End---
老顾的微服务网关分享课程,请大家多多支持
推荐阅读
Sharding-jdbc的实战入门之水平分表(一)
Sharding-Jdbc之水平分库和读写分离(二)
a、dubbo如何处理业务异常,这个一定要知道哦!
b、企业级SpringBoot应用多个子项目配置文件规划、多环境支持(一)
c、企业级SpringBoot应用多个子项目配置文件规划、多环境支持(二)
d、企业级SpringBoot应用多个子项目配置文件之配置中心(三)
e、利用阿里开源工具进行排查线上CPU居高问题
f、阿里二面:如何快速排查死锁?如何避免死锁?
g、微服务分布式架构中,如何实现日志链路跟踪?
h、网关如何聚合各个微服务的接口文档?
i、Kubernetes之POD、容器之间的网络通信
j、K8S中的Service的存在理由
k、企业微服务项目如何进入K8S的全过程
l、阿里开源项目Sentinel限流、降级的统一处理
m、大厂二面:Redis的分布式布隆过滤器是什么原理?
1、基于RocketMq的SpringCloud Stream框架实战入门
2、如何搭建消息中间件应用框架之SpringCloud Stream
3、面试必备:网关异常了怎么办?如何做全局异常处理?
4、Gateway网关系列(二):SpringCloud Gateway入门实战,路由规则
5、Gateway网关系列开篇:SpringCloud的官方网关Gateway介绍
6、API网关在微服务架构中的应用,这一篇就够了
7、学习Lambda表达式看这篇就够了,不会让你失望的哦(续篇)
8、Lambda用在哪里?几种场景?
9、为什么会出现Lambda表达式,你知道吗?
10、不说“分布式事务”理论,直接上大厂阿里的解决方案,绝对实用
11、女程序员问到这个问题,让我思考了半天,Mysql的“三高”架构
12、大厂二面:CAP原则为什么只能满足其中两项?而不能同时满足
13、阿里P7二面:聊聊零拷贝的原理
14、秒杀系统的核心点都在这里,快来取
15、你了解如何利用token方式实现分布式Session吗?
16、Mysql索引结构演变,为什么最终会是那个结构呢?让你一看就懂
17、一场比赛涉及到的知识,用通俗易通的方式介绍并发协调
18、企业实战Redis全方面思考,你思考了吗?
19、面试题:Thread的start和run的区别
20、面试题:什么是CAS?CAS的作用以及缺点
21、如何访问redis中的海量数据?避免事故产生
22、如何解决Redis热点问题?以及如何发现热点?
23、如何设计API接口,实现统一格式返回?
24、你真的知道在生产环境下如何部署tomcat吗?
25、分享一线互联网大厂分布式唯一ID设计 之 snowflake方案
26、分享大厂分布式唯一ID设计方案,快来围观
27、你想了解一线大厂的分布式唯一ID生成方案吗?
28、你知道如何处理大数据量吗?(数据拆分篇)
29、如何永不迁移数据和避免热点? 根据服务器指标分配数据量(揭秘篇)
30、你知道怎么分库分表吗?如何做到永不迁移数据和避免热点吗?
31、你了解大型网站的页面静态化吗?
32、你知道如何更新缓存吗?如何保证缓存和数据库双写一致性?
33、你知道怎么解决DB读写分离,导致数据不一致问题吗?
34、DB读写分离情况下,如何解决缓存和数据库不一致性问题?
35、你真的知道怎么使用缓存吗?
36、如何利用锁,防止缓存击穿?重构思想的重要性
37、海量订单产生的业务高峰期,如何避免消息的重复消费?
38、你知道如何保障生产端100%消息投递成功吗?
39、微服务下的分布式session该如何管理?
40、阿里二面:filter、interceptor、aspect应如何选择?很多人中招
41、互联网架构重要组员CDN,很多高级开发都没有实操过,来看这里
42、阿里二面:CDN缓存控制原理,看看能不能难住你
43、SpringCloud Alibaba之Nacos多环境多项目管理
44、SpringCloud Alibaba系列之Nacos配置中心玩法
45、SpringCloud Alibaba之Nacos注册中心
46、SpringCloud Plus版本之SpringCloud Alibaba
47、SpringCloud Alibaba之Nacos集群、持久化
48、SpringCloud Alibaba之Nacos共享配置、灰度配置
49、SpringCloud Alibaba之Sentinel工作原理
50、SpringCloud Alibaba之Sentinel流控管理
51、SpringCloud Alibaba之Sentinel降级管理
52、SpringCloud Alibaba之Sentinel热点参数限流
53、SpringCloud Alibaba之Sentinel的API实战
猜你喜欢
- 2024-11-17 fastapi+vue3文件上传(vue ftp上传)
- 2024-11-17 从零开始构建PDF阅读器(最简单的pdf阅读器)
- 2024-11-17 Dooring可视化之从零实现动态表单设计器
- 2024-11-17 在 FastAPI 中处理表单和用户输入:综合指南
- 2024-11-17 Laravel9表单的验证(validate表单验证)
- 2024-11-17 第63节 Form表单-Web前端开发之JavaScript-王唯
- 2024-11-17 Gateway结合Sentinel1.8限流熔断及自定义异常
- 2024-11-17 手机网站常见问题总结(手机网站出现错误怎么办)
- 2024-11-17 CSS实现去除Input框默认样式的详细教程
- 2024-11-17 禁用qq浏览器数字文本框 鼠标滚轮滑动 数字加减
- 标签列表
-
- content-disposition (47)
- nth-child (56)
- math.pow (44)
- 原型和原型链 (63)
- canvas mdn (36)
- css @media (49)
- promise mdn (39)
- readasdataurl (52)
- if-modified-since (49)
- css ::after (50)
- border-image-slice (40)
- flex mdn (37)
- .join (41)
- function.apply (60)
- input type number (64)
- weakmap (62)
- js arguments (45)
- js delete方法 (61)
- blob type (44)
- math.max.apply (51)
- js (44)
- firefox 3 (47)
- cssbox-sizing (52)
- js删除 (49)
- js for continue (56)
- 最新留言
-