在上面演示的sentinel规则,每次服务重启,之前配置的规则就会丢失,这样之前好不容易辛苦配置的规则就全部丢失,在生成环境显然是不行的,因此就需要对规则进行持久化操作。
Sentinel规则的推送有下面三种模式:
推送模式 | 说明 | 优点 | 缺点 |
---|---|---|---|
原始模式 | API 将规则推送至客户端并直接更新到内存中,扩展写数据源(WritableDataSource) | 简单,无任何依赖 | 不保证一致性;规则保存在内存中,重启即消失。严重不建议用于生产环境 |
Pull 模式 | 扩展写数据源(WritableDataSource), 客户端主动向某个规则管理中心定期轮询拉取规则,这个规则中心可以是 RDBMS、文件 等 | 简单,无任何依赖;规则持久化 | 不保证一致性;实时性不保证,拉取过于频繁也可能会有性能问题。 |
Push 模式 | 扩展读数据源(ReadableDataSource),规则中心统一推送,客户端通过注册监听器的方式时刻监听变化,比如使用 Nacos、Zookeeper 等配置中心。这种方式有更好的实时性和一致性保证。生产环境下一般采用 push 模式的数据源。 | 规则持久化;一致性;快速 | 引入第三方依赖 |
如果不做任何修改,Dashboard 的推送规则方式是通过 API 将规则推送至客户端并直接更新到内存中:
这种做法的好处是简单,无依赖;坏处是应用重启规则就会消失,仅用于简单测试,不能用于生产环境。
pull 模式的数据源(如本地文件、RDBMS 等)一般是可写入的。使用时需要在客户端注册数据源:将对应的读数据源注册至对应的 RuleManager,将写数据源注册至 transport 的 WritableDataSourceRegistry 中。
生产环境下一般更常用的是 push 模式的数据源。对于 push 模式的数据源,如远程配置中心(ZooKeeper, Nacos, Apollo等等),推送的操作不应由 Sentinel 客户端进行,而应该经控制台统一进行管理,直接进行推送,数据源仅负责获取配置中心推送的配置并更新到本地。因此推送规则正确做法应该是** 配置中心控制台/Sentinel 控制台 → 配置中心 → Sentinel 数据源 → Sentinel**,而不是经 Sentinel 数据源推送至配置中心。这样的流程就非常清晰了:
1-10-3-1、基于Nacos实现push模式
1-10-3-1-1、引入依赖
复制代码 com.alibaba.csp sentinel-datasource-nacos
1-10-3-1-2、在nacos中配置规则
在nacos中配置sentinel的规则, 配置模式最好选择JSON ,这样在yml配置文件中就可以少配置一个参数值,配置内容如红框中的内容就是流控的规则信息。
相关规则参数信息,如果不知道含义可以去github中查看: github.com/alibaba/Sen…
流控规则参数:
熔断降级规则参数:
系统规则:
热点参数规则:
1-10-3-1-3、配置yml加载nacos流控规则
当前配置使用ruleType指定了规则类型为flow(流控规则),因此nacos中dataID为sentinel-rule中就配置流控规则,如果配置其他规则,则需要再进行配置
配置流控和降级规则
1-10-3-1-3-1、yml属性的查看
按住ctrl+鼠标左键,进入这个方法
再次进入 DataSourcePropertiesConfiguration
类
可以看到有不同的配置类型,file/nacos/zk/apollo/redis/consul。
进入nacos配置类,就可以看到相关的配置属性
再次进入其父类
父类的配置属性,其中dataType就是在nacos中设置的配置格式
RoleType就是规则的类型:
FLOW:流控
DEGRADE:降级
PARAM_FLOW:热点参数流控
SYSTEM:系统规则
AUTHORITY:权限规则
GW_FLOW:网关流量控制
GW_API_GROUP:API控制
1-10-3-1-4、重启服务访问sentinel控制台
启动控制台之后,随便访问一下接口,然后刷新控制台就可以看到配置的流控规则了
1-10-3-1-5、测试规则
流控规则设置的QPS阈值为2,频繁刷新的情况下,可以触发规则
1-10-3-1-6、规则更新
在sentinel里面对规则进行编辑修改,目前的操作是无法将新配置更新到Nacos中的,因此如果需要修改规则,就需要去Nacos中进行修改。 实际上在sentinel中修改规则也是可以同步到nacos中的,涉及到了一些源码的了解,后面文章再进行介绍。