Sentinel默认限流规则是存储在内存中,只要服务器重启,对应的限流规则就会相应的消失,实际生产中肯定不允许这种操作,因此限流规则的持久化迫在眉睫。
Sentinel官方文档提供拉两种持久化模式,分别如下
但是官方更推荐Push模式。
用Nacos配置中心作为规则持久化。
官方架构图如下:
\
Nacos规则持久化Demo
实验准备:
- Sentinel DashBoard(源码)
- Nacos DashBoard(jar包即可)
- 微服务一个或多个
实验重点说明:
- 使用sentinel-datasource-nacos依赖
- 改造Sentinel DashBoard
-
- 改造时注意NacosUtil的文件名修改
-
-
- 默认有组,前缀等,应该和微服务dataId对应
- NacosConfig中localHost对应nacos的地址端口进行修改
-
- yml的配置
实验步骤:
1. 创建一个微服务
\
POM文件:
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
yaml文件
server:
port: 9008
spring:
application:
## 指定服务名称,在nacos中的名字
name: sentinel-service
cloud:
nacos:
discovery:
# nacos的服务地址,nacos-server中IP地址:端口号
server-addr: 127.0.0.1:8848
sentinel:
transport:
## 指定控制台的地址,默认端口8080
dashboard: localhost:8080
## nacos持久化配置
datasource:
## 配置流控规则,名字任意
ds-flow:
nacos:
## nacos的地址
server-addr: 127.0.0.1:8848
## 配置ID
dataId: ${spring.application.name}
## 配置分组,默认是DEFAULT_GROUP
groupId: DEFAULT_GROUP
## 配置存储的格式
data-type: json
## rule-type设置对应得规则类型,总共七大类型,在com.alibaba.cloud.sentinel.datasource.RuleType这个枚举类中有体现
rule-type: flow
management:
endpoints:
web:
exposure:
## yml文件中存在特殊字符,必须用单引号包含,否则启动报错
include: '*'
\
接口
@RestController
@RequestMapping("/sentinel")
public class FlowLimitController {
@GetMapping("/test")
public String test(){
return "接收到一条消息--------";
}
}
其他步骤请自行创建
启动微服务
2.启动Nacos
打开nacos
3.改造Sentinel DashBoard
\
3.1 修改pom.xml
找到
<!-- for Nacos rule publisher sample -->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
<scope>test</scope>
</dependency>
将 test 这一行注释掉,即改为如下:
<!-- for Nacos rule publisher sample -->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
<!--<scope>test</scope>-->
</dependency>
3.2
找到 sentinel-dashboard/src/test/java/com/alibaba/csp/sentinel/dashboard/rule/nacos目录,将整个目录拷贝到 sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/nacos
\
3.3 将FlowControllerV2中的代码复制到FlowControllerV1中
com.alibaba.csp.sentinel.dashboard.controller.v2.FlowControllerV2这个是sentinel提供的demo,
只需要将其中的代码全部覆盖到com.alibaba.csp.sentinel.dashboard.controller.FlowControllerV1中。
3.4 修改FlowControllweV1中的代码
- 修改RequestMapping中的请求url为/v1/flow
- 修改ruleProvider、rulePublisher的依赖,修改后的代码如下:
@Autowired
//使用nacos的依赖
@Qualifier("flowRuleNacosProvider")
private DynamicRuleProvider<List<FlowRuleEntity>> ruleProvider;
@Autowired
//使用nacos的依赖
@Qualifier("flowRuleNacosPublisher")
private DynamicRulePublisher<List<FlowRuleEntity>> rulePublisher;
3.5 修改nacos相关配置
com.alibaba.csp.sentinel.dashboard.rule.nacos.NacosConfigUtil配置项必须与yaml中的对应,必须一致
包括:
- GROUP_ID(组名)
- FLOW_DATA_ID_POSTFIX(限空后缀)
- ...
\
com.alibaba.csp.sentinel.dashboard.rule.nacos.NacosConfig
这个类中有个方法如下图:
映射到Nacos的ip+port
启动Sentinal DashBoard
mvn clean install -DskipTests=true -pl sentinel-dashboard -am
\
4.实验测试环节
上面三部检查好实验就做好了一半。
记住约定>配置>编码
正式开始实验测试
\
- 测试1: Sentinel推Nacos
- 测试2:Nacos导入推Sentinel
- 测试3:微服务接口限流
\
4.1多次首先访问(并没有限流)
\
4.2 Sentinel配置快速失败限流规则
配置好规则就推到Nacos中了。
再测试下微服务流控规则是否生效
4.3 从Nacos中配置规则
删除4.2中Nacos配置,会发现Sentinel DashBoard中限流规则已经删除,这时可以证明Nacos推Sentinel中是成功的。
再实验下接口限流规则是否删除。
实验证明接口限流已经删除。
再做Nacos中的配置
[{"app":"sentinel-service","clusterConfig":{"acquireRefuseStrategy":0,"clientOfflineTime":2000,"fallbackToLocalWhenFail":true,"resourceTimeout":2000,"resourceTimeoutStrategy":0,"sampleCount":10,"strategy":0,"thresholdType":0,"windowIntervalMs":1000},"clusterMode":false,"controlBehavior":0,"count":1.0,"gmtCreate":1640508090115,"gmtModified":1640508090115,"grade":1,"id":27,"ip":"10.0.217.204","limitApp":"default","port":8719,"resource":"/sentinel/test","strategy":0}]
Nacos配置时要配对....
微服务调用接口-->限流!!!!
终于成功了!!!
总结
对限流规则做持久化,可自行配置降级规则,热点参数规则等持久化....