• ​​微服务系列:Spring Cloud Alibaba 之 Sentinel 详细入门​​
  • ​​微服务系列:Spring Cloud Alibaba 之 Sentinel 基本流控规则​​
  • ​​微服务系列:Spring Cloud Alibaba 之 Sentinel 高级流控规则​​
  • ​​微服务系列:Spring Cloud Alibaba 之 Sentinel 熔断降级规则​​
  • ​​微服务系列:Spring Cloud Alibaba 之 Sentinel 热点限流规则​​
  • ​​微服务系列:Sentinel 之 @SentinelResource 配置详解 ​​

在经过上面这一系列的文章学习后,我们对 ​​Sentinel​​​ 学习也即将进入尾声,不出意外的话,这篇将会结束对 ​​Sentinel​​ 的学习,后面也可能会有新的相关文章,但那都是后话了。

在 ​​Sentinel​​​ 的学习过程中,大家肯定注意到了一个问题,每次重启服务或者重启 ​​Sentinel​​ 控制台时,之前控制台中配置的各种规则都会消失,需要重新配置。本文就对这些规则的持久化进行一些探讨。

话不多说,开始今天的学习。

一、概述

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

  • 通过 API 直接修改 (​​loadRules​​)
  • 通过 ​​DataSource​​ 适配不同数据源修改

通过 API 直接修改:这个就是直接修改代码中定义的规则。

通过 ​​DataSource​​​ 适配不同数据源:可以整合动态配置系统,如​​ZooKeeper​​​、​​Nacos​​​、​​Apollo​​、Redis 等,动态地实时刷新配置规则。

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

  • 拉模式:客户端主动向某个规则管理中心定期轮询拉取规则,这个规则中心可以是 RDBMS、文件,甚至是 VCS 等。这样做的方式是简单,缺点是无法及时获取变更;
  • 推模式:规则中心统一推送,客户端通过注册监听器的方式时刻监听变化,比如使用 ​​Nacos​​、Zookeeper 等配置中心。这种方式有更好的实时性和一致性保证。

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

推送模式

说明

优点

缺点

​原始模式​

API 将规则推送至客户端并直接更新到内存中,扩展写数据源(​​WritableDataSource​​)

简单,无任何依赖

不保证一致性;规则保存在内存中,重启即消失。严重不建议用于生产环境

​Pull 模式​

扩展写数据源(​​WritableDataSource​​), 客户端主动向某个规则管理中心定期轮询拉取规则,这个规则中心可以是 RDBMS、文件 等

简单,无任何依赖;规则持久化

不保证一致性;实时性不保证,拉取过于频繁也可能会有性能问题。

Push 模式

扩展读数据源(​​ReadableDataSource​​),规则中心统一推送,客户端通过注册监听器的方式时刻监听变化,比如使用 Nacos、Zookeeper 等配置中心。这种方式有更好的实时性和一致性保证。生产环境下一般采用 push 模式的数据源。

规则持久化;一致性;快速

引入第三方依赖

二、文件配置规则

​Sentinel​​支持通过本地文件加载规则配置,使用方式如下(限流规则作为演示)

1. 配置文件

spring:
cloud:
sentinel:
datasource:
ds1:
file:
file: classpath:flowRule.json
data-type: json
rule-type: flow

2. flowRule.json

​flowRule.json​​​对应​​com.alibaba.csp.sentinel.slots.block.flow.FlowRule​​各属性。放在了项目中的 resource 目录下

[
{
"resource": "testA",
"count": 2,
"grade": 1,
"limitApp": "default",
"strategy": 0,
"controlBehavior": 0
}
]

3. 测试接口

@GetMapping("/testA")
@SentinelResource(value = "testA", blockHandler = "handleException")
public String testA(){
return "testA....";
}

public String handleException(BlockException exception){
return "{\"code\":\"500\",\"msg\": \"" + "服务流量控制处理\"}";
}

4. 启动测试

启动项目,在控制台的流控规则下就读取到了文件中配置的这个规则

微服务系列:Spring Cloud Alibaba 之 Sentinel 规则持久化_Sentinel

也可以正常限流

微服务系列:Spring Cloud Alibaba 之 Sentinel 规则持久化_Sentinel_02

重启项目后,规则并不会消失。


上面这种配置方式,只是保证了规则的持久化,并不能动态的推送规则,如需动态推送规则,还需做一些额外的配置: ​​在生产环境中使用 Sentinel · alibaba/Sentinel Wiki · GitHub​

三、Nacos配置规则

1. 添加依赖

<!-- springcloud alibaba nacos config -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

<!-- sentinel datasource nacos -->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>

2. Nacos 控制台定义限流策略

[
{
"resource": "testA",
"count": 3,
"grade": 1,
"limitApp": "default",
"strategy": 0,
"controlBehavior": 0
}
]

​Nacos​​ 控制台新增配置并发布

微服务系列:Spring Cloud Alibaba 之 Sentinel 规则持久化_持久化_03

3. 配置文件

spring:
application:
# 应用名称
name: cloud-sentinel
cloud:
nacos:
config:
# 配置中心地址
server-addr: 127.0.0.1:8848
# 配置文件格式
file-extension: yml
sentinel:
# 取消控制台懒加载
eager: true
transport:
# sentinel 控制台地址
dashboard: 127.0.0.1:8718
datasource:
ds1:
nacos:
server-addr: 127.0.0.1:8848
dataId: sentinel-ezhang-system
data-type: json
rule-type: flow

4.启动测试

启动项目,在控制台的流控规则下就读取到了 ​​Nacos​​ 配置的这个规则

微服务系列:Spring Cloud Alibaba 之 Sentinel 规则持久化_推送_04

限流正常

微服务系列:Spring Cloud Alibaba 之 Sentinel 规则持久化_spring cloud alibaba_05

此时,我们修改 ​​Nacos​​ 中的这个配置

微服务系列:Spring Cloud Alibaba 之 Sentinel 规则持久化_Sentinel_06

点击发布,观察 ​​Sentinel​​ 控制台,读取到了最新的配置。

微服务系列:Spring Cloud Alibaba 之 Sentinel 规则持久化_微服务_07

但是,如果我们在 ​​Sentinel​​​ 控制台修改此流控规则,却并不会同步到 ​​Nacos​​ 中。

从 Sentinel 1.4.0 开始,Sentinel 控制台提供 ​​DynamicRulePublisher​​​ 和 ​​DynamicRuleProvider​​​ 接口用于实现应用维度的规则推送和拉取,并提供了相关的示例。Sentinel 提供应用维度规则推送的示例页面(​​/v2/flow​​​),用户改造控制台对接配置中心后可直接通过 v2 页面推送规则至配置中心。改造详情可参考 ​​应用维度规则推送示例​​。

四、其他

至此,​​Sentinel​​ 相关技术文章我也学习好几篇了,其他的肯定还有东西没学到,目前就先学习到这里吧。

其他的 ​​Ribbon、Feign整合Sentinel & 服务的熔断降级​​