1.概述
在前两章节我们学习了通过Sentinel的限流和熔断机制来保护微服务,提高系统的可用性,但是有一个问题,我们在Sentinel配置了限流,熔断策略,默认情况下Sentinel的数据是基于内存存储,当客户端断开,或者Sentinel重启数据就会丢失,这不是我们愿意看到的。所有我们需要的Sentinel做数据持久。 Sentinel 中支持5种持久化的方式:file、redis、nacos、zk和apollo,本片文章针对于Nacos进行持久化配置。
2.使用Nacos存储限流规则
2.1.导入依赖
以工程springcloudalibaba-user-server-1010为例子,修改pom增加Sentinel和Nacos持久化配置依赖 sentinel-datasource-nacos ,如下:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<!--Sentinel和Nacos做持久的-->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
<version>1.5.2</version>
</dependency>
</dependencies>
2.2.配置Sentinel持久化
spring:
application:
name: user-server
cloud:
nacos:
config: #配置中心
server-addr: localhost:8848
file-extension: yaml
prefix: application-user
sentinel: #限流服务器sentinel配置
transport:
dashboard: localhost:1111
datasource:
ds:
nacos: #限流持久配置
server-addr: localhost:8848 #使用nacos的持久
dataId: application-user-dev #获取限流的数据源的dataId
groupId: DEFAULT_GROUP
rule-type: flow
profiles:
active: dev
这里其实是在之前的配置基础上增加了 spring.cloud.sentinel.datasource
持久化数据源的配置,对应了NacosDataSourceProperties
配置类具体含义如下:
spring.cloud.sentinel.datasource.ds.nacos.server-addr
:nacos的访问地址spring.cloud.sentinel.datasource.ds.nacos.groupId
:nacos中存储规则的groupIdspring.cloud.sentinel.datasource.ds.nacos.dataId
:nacos中存储规则的dataIdspring.cloud.sentinel.datasource.ds.nacos.rule-type
:该参数是用来定义存储的规则类型。所有的规则类型可查看枚举类:...datasource.RuleType
,每种规则的定义格式可以通过各枚举值中定义的规则对象来查看,比如限流规则可查看:...flow.FlowRule
简而言之,这里是配置了Sentinel持久化针对于Nacos的相关信息,程序会去地址为localhost:8848
的Nacos中查找DataId为 application-user-dev
,GourpId为 DEFAULT_GROUP
的文件作为限流策略(rule-type: flow代表限流)。
2.3.编写测试用的Controller
这个controller我们待会用来做限流测试
@RestController
public class TempController {
@GetMapping("/hello")
public String hello() {
return "测试数据";
}
}
2.4.Nacos中创建限流规则
在配置列表增加配置如下:
[
{
"resource": "/hello",
"limitApp": "default",
"grade": 1,
"count": 10,
"strategy": 0,
"controlBehavior": 0,
"clusterMode": false
}
]
注意:这里的DataId 和 Group其实是和上一步 yml配置中的DataId和Group相对应,这里配置的是一个数组,意思是可以配置多个限流策略,意思如下:
- resource:对那个资源进行限流
- limitApp:这个是流控的调用者,default 代表不区分调用者
- grade:限流方式
0
是根据并发数量限流,1
是表根据QPS来限流 - count:限流阈值,达到这个阈值就被限流,触发降级。
- strategy:基于调用链的流控制策略。0 直接,1 关联 2 链路
- controlBehavior:流控效果,0 直接拒绝,1是Warm Up,2是匀速排队
- clusterMode:是否为集群
上面的配置项目对应了 com.alibaba.csp.sentinel.slots.block.flow.FlowRule
限流规则类。程序启动,Sentinel通过 NacosDataSource 从Nacos中查找配置。
2.5.测试
启动springcloudalibaba-user-server-1010 ,向 /hello 资源发起访问,然后观察Sentinel控制台流控规则是否有了一条限流策略。
3.总结一下
这里我们看到,我们并没有在Sentinel设置流控规则,而是通过Nacos配置的流控规则,在客户端对Sentinel做Nacos持久配置,那么Sentinal自动回去同步Nacos中的流控规则,同时同步到客户端本地,因为Nacos是做了持久化的,所以流控规则不会丢失。