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

上一篇: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(">>>秒杀接口限流策略配置成功<<<");
    }
}

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

此时如果频繁访问:
Sentinel实现热点词限流  | 带你读《Spring Cloud Alibaba(2019)》之十七

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

控制台自定义形式

一、搭建环境:
Sentinel实现热点词限流  | 带你读《Spring Cloud Alibaba(2019)》之十七

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

二、编辑代码

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

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

新增动态规则:
Sentinel实现热点词限流  | 带你读《Spring Cloud Alibaba(2019)》之十七

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

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

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

出现异常的执行结果:
Sentinel实现热点词限流  | 带你读《Spring Cloud Alibaba(2019)》之十七

VIP通道设置:调整访问频率即可:
Sentinel实现热点词限流  | 带你读《Spring Cloud Alibaba(2019)》之十七

此时其他窗口还是每秒钟可以访问一次,次数过多会提示“访问频率过高”,但是888窗口是“VIP”,它可以每秒钟访问10次!
Sentinel实现热点词限流  | 带你读《Spring Cloud Alibaba(2019)》之十七

上一篇:拿下人脸识别“世界杯”冠军!松下-NUS 和美国东北大学实战分享


下一篇:[推荐]ORACLE PL/SQL编程详解之三:PL/SQL流程控制语句(不给规则,不成方圆)