点击关注“阿甘正专”,设为星标

奇迹每天都在发生,等你而来


引言

上一篇介绍了如何《使用Sentinel实现gateway网关及服务接口限流》,相信大家已经学会在Spring Cloud Alibaba的整合封装之下,如何将Sentinel整合到Spring Cloud应用中。但是,细心的人,就会发现Sentinel Dashboard控制台中设置的限流规则,在应用重启之后就丢失了,所以需要将Sentinel的规则持久化。

一、使用Nacos存储限流规则

1、Sentinel 动态规则扩展


Sentinel 的理念是开发者只需要关注资源的定义,当资源定义成功后可以动态增加各种流控降级规则。Sentinel 提供两种方式修改规则:

  • 通过 API 直接修改 (loadRules)

  • 通过 DataSource 适配不同数据源修改

手动通过 API 修改比较直观,可以通过以下几个 API 修改不同的规则:

FlowRuleManager.loadRules(List rules); // 修改流控规则

DegradeRuleManager.loadRules(List rules); // 修改降级规则

手动修改规则(硬编码方式)一般仅用于测试和演示,生产上一般通过动态规则源的方式来动态管理规则。

2、规则管理及推送

一般来说,规则的推送有下面三种模式:

3、DataSource 扩展


上述 loadRules() 方法只接受内存态的规则对象,但更多时候规则存储在文件、数据库或者配置中心当中。DataSource 接口给我们提供了对接任意配置源的能力。相比直接通过 API 修改规则,实现 DataSource 接口是更加可靠的做法。

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

DataSource 扩展常见的实现方式有:

  • 拉模式:客户端主动向某个规则管理中心定期轮询拉取规则,这个规则中心可以是 RDBMS、文件,甚至是 VCS 等。这样做的方式是简单,缺点是无法及时获取变更;

  • 推模式:规则中心统一推送,客户端通过注册监听器的方式时刻监听变化,比如使用 Nacos、Zookeeper 等配置中心。这种方式有更好的实时性和一致性保证。

Sentinel 目前支持以下数据源扩展:

  • Pull-based: 文件、Consul

  • Push-based: ZooKeeper, Redis, Nacos, Apollo, etcd

详细说明,可参考官网:

https://github.com/alibaba/Sentinel/wiki/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%99%E6%89%A9%E5%B1%95

4、Nacos


通过上一节,我们已经将Sentinel整合进SpringCloud应用及网关。

下面我们将同时使用到NacosSentinel Dashboard,所以可以先把NacosSentinel Dashboard启动起来。

默认配置下启动后,它们的访问地址(后续会用到)为:

  • Nacos:http://localhost:8848/

  • Sentinel Dashboard:http://localhost:8080/

5、依赖


在上一节的service-order的Spring Cloud应用的pom.xml中引入Spring Cloud Alibaba的Sentinel模块和Nacos存储扩展:

                    com.alibaba.cloud            spring-cloud-starter-alibaba-sentinel                            com.alibaba.csp            sentinel-datasource-nacos                            com.alibaba.cloud            spring-cloud-starter-alibaba-nacos-config                            com.alibaba.cloud            spring-cloud-starter-alibaba-nacos-discovery        

6、配置


#开启sentinelfeign.sentinel.enabled=truespring.cloud.sentinel.transport.port=8719#sentinel控制台spring.cloud.sentinel.transport.dashboard=localhost:8080#服务启动直接建立心跳连接spring.cloud.sentinel.eager=true#Sentinel使用Nacos存储规则spring.cloud.sentinel.datasource.ds1.nacos.server-addr=192.168.100.80:8848spring.cloud.sentinel.datasource.ds1.nacos.dataId=${spring.application.name}-sentinelspring.cloud.sentinel.datasource.ds1.nacos.groupId=greenchoice-b2bspring.cloud.sentinel.datasource.ds1.nacos.namespace=@namespace@spring.cloud.sentinel.datasource.ds1.nacos.data-type=jsonspring.cloud.sentinel.datasource.ds1.nacos.rule-type=flow

