【转】 SpringCloudAlibaba--10——sentinel

【转】 SpringCloudAlibaba--10——sentinel

参考地址:蚂蚁课堂

* 秒杀接口如何实现热词限流

热词参数限流:就是对请求的某个参数进行限流,不允许一个用户一直在同一时间不停访问,从而增加秒杀的几率。比如请求上有个userId,如果是同一个userId的值在一直不停的访问,是不行的。

举例:

写个秒杀接口的伪代码:

@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 控制台好点

控制自定义形式

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

参数索引表示我们方法传递的第一个参数

使用全局捕获异常捕获修改限流出现错误

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

* 控制台热刺参数vip通道

 

posted @ 2020-10-15 01:52  CLASSIC~W  阅读(160)  评论(0编辑  收藏  举报