流量控制(flow control),其原理是监控资源(Resource)的统计指标,然后根据Token计算策略来计算资源的可用Token(也就是阈值),然后根据流量控制策略对请求进行控制,避免被瞬时的流量高峰冲垮,从而保障应用的高可用性。
流控配置 1.选择访问的簇点链路,选择具体流控规则
新增留空信息
QPS: 每秒请求访问量,配合阈值使用
并发线程数:当前请求每秒并发访问量,配合阈值使用
流控模式:
直接:单个接口访问
关联:关联两接口A、B。如当前A访问量达到阈值后,B同样限流
链路:分布式服务中,多服务调用总时常
流控效果:
快速失败:顾名思义,当请求达到配置阈值直接失败
warm up:慢加载,在指定时间内,慢慢达到请求阈值。如阈值:10,预热时长:5。当服务接收到第一次求请求,前5秒会以10/3的流量慢慢达到请求阈值10.
排队等待:类似于队列机制,先到先得,后到排队访问。
如上:当前请求/testA接口,当QPS大于10时,会直接触发失败
如上:当前/testA请求并发数,大于10时。接口/testB与/testA都会触发限流
如上:当/testA从无接口请求->有请求时。服务会以 10/3 -> 10的阈值过度,持续时间为5秒
参考官方文档:https://sentinelguard.io/zh-cn/docs/golang/circuit-breaking.html
以上图为例:最大RT -> 最大request time
解读上图的意思就是:最少5次请求中,超过比例阈值50%的请求,每次响应时间大于200毫秒,则触发熔断,每次熔断触发时间为3秒
解读上图的意思就是:最少5次请求中,超过比例阈值70%的请求,出现异常时,则触发熔断,每次熔断触发时间为3秒
解读上图的意思就是:最少5次请求中,超过4次请求,出现异常时,则触发熔断,每次熔断触发时间为3秒
上图意思为:/testB资源,QPS最大为1,当超过时就会触发熔断。但是当请求参数包含10时,QPS可以是10。
@RequestMapping("/testB") @SentinelResource(value = "testB", blockHandler = "error_request") // 不配置blockHandler会返回限流异常错误 public String testB(@RequestParam("p1") Long p1) { log.info("request testB"); return "test -- B"; } public String error_request(@RequestParam("p1") Long p1, BlockException e) { log.info("request testB fallback"); return "请求异常,请稍后再尝试"; }
代码示例
另外 @SentinelResource 注解,只能fallback配置错误,当接口异常时,会返回原本的异常信息。