【Sentinel系列】 同一类URL资源统一限流

这是我参与11月更文挑战的第21天,活动详情查看:2021最后一次更文挑战

同一类的URL资源统一限流

Sentinel中HTTP服务的限流默认情况下由Sentinel-Web-Sentinel包中的CommonFilter来实现,这个Filter将每个不同的URL资源作为不同的资源来处理。

针对一个携带{name}参数的REST接口,每一个不同的{name},URL也会不一样,因此在默认情况下Sentinel将所有的URL当作资源来进行流控。

@RestController
@RequestMapping("/sentinel")
public class SentinelController {

    @GetMapping(value = "/info/{name}")
    public String getName(@PathVariable("name") String name){
        return name;
    }
}
复制代码

这种处理方式导致两个问题:

  1. 限流统计不准确,实际需要的是控制getName方法总的QPS,结果统计的是每个URL资源的QPS。
  2. 导致Sentinel中资源数量过多,默认资源数量的阈值为6000,超过这个阈值的资源规则会不生效。

对于这个问题可以通过Url接口来实现资源统一清洗,也就是将/info/{name}这个URL资源,统一定义为/info/*资源下,需要实现UrlCleaner接口,并且重写clean方法,具体代码实现如下:

@Service
public class CustomerUrlCleaner implements UrlCleaner{
    @Override
    public String clean(String originUrl){
        if(StringUtils.isEmpty(originUrl)){
            	return originUrl;
        }
        if(originUrl.startsWith("/info/")){
            return "/info/*";
        }
        return originUrl;
    }
}
复制代码
Sentinel 整合 Nacos 实现动态流控规则

定义的资源设置流控规则有两种方式:

  1. 通过FlowRuleManagement.loadRules(List rules)手动加载流控规则。
  2. 在Sentinel Dashboard对资源动态创建流控规则。

基于Sentinel Dashboard所配置的流控规则,是保存在内存中,一旦应用重启,这些规则会被清理掉,解决这个问题,Sentinel提供了动态数据源接入。

Sentinel 支持Nacos、Redis、Apollo、Zookeeper、Consul等数据源的扩展。 Spring Cloud Sentinel 整合 Nacos 实现动态流控规则,步骤如下:

  1. 添加Nacos数据源的maven依赖·

    <dependency>
    	<groupId>com.alibaba.csp</groupId>
        <artifactId>sentinel-datasource-nacos</artifactId>
        <version>1.7.0</version>
    </dependency>
    复制代码
    1. 创建一个REST接口,用于测试
    @RestController
    @RequestMapping("/sentinel")
    public class SentinelController {
    
        @GetMapping(value = "/info")
        public String getName(){
            return " Dynamic Rule";
        }
    }
    复制代码

猜你喜欢

转载自juejin.im/post/7032976992068861988
今日推荐