Sentinel实现热点词限流 | 带你读《Spring Cloud Alibaba(2019)》之十七-阿里云开发者社区

开发者社区> 开发者学习资源库> 正文

Sentinel实现热点词限流 | 带你读《Spring Cloud Alibaba(2019)》之十七

简介: 本节介绍fallback与blockHandler的区别,手动形式创建限流,控制台自定义形式

上一篇:sentinel怎样实现熔断降级? | 带你读《Spring Cloud Alibaba(2019)》之十六
下一篇:什么是分布式事务? | 带你读《Spring Cloud Alibaba(2019)》之十八

本文来自于《精通Spring Cloud Alibaba》课程的整理,讲师为余胜军,点击查看视频内容
本文系志愿者整理,供配合学习中心课程使用,不做商业用途。

Sentinel实现热点词限流

热点参数限流
https://github.com/alibaba/Sentinel/wiki/%E7%83%AD%E7%82%B9%E5%8F%82%E6%95%B0%E9%99%90%E6%B5%81

可以根据访问频繁的参数实现限流。

热点参数限流:对接口热词实现限流

fallback与blockHandler的区别

fallback是服务熔断或者业务逻辑出现异常执行的方法(1.6版本以上)
blockHandler 限流出现错误执行的方法。

手动形式创建限流

@RestController
@Slf4j
public class SeckillServiceImpl {

    public SeckillServiceImpl() {
        initSeckillRule();
    }

    /**
     * 秒杀路由资源
     */
    private static final String SEKILL_RULE = "seckill";

    /**
     * 秒杀抢购
     *
     * @return
     */
    @RequestMapping("/seckill")
    public String seckill(Long userId, Long orderId) {
        try {
            Entry entry = SphU.entry(SEKILL_RULE, EntryType.IN, 1, userId);
            return "秒杀成功";
        } catch (Exception e) {
            return "当前用户访问过度频繁,请稍后重试!";
        }
    }
    // seckill?userId=123456&orderId=644064779
    // seckill?userId=123456&orderId=644064779

    private void initSeckillRule() {
        ParamFlowRule rule = new ParamFlowRule(SEKILL_RULE)
                // 对我们秒杀接口第0个参数实现限流
                .setParamIdx(0)
                .setGrade(RuleConstant.FLOW_GRADE_QPS)
                // 每秒QPS最多只有1s
                .setCount(1);
        ParamFlowRuleManager.loadRules(Collections.singletonList(rule));
        log.info(">>>秒杀接口限流策略配置成功<<<");
    }
}

执行结果:
1.png

此时如果频繁访问:
2.png

此时利用这种方式限流是不灵活的。

控制台自定义形式

一、搭建环境:
3.png

4.png

二、编辑代码

@RequestMapping("/seckill")
@SentinelResource(value = SEKILL_RULE, fallback = "seckillFallback", blockHandler = "seckillBlockHandler")
public String seckill(Long userId, Long orderId) {
    return "秒杀成功";
}

执行结果:
5.png

新增动态规则:
5.png

参数索引表示我们方法传递的第一个参数;注意:该配置在重启之后不会保存。

但此时出现异常会直接显示页面崩溃,用户体验不好,我们可以使用全局捕获异常捕获修改限流出现错误:

@RestControllerAdvice
public class InterfaceExceptionHandler {
    @ResponseBody
    @ExceptionHandler(ParamFlowException.class)
    public String businessInterfaceException(ParamFlowException e) {
        return "您当前访问的频率过高,请稍后重试!";
    }
}

出现异常的执行结果:
6.png

VIP通道设置:调整访问频率即可:
7.png

此时其他窗口还是每秒钟可以访问一次,次数过多会提示“访问频率过高”,但是888窗口是“VIP”,它可以每秒钟访问10次!
8.png

版权声明:本文中所有内容均属于阿里云开发者社区所有,任何媒体、网站或个人未经阿里云开发者社区协议授权不得转载、链接、转贴或以其他方式复制发布/发表。申请授权请邮件developerteam@list.alibaba-inc.com,已获得阿里云开发者社区协议授权的媒体、网站,在转载使用时必须注明"稿件来源:阿里云开发者社区,原文作者姓名",违者本社区将依法追究责任。 如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:developer2020@service.aliyun.com 进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:

开发者免费资源中心,技术电子书、会议PPT、论文资料持续供应中

官方博客
官网链接