这是我参与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;
}
}
复制代码
这种处理方式导致两个问题:
- 限流统计不准确,实际需要的是控制getName方法总的QPS,结果统计的是每个URL资源的QPS。
- 导致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 实现动态流控规则
定义的资源设置流控规则有两种方式:
- 通过FlowRuleManagement.loadRules(List rules)手动加载流控规则。
- 在Sentinel Dashboard对资源动态创建流控规则。
基于Sentinel Dashboard所配置的流控规则,是保存在内存中,一旦应用重启,这些规则会被清理掉,解决这个问题,Sentinel提供了动态数据源接入。
Sentinel 支持Nacos、Redis、Apollo、Zookeeper、Consul等数据源的扩展。 Spring Cloud Sentinel 整合 Nacos 实现动态流控规则,步骤如下:
-
添加Nacos数据源的maven依赖·
<dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-datasource-nacos</artifactId> <version>1.7.0</version> </dependency> 复制代码
- 创建一个REST接口,用于测试
@RestController @RequestMapping("/sentinel") public class SentinelController { @GetMapping(value = "/info") public String getName(){ return " Dynamic Rule"; } } 复制代码