侧边栏壁纸
博主头像
Epoch

Java开发、Python爬虫、微服务、分布式、前端

  • 累计撰写 93 篇文章
  • 累计创建 110 个标签
  • 累计收到 8 条评论

目 录CONTENT

文章目录

Sentinel热点限流

Epoch
2020-06-19 / 0 评论 / 0 点赞 / 289 阅读 / 564 字 / 正在检测是否收录...

目标:Sentinel的基本应用
工具:IDEA–2020.1、Sentinel Maven SpringCloud
学习目标:学习Sentinel热点限流——热点参数限流的使用
本次学习的工程在最后面

1.导入热点参数限流依赖包

    <!--导入热点参数限流依赖包-->
    <dependency>
        <groupId>com.alibaba.csp</groupId>
        <artifactId>sentinel-parameter-flow-control</artifactId>
        <version>1.7.1</version>
    </dependency>

2.接下来创建一个REST接口,并定义限流资源名,此处正对id配置限流规则

@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=
T_CH8-NSE-VTS3FB-WW.png

FUDAB)OG7~0{B5WL5SC8O6O.png

5.使用@SentinelResource热点参数限流

如果是使用这个注解来定义资源,当注解所配置的方法上有参数时,Sentinel会把这个参数传入给SphU.entry(res,args)
比如下面的代码:

    @SentinelResource
    @GetMapping("/hello2")
    @ResponseBody
    public String sayHello2(@PathParam("id")String id){
        return "SUCCESS";
    }

默认情况下访问这个接口就会触发热点限流规则的验证。


下载链接:springcloud-sentinel-dynamic-rule2.rar

0

评论区