注:如果你的Nacos配置了不同的隔离环境 namespace,则需要指定具体哪一个namespace,否则会加载不到规则配置,报错如下:

[c.a.c.s.datasource.converter.SentinelConverter     ] line 80  : converter can not convert rules because source is empty

naocs 如下:

  • spring.cloud.sentinel.transport.dashboard:sentinel dashboard的访问地址,根据上面准备工作中启动的实例配置

  • spring.cloud.sentinel.datasource.ds.nacos.server-addr:nacos的访问地址,,根据上面准备工作中启动的实例配置

  • spring.cloud.sentinel.datasource.ds.nacos.groupId:nacos中存储规则的groupId

  • spring.cloud.sentinel.datasource.ds.nacos.dataId:nacos中存储规则的dataId

  • spring.cloud.sentinel.datasource.ds.nacos.rule-type:该参数是spring cloud alibaba升级到0.2.2之后增加的配置,用来定义存储的规则类型。所有的规则类型可查看枚举类:org.springframework.cloud.alibaba.sentinel.datasource.RuleType,每种规则的定义格式可以通过各枚举值中定义的规则对象来查看,比如限流规则可查看:com.alibaba.csp.sentinel.slots.block.flow.FlowRule

这里对于dataId使用了${spring.application.name}变量,这样可以根据应用名来区分不同的规则配置。

7、Nacos中创建限流规则的配置


在Nacos控制台,对应的namespace ,新建一个json配置文件:service-order-flow-rules,如下:

其中:Data IDGroup就是上面第5点中配置的内容。配置格式选择JSON,并在配置内容中填入下面的内容:

