Sentinel规则配置之外部数据源
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Sentinel规则配置之外部数据源相关的知识,希望对你有一定的参考价值。
在前面的示例中,对于Sentinel的限流和熔断的规则都是通过硬编码实现的,在实际的开发过程中,我们都会选择外部配置的方式来定制规则。Sentinel为我们提供了sentinel-datasource-extension来实现规则的外部配置化,并能实现热更新。
首先我们需要引入对应的依赖包
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-extension</artifactId>
<version>1.8.0</version>
</dependency>
该依赖包中源文件总共也就9个,其关系如下所示
其中的FileRefreshableDataSource可供我们读取外部的配置文件,并对文件的更新做监控。那么在代码中我们应该怎么使用呢?
/**
* 格式:
* [
* {
* "resource": "helloworld",
* "controlBehavior": 2,
* "count": 5,
* "grade": 1,
* "limitApp": "default",
* "strategy": 0
* }
* ]
* */
public void flowRule() throws FileNotFoundException {
// 保存了限流规则的文件的地址
String flowRuleName = "flow-rule.json";
//定义用于进行数据转换的对象
Converter<String, List<FlowRule>> converter = new Converter<String, List<FlowRule>>(){
/**
* 将读取到的JSON数据转换为对应的对象
* @param source 从数据源(本例是文件)读取到的数据
* */
@Override
public List<FlowRule> convert(String source) {
ObjectMapper objectMapper = new ObjectMapper() ;
try {
return objectMapper.readValue(source, new TypeReference<List<FlowRule>>(){}) ;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
} ;
// 创建文件规则数据源
FileRefreshableDataSource<List<FlowRule>> flowRuleDataSource
= new FileRefreshableDataSource<List<FlowRule>>(flowRuleName, converter);
// 将Property注册到 RuleManager 中去
FlowRuleManager.register2Property(flowRuleDataSource.getProperty());
}
public void degradeRule() throws FileNotFoundException {
// 保存了熔断规则的文件的地址
String degradeRuleRuleName = "degrade-rule.json";
//定义用于进行数据转换的对象
Converter<String, List<DegradeRule>> converter = new Converter<String, List<DegradeRule>>(){
/**
* 将读取到的JSON数据转换为对应的对象
* @param source 从数据源(本例是文件)读取到的数据
* */
@Override
public List<DegradeRule> convert(String source) {
ObjectMapper objectMapper = new ObjectMapper() ;
try {
return objectMapper.readValue(source, new TypeReference<List<DegradeRule>>(){}) ;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
} ;
// 创建文件规则数据源
FileRefreshableDataSource<List<DegradeRule>> flowRuleDataSource
= new FileRefreshableDataSource<List<DegradeRule>>(degradeRuleRuleName, converter);
// 将Property注册到 DegradeRuleManager 中去
DegradeRuleManager.register2Property(flowRuleDataSource.getProperty());
}
当然,以上的代码应该在系统初始化的时候运行,以免在执行限流时找不到对应的规则。至于是如何实现规则的热更新的,只需要从FlowRuleManager.register2Property方法入手跟踪源码便知,相对简单。
除了使用文件外,Sentinel还提供了其它的一些拓展供大家直接使用,看如下的这些依赖包便能知道是做什么的了,期原理和上面是一致的,在这就不缀诉了。
<!-- 从nacos中拉取规则的配置 -->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
<version>1.8.0</version>
</dependency>
<!-- 从apollo中拉取规则的配置 -->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-apollo</artifactId>
<version>1.8.0</version>
</dependency>
<!-- 从zookeeper中拉取规则的配置 -->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-zookeeper</artifactId>
<version>1.8.0</version>
</dependency>
<!-- 从consul中拉取规则的配置 -->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-consul</artifactId>
<version>1.8.0</version>
</dependency>
<!-- 从redis中拉取规则的配置 -->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-redis</artifactId>
<version>1.8.0</version>
</dependency>
以上是关于Sentinel规则配置之外部数据源的主要内容,如果未能解决你的问题,请参考以下文章