一、关于限流&熔断&降级的说明
二、限流
1、Guava的RateLimiter
//限制速率为1秒10个请求,2是热身参数-以一种平滑的方式把1秒内的发放令牌的速率放大到最大(适用于初始化时间比较久或者使用了连接池的应用)
//该限流器是非公平令牌桶算法
private RateLimiter switchRateLimiter = RateLimiter.create(10,2, TimeUnit.MILLISECONDS);
//尝试获取一个执行的机会,成功返回true,失败的话则立即false,不排队,想排队用acquire
if(!switchRateLimiter.tryAcquire()){ //do your method }else{
//do your limited method
}
2、hystrix的threadpool
@HystrixCommand(defaultFallback = "defaultFallback",//默认的降级方法,可以无参数
fallbackMethod = "xxxFallback",//指定的降级方法,要求和代理方法同参数
threadPoolProperties = {
@HystrixProperty(name = "coreSize", value = "20"),//核心线程数
@HystrixProperty(name = "maxQueueSize", value = "20"),//队列最大值
@HystrixProperty(name = "queueSizeRejectionThreshold", value = "20")//队列长度到达该值则走降级策略
}
Hystrix 内线程池的使用是基于 Java 内置线程池的简单包装,通常有以下三种状态:
-
如果请求量少,达不到 coreSize,通常会使用核心线程来执行任务。
-
如果设置了
maxQueueSize
,当请求数超过了 coreSize, 通常会把请求放到 queue 里,待核心线程有空闲时消费。 -
如果 queue 长度无法存储请求,则会创建新线程执行直到达到
maximumSize
最大线程数,多出核心线程数的线程会在空闲时回收。
三、熔断(过载保护)
1、hystirx熔断
commandProperties = {
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "500"),//执行时间超过500ms,直接报异常,走降级策略
@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "5"), // 设置当请求失败的数量达到10个后,打开断路器,默认值为20
@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "10000"), // 设置打开断路器多久以后开始尝试恢复,默认为5s
@HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "60"), // 设置出错百分比阈值,当达到此阈值后,打开断路器,默认50%
}
熔断器有 开-关-半开 状态,初始是关状态,被触发后进入开状态,指定时间后会半开,随后根据条件进入开或者关状态
四、降级
1、hystrix服务降级
@HystrixCommand(defaultFallback = "defaultFallback",//默认的降级方法,可以无参数
fallbackMethod = "xxxFallback",//指定的降级方法,要求和代理方法同参数
被限流和被熔断保护期间的调用会被进行降级处理,进入备用方法(fallback),避免服务雪崩。
五、对一个方法做限流&熔断&降级的完整配置
@HystrixCommand(defaultFallback = "defaultFallback",fallbackMethod = "queryFlowProductOrderUnityListFallback", threadPoolProperties = { @HystrixProperty(name = "coreSize", value = "20"),//核心线程数 @HystrixProperty(name = "maxQueueSize", value = "20"),//核心线程数 @HystrixProperty(name = "queueSizeRejectionThreshold", value = "20")//队列长度到达该值则走降级策略 }, commandProperties = { @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "500"),//执行时间超过500ms,直接报异常,走降级策略 @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "5"), // 设置当请求失败的数量达到10个后,打开断路器,默认值为20 @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "10000"), // 设置打开断路器多久以后开始尝试恢复,默认为5s @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "60"), // 设置出错百分比阈值,当达到此阈值后,打开断路器,默认50% }) public Object queryFlowProductOrderUnityList(
)
public Object queryFlowProductOrderUnityListFallback(){}
public Object defaultFallback(){}
六、核心思想&算法
1、令牌桶和漏桶算法
2、关于hystrix的限流和guava-Ratelimiter的限流
hystrix限制的是并发数,受配置和响应时间影响
RateLimiter限制的是流量本身,而不在后续处理消耗多少时间,属于流量整形