结合Spring Cloud Gateway、Hystrix、Sentinel整理限流和熔断笔记

限流

限流就是限定流量。流量阈值可以通过压测得到,比如Jmeter,可以定时发送请求。https://blog.csdn.net/haoranhaoshi/article/details/119106893

限流算法:

可以通过计数器、滑动窗口、漏桶、令牌桶限流。

计数器

计数器统计单位时间内的请求量,达到阈值可以降级。
Redis可以简单地实现计数器限流。
结合Spring Cloud Gateway、Hystrix、Sentinel整理限流和熔断笔记_第1张图片

滑动窗口

滑动窗口可以复用统计,如统计5秒内的流量,可以前一个5秒内的流量减去最远的1秒的流量,加上最近的1秒的流量。Sentinel的限流用的就是滑动窗口,统计最近一秒内的流量,会分成两个500ms,最近的一个旧500ms的流量加上最新的500ms的流量就是1s这个窗口内的流量。

漏桶

漏桶,处理请求的速率固定,如果请求达到了漏桶的容量,就可以降级了。Nginx可以设置限流,用的是漏桶。

令牌桶

令牌桶,生成令牌的速率固定,接收请求,消耗令牌,令牌桶里没有令牌了,就可以降级了。令牌桶可以积累令牌,所以可以应对一定的突发流量。
Spring Cloud Gateway里,RequestRateLimiterGatewayFilterFactory结合Redis,用令牌桶算法限流。Lua脚本在Gateway依赖的META-INF/scripts/request_rate_limiter.lua。

线程池或信号量

Hystrix里,用线程池或信号量限流,一个请求接口对应一个线程池或信号量,默认是线程池。
Sentinel和Hystrix一样,可以判定超时、异常或错误、熔断、限流并降级。
Sentinel的限流是资源限流,不只局限在接口。Nacos、Zookeeper、Dubbo、RocketMQ可以结合Sentinel。

Sentinel

重点是Sentinel,推荐使用Sentinel,功能比Hystrix强大。

限流

Sentinel里的限流规则对应FlowRule,设置限流等级,限流等级的量,资源名称、控制行为策略。一个资源可以对应多个规则。FlowRuleManager执行loadRules,传flowRuleList,就能加载限流规则。SphO执行entry,传参资源名称,返回false,就是被拒绝,true就是通过。
SpringBoot里,给方法限流,加上@SentinelResource,value是资源名称,可以写方法名称,blockHandler=请求被拒绝执行的方法名称,fallback=降级方法名称。没有blockHandler会走fallback。

限流等级

限流等级grade有QPS、并发线程数。

控制行为

FlowRule的controlBehavior是控制行为,有直接拒绝、预热、匀速排队、匀速排队+预热。

直接拒绝就是请求达到阈值,就直接拒绝。
预热就是有突发流量时,每一段时间处理几个,等上一段时间,再处理几个,逐渐地达到阈值。
匀速排队就是匀速地处理请求,如QPS是2,就是每500ms处理一个。超过QPS或者并发线程数的阈值,会排队,直到超时。
匀速排队、预热使用了令牌桶:https://www.jianshu.com/p/e41bf0c133f1

突发流量

burst可以设置应对突发请求的数量。

策略

FlowRule的strategy,根据调用方限流,如果IP,设置一下limitApp;根据调用方链路限流,如果A接口能调用B接口,C接口不能调用B接口;根据相关资源限流,设置一下refrenceResource。

监控

引入sentinel-dashboard可以可视化监控:资源请求通过或拒绝的时间、响应时间。本地服务除了配置dashboard的IP、端口,还配置一个本地端口,Sentinel可以将限流规则推送过来。可以配置黑白名单,配置IP。Hystrix只能监控,不能更新限流和熔断规则。

配置中心动态配置

引入sentinel-datasource-nacos可以动态配置限流规则。

针对多服务实例限流

引入sentinel-cluster-server-default,Token-Server可以控制总的QPS或者并发线程数。Token-Client从Token-Server get token,没有token了就降级。

Dubbo结合Sentinel

引入sentinel-apche-dubbo-adapter,资源名称可以写dubbo服务接口的全限定名。adapter里面实现了Dubbo的Filter接口,META-INF/dubbo里有Dubbo的Filter接口的全限定名命名的文件,里面有adapter里Filter接口的实现类和对应的名称。

熔断

Hystrix里的熔断

一定时长内,一定数量的请求,一定比例失败,就熔断,请求都降级处理,一定时长后,尝试响应一个请求,成功了,就响应所有请求,失败了,就继续熔断。
可以配置请求数量、失败比例、熔断时长。
只支持异常比例的方式熔断。
https://blog.csdn.net/haoranhaoshi/article/details/109405309

Sentinel里的熔断

熔断规则对应DegradeRule,可以选择异常比例,异常数、响应时间。异常比例,异常数、响应时间都可以设置熔断时长、最小请求数。响应时间可以设置最大响应时间、超时比例阈值。

你可能感兴趣的:(#,Spring,Cloud,spring,cloud,gateway,lua)