- 微服务系列: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. 启动测试
启动项目,在控制台的流控规则下就读取到了文件中配置的这个规则
也可以正常限流
重启项目后,规则并不会消失。
上面这种配置方式,只是保证了规则的持久化,并不能动态的推送规则,如需动态推送规则,还需做一些额外的配置: 在生产环境中使用 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
控制台新增配置并发布
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
配置的这个规则
限流正常
此时,我们修改 Nacos
中的这个配置
点击发布,观察 Sentinel
控制台,读取到了最新的配置。
但是,如果我们在 Sentinel
控制台修改此流控规则,却并不会同步到 Nacos
中。
从 Sentinel 1.4.0 开始,Sentinel 控制台提供 DynamicRulePublisher
和 DynamicRuleProvider
接口用于实现应用维度的规则推送和拉取,并提供了相关的示例。Sentinel 提供应用维度规则推送的示例页面(/v2/flow
),用户改造控制台对接配置中心后可直接通过 v2 页面推送规则至配置中心。改造详情可参考 应用维度规则推送示例。
四、其他
至此,Sentinel
相关技术文章我也学习好几篇了,其他的肯定还有东西没学到,目前就先学习到这里吧。
其他的 Ribbon、Feign整合Sentinel & 服务的熔断降级