SpringCloud学习Day04

注:本教程均是参考"程序猿DD"大佬的SpringCloud教程:http://blog.didispace.com/spring-cloud-learning/实践结合自己的理解和总结编写

断路器

当某个服务单元发生故障(类似用电器发生短路)之后,通过断路器的故障监控(类似熔断保险丝),直接切断原来的主逻辑调用。在SpringCloud学习Day03我们虽然模拟服务提供方eureka-client加入了时间延迟,然后在服务消费方通过hytrix命令调用服务超时,触发了降级逻辑,但是即使是这样子受限于Hystrix超时时间问题,调用依然还可能有堆积。

断路器机制:当Hystrix Command请求后端服务失败数量超过一定比例(默认50%), 断路器会切换到开路状态(Open). 这时所有请求会直接失败而不会发送到后端服务. 断路器保持在开路状态一段时间后(默认5秒), 自动切换到半开路状态(HALF-OPEN). 这时会判断下一次请求的返回情况, 如果请求成功, 断路器切回闭路状态(CLOSED), 否则重新切换到开路状态(OPEN). Hystrix的断路器就像我们家庭电路中的保险丝, 一旦后端服务不可用, 断路器会直接切断请求链, 避免发送大量无效请求影响系统吞吐量, 并且断路器有自我检测并恢复的能力.

断路器的原理很简单,如同电力过载保护器。它可以实现快速失败,如果它在一段时间内侦测到许多类似的错误,会强迫其以后的多个调用快速失败,不再访问远程服务器,从而防止应用程序不断地尝试执行可能会失败的操作,使得应用程序继续执行而不用等待修正错误,或者浪费CPU时间去等到长时间的超时产生。熔断器也可以使应用程序能够诊断错误是否已经修正,如果已经修正,应用程序会再次尝试调用操作。

熔断器模式就像是那些容易导致错误的操作的一种代理。这种代理能够记录最近调用发生错误的次数,然后决定使用允许操作继续,或者立即返回错误。 熔断器开关相互转换的逻辑如下图:

clipboard.png

  • Hystrix遇到服务错误时,会开启一个10s的窗口
  • 如果在该窗口内错误调用未达到阀值,那么程序继续
  • 如果达到阀值,那么断路器会跳闸
  • 跳闸的同时,会启动一个新的活动窗口5s
  • 在5s的窗口期间会尝试将一个请求发到对方服务
  • 如果失败,继续保持断路状态
  • 如果成功,重启10s的滑动窗口

@HystrixCommand配置详解

@HystrixCommand配置详解
@HystrixCommand(
    fallbackMethod = "buildFallbackLicenseList",
    threadPoolKey = "licenseByOrgThreadPool",
    threadPoolProperties = {
        @HystrixProperty(name = "coreSize", value="30"),
        @HystrixProperty(name = "maxQueueSize" value="10"),
    },
    commandPoolProperties = {
        @HystrixProperty(name="circuitBreaker.requestVolumeThreshold", value="10"),
        @HystrixProperty(name="circuitBreaker.errorThresholdPercentage", value="75"),
        @HystrixProperty(name="circuitBreaker.sleepWindowInMilliseconds", value="7000"),
        @HystrixProperty(name="metrics.rollingStats.timeInMilliseconds", value="15000"),
        @HystrixProperty(name="metrics.rollingStats.numBuckets", value="5")
    }
)
public String doSth(){....}

maximumSize

有了coresize当然有maximumsize了,一般coresize = maximumsize,只有当你设置allowMaximumSizeToDivergeFromCoreSize=true时才起作用

maxQueueSize

线程池的队列配置,如果线程超过线程池大小coresize,会进入该队列排队。默认是-1,就是SynchronousQueue,如果设置为正值,会使用LinkedBlockingQueue。该配置不可修改,如果修改,必须要重启应用才会生效。

queueSizeRejectionThreshold

队列的拒绝门槛。即使在队列中排队的线程未达到最大值,只要超过了这个阀值,请求线程都会被丢弃掉,所以maxQueueSize某种意义是没用的

keepAliveTimeMinutes

线程在队列中的存活事件,默认值是1(应该是1s),需要allowMaximumSizeToDivergeFromCoreSize=true

allowMaximumSizeToDivergeFromCoreSize

设置maximumSize和keepAliveTimeMinutes是否起作用,默认是false,就是不起作用

circuitBreaker.requestVolumeThreshold

表示在10s中必须发生的连续调用次数阀值。比如这个值是20,那么及时在10s的时间窗口中全部19个请求失败了,也不会触发熔断。

circuitBreaker.errorThresholdPercentage

错误阀值,超过这个阀值会触发熔断,所有的请求都会打到fallback上

circuitBreaker.sleepWindowInMilliseconds

发生熔断后,熔断器会睡眠多长时间后,才会再次尝试访问对方服务

metrics.rollingStats.timeInMilliseconds

窗口大小,默认10s

metrics.rollingStats.numBuckets

桶的个数,必须被timeInMilliseconds整除。比如numBuckets=2,那么 timeInMilliseconds/numBuckets = 5,就是在5秒内Hystrix展开监控

参考:https://segmentfault.com/a/1190000016024957

猜你喜欢

转载自blog.csdn.net/qq_23536449/article/details/91374689