目标:Sentinel的基本应用 工具:IDEA--2020.1、Sentinel Maven SpringCloud 学习目标:学习Sentinel热点限流——热点参数限流的使用 本次学习的工程在最后面
1.导入热点参数限流依赖包
代码语言:javascript复制 <!--导入热点参数限流依赖包-->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-parameter-flow-control</artifactId>
<version>1.7.1</version>
</dependency>
2.接下来创建一个REST接口,并定义限流资源名,此处正对id配置限流规则
代码语言:javascript复制@RestController
public class ParamRuleController {
// com.xmaven.controller.ParamRuleController:sayHello(java.lang.String)
private String resourceName="sayHello";
@GetMapping("/hello1")
@ResponseBody
public String sayHello(@PathParam("id")String id, @PathParam("name")String name){
Entry entry=null;
try {
// 只对参数id进行限流,参数name不进行限制
entry= SphU.entry(resourceName, EntryType.IN,1,id);
return "access success";
} catch (BlockException e) {
e.printStackTrace();
return "block";
}finally {
if(entry!=null) {
entry.exit();
}
}
}
@PostConstruct
public void initParamRule(){
ParamFlowRule rule = new ParamFlowRule(resourceName);
rule.setParamIdx(0);
rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
rule.setCount(1);
ParamFlowRuleManager.loadRules(Collections.singletonList(rule));
}
}
3.说明
针对不同的热点参数,需要通过SphU.entry(resourceName, EntryType.IN,1,id)方法设置,其最后一个参数是一个数组,有多个热点参数,需要依次按照次序传入,改配置表示后续会正对该参数进行限流。
下面正对上述资源sayHello进行热点参数限流规则,通过ParamFlowRuleManager.loadRules方法加载热点规则
我尝试把版本全部提升到1.7.2发现不兼容,建议都是用springcloudalibaba 1.7.1版本的
4.通过测试工具或者快速刷新热点参数限流
访问我们的Sentinel Dashboard,进入实时监控来查看限流效果 访问 http://localhost:8888/hello1?id=123&name=
5.使用@SentinelResource热点参数限流
如果是使用这个注解来定义资源,当注解所配置的方法上有参数时,Sentinel会把这个参数传入给SphU.entry(res,args) 比如下面的代码:
代码语言:javascript复制@SentinelResource
@GetMapping("/hello2")
@ResponseBody
public String sayHello2(@PathParam("id")String id){
return "SUCCESS";
}
默认情况下访问这个接口就会触发热点限流规则的验证。
下载链接:springcloud-sentinel-dynamic-rule2.rar