上一篇: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(">>>秒杀接口限流策略配置成功<<<");
}
}
执行结果:
此时如果频繁访问:
此时利用这种方式限流是不灵活的。
控制台自定义形式
一、搭建环境:
二、编辑代码
@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通道设置:调整访问频率即可:
此时其他窗口还是每秒钟可以访问一次,次数过多会提示“访问频率过高”,但是888窗口是“VIP”,它可以每秒钟访问10次!