[    {        "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:是否为集群模式

启动service-order 应用,注册到nacos到,打开Sentinel控制台,可以看到上面nacos新建的限流规则,如下:

注意:

在完成了上面的整合之后,对于接口流控规则的修改就存在两个地方了:Sentinel控制台、Nacos控制台

这个时候,通过Nacos修改该条规则是可以同步到Sentinel的,但是通过Sentinel控制台修改或新增却不可以同步到Nacos。因为当前版本的Sentinel控制台不具备同步修改Nacos配置的能力,而Nacos由于可以通过在客户端中使用Listener来实现自动更新。所以,在整合了Nacos做规则存储之后,需要知道在下面两个地方修改存在不同的效果:

  • Sentinel控制台中修改规则:仅存在于服务的内存中,不会修改Nacos中的配置值,重启后恢复原来的值。

  • Nacos控制台中修改规则:服务的内存中规则会更新,Nacos中持久化规则也会更新,重启后依然保持。

下面我们进通过修改,使得Nacos与Sentinel可以互相同步限流规则:

二、Nacos与Sentinel互相同步限流规则

1、流控推送规则

要通过 Sentinel 控制台配置集群流控规则,需要对控制台进行改造。主要改造规则可以参考:

https://github.com/alibaba/Sentinel/wiki/Sentinel-控制台(集群流控管理)#规则配置

其控制台推送规则:

  • 将规则推送到Nacos或其他远程配置中心

  • Sentinel客户端链接Nacos,获取规则配置;并监听Nacos配置变化,如发生变化,就更新本地缓存。

控制台监听Nacos配置变化,如发生变化就更新本地缓存。从而让控制台本地缓存总是和Nacos一致。

2、改造sentinel-dashboard

2.1 通关git官网下载Sentinel 源代码,如下:

https://github.com/alibaba/Sentinel/archive/1.7.2.zip

下载后解压,使用IDEA打开如下:

2.2 修改sentinel-dashboard 控制台模块的pom.xml,将test注释掉

    com.alibaba.csp    sentinel-datasource-nacos    

2.3 修改sidebar.html页面(sentinel控制台左边菜单栏)

sentinel-dashboard/src/main/webapp/resources/app/scripts/directives/sidebar.html

并找到如下代码段后,并把注释打开,名称也稍作修改。

修改前

修改后:

2.4 修改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

修改com.alibaba.csp.sentinel.dashboard.controller.v2.FlowControllerV2.java

修改如下:

其中,注入的两个bean:

  • flowRuleNacosProvider,就是实现Nacos的限流规则配置拉取。

  • flowRuleNacosPublisher,实现Nacos的配置推送。

FlowRuleNacosProvider.java 如下,无需修改

  • getRules方法中的appName参数是Sentinel中的服务名称。

  • configService.getConfig方法是从Nacos中获取配置信息的具体操作。其中,DataId和GroupId分别对应客户端使用时候的对应配置。如下:

spring.cloud.sentinel.datasource.ds1.nacos.server-addr=192.168.100.80:8848spring.cloud.sentinel.datasource.ds1.nacos.dataId=${spring.application.name}-flow-rules

FlowRuleNacosPublisher.java如下,无需修改:

打开 NacosConfigUtil.java ,如下两个地方,需要和上面使用nacos存储时的配置一致注意:两边的DataId和GroupId必须对应上。

打开 NacosConfig.java,修改如下,主要是nacos配置中心的地址与namespace隔离环境的配置修改,如果没有设置namespace,就可以不设置 PropertyKeyConst.NAMESPACE 。

经过以上步骤就已经把流控规则改造成推模式持久化了。

2.5 编译生成jar包

执行命令

mvn clean package -DskipTests

编译成功后,在项目的 target 目录可以找到sentinel-dashboard.jar ,执行以下命令可以启动控制台:

java -jar sentinel-dashboard.jar

打开Sentinel控制台,可以看到上面通过nacos新建的限流规则

我们可以尝试在Sentinel控制台修改该规则,看是否能同步推送到Nacos,这里我们修改阈值为15,打开Nacos配置中心,可以看到已经更新过来了。

下面我们通过修改Nacos将阈值再修改为20,刷新Sentinel,也能同步过来,如下:

通过测试发现,在Sentinel控制台修改规则可以同步到Nacos,或者在Nacos上修改规则也可以同步到Sentinel控制台

参考:

https://cloud.tencent.com/developer/article/1665816

https://github.com/alibaba/Sentinel/wiki/Sentinel-%E6%8E%A7%E5%88%B6%E5%8F%B0%EF%BC%88%E9%9B%86%E7%BE%A4%E6%B5%81%E6%8E%A7%E7%AE%A1%E7%90%86%EF%BC%89#%E8%A7%84%E5%88%99%E9%85%8D%E7%BD%AE

●史上最强Tomcat8性能优化

●阿里巴巴为什么能抗住90秒100亿?--服务端高并发分布式架构演进之路

●B2B电商平台--ChinaPay银联电子支付功能

●学会Zookeeper分布式锁,让面试官对你刮目相看

●SpringCloud电商秒杀微服务-Redisson分布式锁方案

查看更多好文,进入公众号--撩我--往期精彩

右上角按钮分享给更多人哦~

来都来了,点个在看再走吧~~~

nacos动态配置数据源_Sentinel使用Nacos存储规则及同步相关推荐

  1. nacos动态配置数据源_Jasper 怎么配置动态数据源

    Jasper 本身是不支持动态数据源的,能用的解决方式是通过 api 自定义数据源,实际操作就是根据条件判断后动态设定 jdbc 的 url.用户名及密码等连接属性.比如: String userNa ...

  2. SpringBoot 动态配置数据源

    SpringBoot 动态配置数据源 增删改查 概述 1.首先要搞明白为什么要用要动态数据源,在很多应用场景中,需要用到动态数据源,比如多个能源类项目,登录系统时根据用户信息切换到对应的数据库进行操作 ...

  3. 微服务-Nacos动态配置中心

    前言 回想之前的项目,尤其是项目分多模块的时候,一般就会有一个公共包大多是相关工具类,因为比较独立使得其他模块调用方便,现在出来个需求为工具类参数进行动态控制,比如Redis工具类动态设定过期时间,除 ...

  4. mysql动态配置数据源_Spring整合Mybatis实现动态数据源切换教程配置

    一.摘要 这篇文章将介绍Spring整合Mybatis 如何完成SqlSessionFactory的动态切换的.并且会简单的介绍下MyBatis整合Spring中的官方的相关代码. Spring整合M ...

  5. java后端:nacos 实现动态配置

    一.前言 使用动态配置的原因: properties 和 yaml 是写到项目中的,好多时候有些配置需要修改,每次修改就要重新启动项目,不仅增加了系统的不稳定性,也大大提高了维护成本,非常麻烦,且耗费 ...

  6. Nacos的动态配置源码解析

    文章目录 1. 如何使用 2. 原理详解 2.1 采用延迟线程池定时执行"监听"文件是否有修改 2.2 通过长轮询的方式获得修改过的文件及其内容 2.3 拿到配置后通过applic ...

  7. nacos 怎么配置 里的配置ip_2.nacos服务配置中心

    下面将研究以下几个问题: nacos的角色: nacos是如何工作的? 在集群中扮演什么样的角色? 修改nacos配置数据库: 我们在控制台配置的信息, 默认是写到nacos的默认数据库中, 不方便管 ...

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

    点击蓝色"程序猿DD"关注我哟 加个"星标",不忘签到哦 通过上一篇<使用Sentinel实现接口限流>的介绍,相信大家对Sentinel已经有了初 ...

  9. springmvc+mybatis多数据源配置,AOP注解动态切换数据源

    springmvc与springboot没多大区别,springboot一个jar包配置几乎包含了所有springmvc,也不需要繁琐的xml配置,springmvc需要配置多种jar包,需要繁琐的x ...

  10. Nacos(十)之Kubernetes Nacos

    转载自  Kubernetes Nacos 本项目包含一个可构建的Nacos Docker Image,旨在利用StatefulSets在Kubernetes上部署Nacos 快速开始 Clone 项 ...

最新文章

  1. 在你的代码中使用自定义异常类
  2. 服务器指纹识别之 DNS TXT
  3. agx 安装ros opencv_怎样在ROS下实现基于YOLO的px4无人机目标检测?
  4. Qt for Android gradle编译同时输出多个渠道apk
  5. C++设计模式之抽象工厂模式
  6. datasnap xe连接池_DataSnap 连接池
  7. 你知道C#中的Lambda表达式的演化过程吗?
  8. SQL Server 2012安装错误案例:Error while enabling Windows feature: NetFx3, Error Code: -2146498298...
  9. Javascript交互式金融股票基金图表JavaScript Stock Chart
  10. 原型设计Axure下载安装
  11. Steam 界面布局出错的问题
  12. STM32单片机驱动L298N
  13. SLAM中的泰勒展开
  14. 李雅普诺夫理论基础(1)
  15. 剖析2015四大合并案:滴滴快的、58赶集、美团大众点评、携程去哪儿 1+12?
  16. wnmp mysql_WNMP(Window系统+Nginx服务器+Mysql数据库+PHP)
  17. Oracle将收购Sun公司
  18. Java重载,顺序不同也算重载
  19. 低代码在爱奇艺鹊桥数据同步平台的实践
  20. Adobe Premiere Pro 2020 入门教程(三)首选项和快捷键的设置

热门文章

  1. 腾讯php定位地图代码,腾讯地图定位及坐标解析
  2. 7-3 复数四则运算 (15 分)
  3. 二十三 NoSqlRedis及其安装
  4. 学号 20165329 《Java程序设计》第4周学习总结
  5. window.location
  6. Android 圆角的效果实现
  7. 分析百度的中文分词结果
  8. web安全day16:人人都要懂的OSI和TCP/IP协议簇
  9. Cocos2d-x动作(Action)详解
  10. Security+ 学习笔记12 安全编码实践