<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
<!-- hystrix-javanica 在starter-hystrix中默认会包含一个,可以不引入 -->
<dependency>
<groupId>com.netflix.hystrix</groupId>
<artifactId>hystrix-javanica</artifactId>
<version>1.5.9</version>
</dependency>
在服务的启动类中添加注解
@SpringBootApplication
@EnableCircuitBreaker
public class Application
{
......
}
如果不使用注解@EnableCircuitBreaker,断路器不会启用.
在需要调用服务的地方添加注解
@HystrixCommand
public List<Object> getSomeInfo(String infoId)
{
.......
}
只要添加了注解@HystrixCommand,在调用方法的时候,如果调用超时,断路器将会中断对此方法的调用.
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface HystrixCommand {
String groupKey() default "";
String commandKey() default "";
String threadPoolKey() default "";
String fallbackMethod() default "";
HystrixProperty[] commandProperties() default {};
HystrixProperty[] threadPoolProperties() default {};
Class<? extends Throwable>[] ignoreExceptions() default {};
ObservableExecutionMode observableExecutionMode() default ObservableExecutionMode.EAGER;
HystrixException[] raiseHystrixExceptions() default {};
}
groupKey
一组 Hystrix 命令的集合, 用来统计、报告,默认取类名.
commandKey
HystrixCommand 命令的key值,默认值为注解方法的名称*
fallbackMethod
如果远程调用失败,会调用此方法.
回调方法必须和@HystrixCommand在同一个类中,并且此属性值与调用类有相同的方法签名.
如果值不存在,会抛出异常.
threadPoolKey
让@HystrixCommand拥有一个唯一的名称,并且创建一个独立于默认线程池的线程池.
如果没有定义任何值,则使用默认线程.
threadPoolProperties
用于配置线程池的行为
coreSize
设置线程池的大小.
默认10.
maxQueueSize
设置线程池最大队列大小.
如果值为-1,不适用队列.Hystrix会阻塞请求,直到有一个线程可用来处理.
默认-1.
circuitBreaker.requestVolumeThreshold
设置Hystrix开始检查断路器是否跳闸前,必须处理的最小请求数.
只能够在commandPoolProperties属性中设置.
默认20.
circuitBreaker.errorThresholdPercentage
断路器跳闸前,必须达到的故障率百分比.
只能够在commandPoolProperties中设置.
默认50.
circuitBreaker.sleepWindowInMilliseconds
断路器跳闸后,Hystrix尝试进行服务调用之前需要等待的时间.时间单位:毫秒.
只能够在commandPoolProperties中设置.
默认5000.
metricsRollingStats.timeInMilliseconds
Hystrix收集和监控服务调用的统计信息滚动窗口.时间单位:毫秒.
默认值1000.
metricsRollingStats.numBuckets
Hystrix在监控窗口中维护的度量桶的数量.
监视窗口内桶数量越多,Hystrix在窗口内监控故障的时间越低.
”metrics.rollingStats.timeInMilliseconds % metrics.rollingStats.numBuckets == 0"必须为true,否则会抛出异常。
默认10.
execution.isolation.thread.timeoutInMilliseconds
指定Hystrix在超时调用之前等待的时间.
关于所有的HystrixProperty,可以在相关jar包的以下路径中查看:
hystrix-javanica-1.5.9.jar!\com\netflix\hystrix\contrib\javanica\conf\HystrixPropertiesManager.class
根据上面的注解,后备模式只需要在注解中声明后备方法,并且在当前类中定义好后备方法即可.
如果在使用多个微服务协同完成多个任务,这些服务调用都使用同一批线程.
但是这个线程时为了处理整个Java容器而预留的.
所以如果存在大量请求的情况下,如果某些服务器出现了问题,会导致线程池满并且其它请求会等待处理,阻塞新请求.
使用舱壁模式能够让远程资源调用被隔离到一个新的线程池中.如果一个服务.调用出现了鼓掌,也不会影响其它的服务调用.
举例:
@HystrixCommand(
fallbackMethod = "fallbackMethod"
threadPoolKey = "newThreadPool"
threadPollProperties = {
@HystrixProperty(name = "coreSize", value = "15")
@HystrixProperty(name = "maxQueueSize", value = "12")
}
)
public Object getValue()
{
......
}
对于线程池大小的设置,Netflix给出公式:
(requests per second at peak when the service is healthy * 99th percentile latency in
seconds) + small amount of extra threads for overhead
每秒最大支撑的请求数 × 99%的请求的平均响应时间 + 缓存值
maxQueueSize只能够在线程池首次初始化时设置.
但是也可以使用queueSizeRejectionThreshold属性动态调整队列大小.
不过只有首次初始化的 maxQueueSize >0 的时候有效.
原文:https://www.cnblogs.com/reclusiveone/p/14882930.html