sentinel流控模式之链路类型
关联文章:
前言
需要注意sentinel流控模式中的关联类型和链路类型的区别:
-
关联 ,假设A规则关联B,那么A资源是受限制的 链路 ,假设A规则绑定了一个链路,关联B,那么受限制的是B
链路模式
链路模式:只针对从指定链路访问到本资源的请求做统计,判断是否超过阈值。
例如有两条请求链路:
/test1 /common /test2 /common
如果只希望统计从/test2进入到/common的请求,对/test2 进行限流,则可以这样配置:
案例:流控模式-链路
需求:有查询订单和创建订单业务,两者都需要查询商品。针对从查询订单进入到查询商品的请求统计,并设置限流。
Sentinel默认只标记Controller中的方法为资源,如果要标记其它方法,需要利用@SentinelResource注解,示例:
@SentinelResource("goods") public void queryGoods(){ System.err.println("查询商品"); }
Sentinel默认会将Controller方法做context整合,导致链路模式的流控失效,需要修改application.yml,添加配置 web-context-unify: false ,表示关闭:
spring: cloud: sentinel: transport: dashboard: localhost:8080 # sentinel控制台地址 web-context-unify: false # 关闭context整合
访问/order/query、/order/save资源 http://localhost:8088/order/query ##触发链路限流 http://localhost:8088/order/save ##不会触发链路限流
聚合导致链路不生效
从1.6.3版本开始,Sentinel Web filter默认收敛所有URL的入口context,导致链路限流不生效。 从1.7.0版本开始,官方在CommonFilter引入了WEB_CONTEXT_UNIFY参数,用于控制是否收敛context,将其配置为false即可根据不同的URL进行链路限流。
有2个方法:
方法一 ,添加配置类,配置CommonFilter过滤器,指定WEB_CONTEXT_UNIFY=false,禁止收敛URL的入口context
@Configuration public class SentinelConfig { @Bean public FilterRegistrationBean sentinelFilterRegistration() { FilterRegistrationBean registration = new FilterRegistrationBean(); registration.setFilter(new CommonFilter()); registration.addUrlPatterns("/*"); // 入口资源关闭聚合 解决流控链路不生效的问题 registration.addInitParameter(CommonFilter.WEB_CONTEXT_UNIFY, "false"); registration.setName("sentinelFilter"); registration.setOrder(1); return registration; } }
方案二 需要修改application.yml,添加配置 web-context-unify: false ,表示关闭:
spring: cloud: sentinel: transport: dashboard: localhost:8080 # sentinel控制台地址 web-context-unify: false # 关闭context整合