-
断路器(circuitbreaker):断路器有三种普通状态:关闭(closed)、开启、半开(half_open);还有两个特殊状态:禁用(disabled)、强制开启(forced_open)
-
当熔断器关闭时,所有的请求都经过熔断器
-
如果失败率超过设定的阈值,熔断器就会从关闭状态转换到打开状态,这时所有的请求都会被拒绝
-
当经过一段时间之后,熔断器就会从打开状态转换为半开状态,这时仅有一定数量的请求会被放入,并重新计算失败率
-
如果失败率高于阈值,则变为打开状态,如果低于,则变成关闭状态
-
-
断路器使用滑动窗口来存储和统计调用的结果,可以选择基于调用数量的滑动窗口或者基于时间的滑动窗口
-
基于数量的统计了最近n次调用的返回结果,基于时间的统计了最近n秒的调用结果
-
-
断路器代码要装在消费者调用侧,使用@circuitBreaker注解(aop)的方式进行调用
-
bulkhead隔离:
-
依赖隔离&负载保护:用来限制下游服务的最大并发量,提供了两种方式
-
fixedThreadPoolBulkhead线程池(使用了有界队列和固定线程池舱壁)
-
semaphoreBulkhead(信号量舱壁)
-
-
core包含在max里面,所以不用管core的容量,只需要max+阻塞队列的容量即可
-
使用@BUlkhead注解进行舱壁隔离
-
-
限流:@RateLimiter:
-
常见的限流算法:漏桶算法:漏出的速率是规定不变的,对突发性的流量缺乏效率
-
令牌桶算法:spring cloud默认算法(token bucket)
-
滚动时间窗:允许固定数量的请求进入(如疫苗取四个数据相加,超过25就over)超过数量就拒绝或者排队:缺点,容易在某个时间节点突然涌入大量请求,导致系统过载,比如最后一秒是该段的结束同时也是下一段的开始,所以可能会导致系统崩溃
-
滑动时间窗
-