微服务框架
【SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】
微服务保护
文章目录
- 微服务框架
- 微服务保护
- 31 限流规则
- 31.3 流控模式【链路】
- 31.3.1 流控模式 - 链路
- 31.3.2 举个栗子
- 31.3.3 总结
31 限流规则
31.3 流控模式【链路】
31.3.1 流控模式 - 链路
链路模式:只针对从指定链路访问到本资源的请求做统计,判断是否超过阈值。
例如有两条请求链路:
- /test1 → /common
- /test2 → /common
如果只希望统计从/test2进入到/common的请求,则可以这样配置:
31.3.2 举个栗子
【案例】流控模式-链路
需求:有查询订单和创建订单业务,两者都需要查询商品。针对从查询订单进入到查询商品的请求统计,并设置限流。
步骤:
- 在OrderService中添加一个queryGoods方法,不用实现业务
public void queryGoods(){
System.err.println("查询商品");
}
- 在OrderController中,改造/order/query端点,调用OrderService中的queryGoods方法
@GetMapping("/query")
public String queryOrder(){
// 查询商品
orderService.queryGoods();
//查询订单
System.out.println("查询订单");
return "查询订单成功";
}
- 在OrderController中添加一个/order/save的端点,调用OrderService的queryGoods方法
@GetMapping("/save")
public String saveOrder(){
// 查询商品
orderService.queryGoods();
//查询订单
System.out.println("新增订单");
return "新增订单成功";
}
这样就写好了两个链路
但是这样还存在着问题,sentinel 默认只会监控controller 接口,service 默认不会受到监控
【所以我们应该去监控一下service 中查询商品的方法queryGoods()】
Sentinel默认只标记Controller中的方法为资源,如果要标记其它方法,需要利用@SentinelResource注解,示例:
@SentinelResource("goods")
public void queryGoods(){
System.err.println("查询商品");
}
Sentinel默认会将Controller方法做context整合,导致链路模式的流控失效,需要修改application.yml,添加配置:
sentinel:
transport:
dashboard: localhost:8080
web-context-unify: false # 关闭context 整合
重启服务
访问一下两个接口
OK,回到sentinel 控制台刷新
- 给queryGoods设置限流规则,从/order/query进入queryGoods的方法限制QPS必须小于2
添加规则【两个goods 随便点一个,因为是同一个】
直接新增
OK,直接开测
200 个请求,时间50 s,一秒4次【我们配的阈值是2】
直接运行
这是save 的不受影响
这是query 的,会被限流【两个两个的】
看看实时监控
妙啊
31.3.3 总结
流控模式有哪些?
- 直接:对当前资源限流
- 关联:高优先级资源触发阈值,对低优先级资源限流。
- 链路:阈值统计时,只统计从指定资源进入当前资源的请求,是对请求来源的限流