Skip to content

Instantly share code, notes, and snippets.

@wutingjia
Last active April 2, 2019 11:29
Show Gist options
  • Save wutingjia/ec50a411d5125abef6395a02977aef13 to your computer and use it in GitHub Desktop.
Save wutingjia/ec50a411d5125abef6395a02977aef13 to your computer and use it in GitHub Desktop.
Spring-Cloud-Netflix-Hystrix

需要导入的依赖

org.springframework.cloud spring-cloud-starter-hystrix

在引导类添加注解 @EnableCircuitBreaker 如果不添加,不会收到警告和错误信息,但是断路器不起作用。

断路器模式

@HystrixCommand 方法级注解。 Spring框架会将 该注解 标记的方法进行包装为命令。将使用新的线程池对其进行调用。往往是对远程调用或者数据库操作的方法进行注解。

断路器超时时间:commandProperties={@HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value="1200")}

后备模式

fallbackMethod="xxxxxx"
降级服务的方法签名需要与原服务完全一致,在原服务失败的情况下会使用降级服务,降级服务可以级联。如果单纯只是希望trycatch则不应该使用这个策略。
执行了降级服务,并不代表断路器已经打开,请求失败、超时、被拒绝以及断路器打开时都会执行降级服务

舱壁模式

threadPoolKey="xxxxxx" 定义该命令的调用所在线程池的名称。
threadPoolProperties={@HystrixProperty(name="coreSize",value="30"),@HystrixProperty(name="maxQueueSize",value="10")}
coreSize:线程池大小 maxQueueSize:控制在线程池中线程繁忙时允许堵塞的请求时,一旦超过,所有请求都失败,直到有空闲。-1为保存所有

每当Hystrix命令遇到服务错误,他将开始一个默认为10s的窗口计时器,用于检查服务调用失败频率。
metrics.rollingStats.timeInMilliseconds (default: 10 seconds) 窗口期的时间

然后查看10s内发生的调用次数,如果调用次数少于在这个窗口时间内设置的最小调用次数(默认20),则即使全部失败,断路器也不会打开
circuitBreaker.requestVolumeThreshold (default: 20 requests) 窗口期调用数量

如果在窗口期中的调用数量达到了要求,则开始检查调用失败的百分比,如果超过百分比(默认50%),则会触发断路器,使将来的调用失败
circuitBreaker.errorThresholdPercentage (default: >50%) 在一个窗口期内的失败率

如果失败的百分比未到阈值,并且窗口期时间已过,重置断路器的统计信息

如果触发了断路器,hystrix将会尝试启动一个新的活动窗口,每隔(默认5S)尝试允许让一个调用到达这个服务,如果成功则闭合断路器,开始让服务正常运作
circuitBreaker.sleepWindowInMilliseconds(default: 5s)

https://github.com/Netflix/Hystrix/wiki/Configuration#execution.isolation.strategy properties更多详细设置
https://github.com/Netflix/Hystrix/wiki/Configuration
如果想要将本地线程上下文传递进@HystrixCommand 需要额外的设置否则会无法工作。因为它会重启一个线程进行工作这会导致参数的丢失(超时错误)
@HystrixProperty(name="execution.isolation.strategy", value="SEMAPHORE")
被@SessionScope或@RequestScope 注解的方法 如果需要使用断路器 可能也会抛出错误,需要如上的配置。
也可以将hystrix.shareSecurityContext的属性设置为true.这会将SecurityContext从主线程传入一个@HystrixCommand包装的新线程调用中。
但是Hystrix的同步策略只能有一个,可以自己定制属于自己的同步策略类。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment