SpringMVC 集成 Sentinel
这里展示的是最小化侵入的集成方式,不需要额外的第三方依赖,只需要 sentinel 本身,所以看起来就不是很灵活,毕竟没有注册中心,没有监控等。
导包
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-core</artifactId>
<version>1.8.4</version>
</dependency>
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-extension</artifactId>
<version>1.8.4</version>
</dependency>
sentinel-core 是核心包,sentinel-datasource-extension 是用于配置动态规则。
实现拉模式的数据源最简单的方式是继承 AutoRefreshDataSource 抽象类,然后实现 readSource() 方法,在该方法里从指定数据源读取字符串格式的配置数据。比如 基于文件的数据源。
FileRefreshableDataSource 会周期性的读取文件以获取规则,当文件有更新时会及时发现,并将规则更新到内存中。
动态规则配置
public class DataSourceInitFunc implements InitFunc {
private Converter<String, List<FlowRule>> flowRuleListParser = source -> JSON.parseObject(source,
new TypeReference<List<FlowRule>>() {
});
@Override
public void init() throws Exception {
ClassLoader classLoader = getClass().getClassLoader();
String flowRulePath = URLDecoder.decode(classLoader.getResource("FlowRule.json").getFile(), "UTF-8");
FileRefreshableDataSource<List<FlowRule>> flowRuleDataSource = new FileRefreshableDataSource<>(
flowRulePath, flowRuleListParser);
FlowRuleManager.register2Property(flowRuleDataSource.getProperty());
}
}
接着将对应的类名添加到位于资源目录(通常是 resource 目录)下的 META-INF/services
目录下的 com.alibaba.csp.sentinel.init.InitFunc
文件中,比如:
com.test.init.DataSourceInitFunc
这样,当初次访问任意资源的时候,Sentinel 就可以自动去注册对应的数据源了。
FlowRule.json
[
{
"resource": "/_cat/health",
"controlBehavior": 1,
"count": 5,
"grade": 1,
"limitApp": "default",
"strategy": 0
}
]
- resource:资源名,即限流规则的作用对象
- count: 限流阈值
- grade: 限流阈值类型(QPS 或并发线程数) 0 代表根据并发数量来限流,1 代表根据 QPS 来进行流量控制
- limitApp: 流控针对的调用来源,若为 default 则不区分调用来源
- strategy: 调用关系限流策略
- controlBehavior: 流量控制效果(0 直接拒绝、1 Warm Up、2 匀速排队)