一、概述
之前配置的Sentinel限流,熔断策略,默认情况下Sentinel的数据是基于内存存储,当客户端断开,或者Sentinel重启数据就会丢失,正常使用是不可能重启一次服务就去重新配置一次策略,需要Sentinel做数据持久, Sentinel 中支持5种持久化的方式:file、redis、nacos、zk和apollo。
二、Nacos持久化
一.POM依赖
<!--Sentinel和Nacos做持久的-->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
二.配置文件
spring:
application:
name: cloudalibaba-sentinel-feign-service
cloud:
nacos:
discovery:
server-addr: 119.91.99.85:8849
sentinel:
transport:
dashboard: localhost:8080 #配置Sentinel dashboard地址
port: 8719 #应用与Sentinel控制台交互的端口
datasource:
ds1:
nacos: #nacos限流持久配置
server-addr: 119.91.99.85:8849 #nacos地址
dataId: ${spring.application.name} #获取限流的数据源的dataId
groupId: DEFAULT_GROUP #获取限流的数据源的分组
data-type: json #数据类型
rule-type: flow #规则类型
# 激活sentinel对openfeign的支持
feign:
sentinel:
enabled: true
1、RuleType规则类型
指数据源中的规则类型
1.FLOW(流控规则)
限流规则
2.DEGRADE(熔断规则)
熔断降级规则
3.PARAM_FLOW(热点规则)
热词限流规则
4.SYSTEM(系统规则)
系统规则
5.AUTHORITY(授权规则)
6.GW_FLOW(网关集群流控规则)
7.GW_API_GROUP
这个是啥我没太理解
2、DataType数据类型
sentinel默认是json,使用xml还得导入其他的包,就用json吧。
三.nacos配置持久化数据
1、简单案例
1.服务端代码
// 限流,参数和返回值与源方法一致
public User exceptionHandler(@PathVariable Long id, BlockException ex) {
ex.printStackTrace();
System.out.println("服务限流");
return new User(-1L, "限流了", "限流了");
}
// 熔断
public User getByIdfallback(@PathVariable Long id) {
System.out.println("熔断降级");
return new User(id, "zs:" + id, "熔断托底了");
}
@GetMapping("/user/{id}")
//限流降级
//@SentinelResource(value="user",blockHandler="exceptionHandler")
@SentinelResource(value = "user", blockHandler = "exceptionHandler", fallback = "getByIdfallback")
public User getById(@PathVariable Long id) {
int i = (int) (1 / id); //方法异常,触发熔断
User u = new User(id, "zs:" + id, "我是zs");
System.out.println(u.toString());
return u;
}
2.nacos配置
[
{
"resource": "user",
"limitApp": "default",
"grade": 1,
"count": 4,
"strategy": 0,
"controlBehavior": 0,
"clusterMode": false
}
]
3.测试
重新启动服务之后,就会看到
2、参数说明
1.resource
资源名,即限流规则的作用对象
2.limitApp
流控针对的调用来源,若为 default 则不区分调用来源
3.grade
限流阈值类型(QPS 或并发线程数);0代表根据并发数量来限流,1代表根据QPS来进行流量控制
4.count
限流阈值
5.strategy
调用关系限流策略
6.controlBehavior
流量控制效果(0直接拒绝、1Warm Up、2匀速排队)
7.clusterMode
是否为集群模式