sentinel持久化
1、配置持久化
service-provider-alibaba-sentinel9010模块引入依赖pom
<!-- 配置成nacos作为数据源 -->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
修改配置文件application.yml
spring:
application:
name: service-provider-alibaba-sentinel9010
cloud:
nacos:
discovery:
server-addr: localhost:8848
sentinel:
transport:
dashboard: localhost:8080
port: 8719
datasource:
ds1: #名称,随意
nacos:
server-addr: localhost:8848 #sentinel地址
data-id: sentinel #nacos里面配置文件的dataid
group-id: DEFAULT_GROUP #nacos里面配置文件的groupid
data-type: json #nacos里面配置文件的类型
rule-type: flow
启动nacos服务,…/nacos/bin目录里面,双击startup.cmd启动nacos服务,添加配置文件
配置内容:
[
{
"resource":"hello",
"limitApp":"default",
"grade":1,
"count":1,
"strategy":0,
"controlBehavior":0,
"clusterMode":false
}
]
启动sentinel服务java -jar sentinel-dashboard-1.8.0.jar
启动service-provider-alibaba-sentinel9010服务,调用http://localhost:9010/hello,发现会进行限流
这里所设置的是sentinel可以读取nacos里面的配置文件内容,也就是存储成为json格式的流控规则
2、流控规则持久化
在sentinel控制台更改流控规则,想要同步到nacos的话,需要更改sentinel-dashboard源码
下载源码:https://github.com/alibaba/Sentinel/releases/tag/v1.8.0下载Source code(zip)
idea打开源码
1、修改sentinel-dashboard模块依赖,将test注释掉
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
<!-- <scope>test</scope>-->
</dependency>
2、打开文件src\main\webapp\resources\app\scripts\directives\sidebar\sidebar.html,将下图中的红线位置修改成dashboard.flow({app: entry.app})
3、将src\test\java\com\alibaba\csp\sentinel\dashboard\rule下的nacos复制到src\main\java\com\alibaba\csp\sentinel\dashboard\rule下
4、修改src\main\java\com\alibaba\csp\sentinel\dashboard\rule\nacos\NacosConfig.java文件
@Configuration
public class NacosConfig {
@Bean
public Converter<List<FlowRuleEntity>, String> flowRuleEntityEncoder() {
return JSON::toJSONString;
}
@Bean
public Converter<String, List<FlowRuleEntity>> flowRuleEntityDecoder() {
return s -> JSON.parseArray(s, FlowRuleEntity.class);
}
@Bean
public ConfigService nacosConfigService() throws Exception {
Properties properties=new Properties();
properties.put(PropertyKeyConst.SERVER_ADDR,"localhost:8848");//如果设置了namespace的话,将namespace添加进去
return ConfigFactory.createConfigService(properties);
}
}
5、修改src\main\java\com\alibaba\csp\sentinel\dashboard\controller\v2\FlowControllerV2.java文件
@RestController
@RequestMapping(value = "/v2/flow")
public class FlowControllerV2 {
private final Logger logger = LoggerFactory.getLogger(FlowControllerV2.class);
@Autowired
private InMemoryRuleRepositoryAdapter<FlowRuleEntity> repository;
@Autowired
@Qualifier("flowRuleNacosProvider")//这里修改成flowRuleNacosProvider
private DynamicRuleProvider<List<FlowRuleEntity>> ruleProvider;
@Autowired
@Qualifier("flowRuleNacosPublisher")//这里修改成flowRuleNacosPublisher
private DynamicRulePublisher<List<FlowRuleEntity>> rulePublisher;
....
}
6、将sentinel-dashboard模块打包,java -jar运行
7、启动nacos服务,启动service-provider-alibaba-sentinel9010sentinel服务,并调用http://localhost:9010/hello
8、登录sentinel-dashboard控制台
登录nacos控制台
去sentinel控制台添加一个新的流控规则
会发现nacos里面也添加了配置,实现了持久化,可以把nacos也配置成数据库的形式来实现持久化
注意:生产模式慎用