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整合

参考

经验分享 程序员 微信小程序 职场和发展