一、基本介绍

spring cloud histry怎么做的限流 springcloud限流算法_ide

  • 资源名:唯一名称,默认请求路径。
  • 针对来源:Sentinel可以针对调用者进行限流,填写微服务名,默认default(不区分来源)。
  • 阈值类型/单机阈值:
  • QPS(每秒请求数量):当调用该API的QPS达到阈值的时候,进行限流。
  • 线程数:当调用该API的线程数达到阈值的时候,进行限流。
  • 是否集群:不需要集群。
  • 流控模式:
  • 直接:API达到限流条件时,直接限流。
  • 关联:当关联的资源达到阈值的时候,就限流自己。
  • 链路:只记录指定链路上的流量(指定资源从入口资源进来的流量,如果达到阈值,就进行限流)[API级别的针对来源]。
  • 流控效果:
  • 快速失败:直接失败,抛异常。
  • Warm Up:根据codeFactor(冷加载因子,默认为3)的值,从阈值/codeFactor,经过预热时长,才达到设置的QPS阈值。
  • 排队等待:匀速排队,让请求以匀速的速度通过,阈值类型必须设置为QPS,否则无效。

二、流控模式之直接(默认直接–>快速失败)

(1)添加流控规则

spring cloud histry怎么做的限流 springcloud限流算法_spring_02

    表示1秒内查询1次就是OK,如果超过1次,就直接–>快速失败,报默认错误。

(2)测试

    启动provider-8101模块,多次快速访问http://localhost:8101/provider/get/1,被Sentinel阻塞(流量限制)

spring cloud histry怎么做的限流 springcloud限流算法_限流_03

三、流控模式之关联

(1)关联模式是什么?

    当和A关联的资源B达到阈值的时候,就限流A自己。比如:电商系统中,下订单后面的流程就是支付,一旦支付超过阈值,就需要限制下订单。

(2)修改Controller代码。

package com.buba.springcloud.controller;


import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {
    @Value("${server.port}")
    private String serverPort;

    @GetMapping(value = "/provider/get/{id}")
    public String getPayment(@PathVariable("id") Integer id) {
        return "nacos registry, serverPort: " + serverPort + "\t id" + id;
    }

    @GetMapping(value = "/provider/test")
    public String test() {
        return "test";
    }

}

(3)测试

    添加规则,当关联资源/provider/test的QPS的阈值超过1的时候,就限流A的访问。

spring cloud histry怎么做的限流 springcloud限流算法_限流_04

    通过Postman并发测试http://localhost:8101/provider/test,然后通过浏览器访问http://localhost:8401/provider/get/1。

spring cloud histry怎么做的限流 springcloud限流算法_spring cloud_05

四、流控模式之链路

    添加流控规则,设置入口资源。

spring cloud histry怎么做的限流 springcloud限流算法_ide_06

spring cloud histry怎么做的限流 springcloud限流算法_spring cloud_07

    测试,多次访问http://localhost:8101/provider/get/1,触发限流。

spring cloud histry怎么做的限流 springcloud限流算法_spring cloud_08

五、流控效果之预热

(1)概述

  • Warm Up(RuleConstant.CONTROL_BEHAVIOR_WARM_UP)方式,即预热/冷启动方式。当系统长期处于低水位的情况下,当流量突然增加时,直接把系统拉升到高水位可能瞬间把系统压垮。通过"冷启动",让通过的流量缓慢增加,在一定时间内逐渐增加到阈值上限,给冷系统一个预热的时间,避免冷系统被压垮。详细文档可以参考 流量控制 - Warm Up 文档,具体的例子可以参见 WarmUpFlowDemo
  • 公式:阈值除以coldFactor(冷加载因子,默认为3),经过预热后才会达到阈值。

(2)配置

spring cloud histry怎么做的限流 springcloud限流算法_java_09

系统初始化的的阈值是10/3约等于3,即阈值开始为3;经过5秒后阈值才慢慢升高恢复到10。

六、流控效果之排队

(1)概述

spring cloud histry怎么做的限流 springcloud限流算法_spring cloud_10

 (2)修改配置

spring cloud histry怎么做的限流 springcloud限流算法_spring_11

http://localhost:8101/provider/get/1每秒一次请求,超过的话就排队等待,等待的超时时间为20000毫秒。