【转】 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通道