Skip to content

流量控制,其原理是监控应用流量的QPS(每秒查询率) 或并发线程数等指标,当达到指定的阈值时对流量进行控制,以避免被瞬时的流量高峰冲垮,从而保障应用的高可用性

第1步: 点击簇点链路,我们就可以看到访问过的接口地址,然后点击对应的流控按钮,进入流控规则配置页面。新增流控规则界面如下: 流控

配置流控模式

点击上面设置流控规则的编辑按钮,然后在编辑页面点击高级选项,会看到有流控模式一栏。

  • 直接(默认):接口达到限流条件时,开启限流
  • 关联:当关联的资源达到限流条件时,开启限流 [适合做应用让步]
  • 链路:当从某个接口过来的资源达到限流条件时,开启限流

直接流控模式是最简单的模式,当指定的接口达到限流条件时开启限流。上面案例图片使用的就是直接流控模式,不做额外说明。

关联流控模式

配置限流规则, 将流控模式设置为关联,关联资源设置为的 /order/message2。

意思是我们设置/order/message1关联到/order/message2,通过postman软件向/order/message2连续发送请求,注意QPS一定要大于3,访问/order/message1,会发现已经被限流

链路流控模式

链路流控模式指的是,当从某个接口过来的资源达到限流条件时,开启限流。它的功能有点类似于针对来源配置项,区别在于:针对来源是针对上级微服务,而链路流控是针对上级接口,也就是说它的粒度更细。

第1步: 编写一个service,在里面添加一个方法message

java
@Service
public class OrderServiceImpl3 {

    @SentinelResource("message")
    public void message() {
        System.out.println("message");
    }
}

第2步: 在Controller中声明两个方法,分别调用service中的方法m

java
@RestController
@Slf4j
public class OrderController3 {
    @Autowired
    private OrderServiceImpl3 orderServiceImpl3;
    
    @RequestMapping("/order/message1")
    public String message1() {
        orderServiceImpl3.message();
        return "message1";
    }
    
    @RequestMapping("/order/message2")
    public String message2() {
        orderServiceImpl3.message();
        return "message2";
    }
}

第3步: 禁止收敛URL的入口,context

  1. 首先在配置文件中关闭sentinel的CommonFilter实例化
yaml
spring:
  cloud:
    sentinel:
      filter:
        enabled: false
  1. 添加一个配置类,自己构建CommonFilter实例
java
@Configuration
public class FilterContextConfig {

    @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;
    }
}

第4步: 控制台配置限流规则 控制台配置限流规则

分别通过/order/message1/order/message2访问, 发现2没问题, 1的被限流了

配置流控效果

  • 快速失败(默认): 直接失败,抛出异常,不做任何额外的处理,是最简单的效果
  • Warm Up:它从开始阈值到最大QPS阈值会有一个缓冲阶段,一开始的阈值是最大QPS阈值的1/3,然后慢慢增长,直到最大阈值,适用于将突然增大的流量转换为缓步增长的场景。
  • 排队等待:让请求以均匀的速度通过,单机阈值为每秒通过数量,其余的排队等待; 它还会让设置一个超时时间,当请求超过超时间时间还未处理,则会被丢弃