目标:Sentinel的基本应用
工具:IDEA–2020.1、Sentinel Maven Spring Boot
学习目标:学习基于Sentinel Dashboard来实现URL资源清洗
本次学习的工程下载链接放到文本最后面
Sentinel中的HTTP服务的限流默认由Sentinel—Web-Servlet包中的CommonFilter来实现,这个Filter会把每个不同的URL都作为不同的资源来处理
在下面的这段代码中,提供携带{id}参数的REST风格API,对于每一个不同的{id},URL也都不一样,所以在默认情况下Sentinel会把所有的URL当做资源来进行流控
@RestController
public class UrlCleanController {
@GetMapping("/clean/{id}")
public String clean(@PathVariable("id")int id){
return "hello clean";
}
}
这种会导致两个问题:
- 限流统计不准确,实际需要是控制clean方法总的QPS,结果统计的是每个URL的QPS
- 导致Sentinel中资源数量过多,默认资源数量的阈值是6000,对于多出的资源规则将不会生效
正对这个问题可以通过URLCleaner接口来实现资源清洗,也就是对于/clean/{id}这个URL,我们可以统一归类到/clean/*资源下
,实现UrlCleaner接口,并重写clean方法。
@Service
public class CustomerUrlCleaner implements UrlCleaner {
@Override
public String clean(String s) {
if (StringUtils.isEmpty(s)){ //判断字符是否为空
return s;
}
if(s.startsWith("/clean/")){ //判断起始的是不是以/clean/开始
return "/clean/*";
}
return s;
}
}
接下来启动Sentinel服务,访问 http://localhost:8080/clean/1 然后我们进入Sentinel Dashboard里面对资源进行限流。
添加成功界面如下
访问 http://localhost:8080/clean/1 和 http://localhost:8080/clean/2 后面的数字自己随便写一个就行,我们多次快速刷新访问这些界面,发现资源都被归为一类了
效果去Sentinel Dashboard里面自行观看
效果如下图所示
下载链接:sentinel-sample3.rar
评论区