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 匀速排队)
posted @ 2022-07-26 14:56  LiuChengloong  阅读(525)  评论(0编辑  收藏  举报