首先引入依赖
<dependency>
<groupId>com.netflix.hystrix</groupId>
<artifactId>hystrix-javanica</artifactId>
<version>1.5.18</version>
</dependency>
在启动类中加入对hystrix的支持
@EnableHystrix
然后就是在需要开启断路保护的方法上加入注解
@HystrixCommand(fallbackMethod = “indexError”)
其中fallbackMethod是在调用失败时的回调方法。
示例代码如下:
package com.dalaoyang;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.ribbon.proxy.annotation.Hystrix;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.hystrix.EnableHystrix;
import org.springframework.context.annotation.Bean;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@SpringBootApplication
@EnableEurekaClient
@RestController
@EnableHystrix
public class TestController{
@HystrixCommand(fallbackMethod = "indexError")
@GetMapping("/")
public String index(){
int i = 0/1;
return null;
}
public String indexError(){
return "调用服务失败!";
}
}
启动服务,访问http://localhost:8764/,可以看到响应如下:
Hystrix配置参数讲解:
// 熔断器在整个统计时间内是否开启的阀值
@HystrixProperty(name = "circuitBreaker.enabled", value = "true"),
// 至少有3个请求才进行熔断错误比率计算
/**
* 设置在一个滚动窗口中,打开断路器的最少请求数。
比如:如果值是20,在一个窗口内(比如10秒),收到19个请求,即使这19个请求都失败了,断路器也不会打开。
*/
@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "3"),
//当出错率超过50%后熔断器启动
@HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "50"),
// 熔断器工作时间,超过这个时间,先放一个请求进去,成功的话就关闭熔断,失败就再等一段时间
@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "5000")
@HystrixProperty(name = "coreSize", value = "30"),
/**
* BlockingQueue的最大队列数,当设为-1,会使用SynchronousQueue,值为正时使用LinkedBlcokingQueue。
*/
@HystrixProperty(name = "maxQueueSize", value = "101"),
/**
* 设置存活时间,单位分钟。如果coreSize小于maximumSize,那么该属性控制一个线程从实用完成到被释放的时间.
*/
/**
我们知道,线程池内核心线程数目都在忙碌,再有新的请求到达时,线程池容量可以被扩充为到最大数量。
等到线程池空闲后,多于核心数量的线程还会被回收,此值指定了线程被回收前的存活时间,默认为 2,即两分钟。
*/
@HystrixProperty(name = "keepAliveTimeMinutes", value = "2"),
/**
* 设置队列拒绝的阈值,即使maxQueueSize还没有达到
*/
@HystrixProperty(name = "queueSizeRejectionThreshold", value = "15"),
// 滑动统计的桶数量
/**
* 设置一个rolling window被划分的数量,若numBuckets=10,rolling window=10000,
*那么一个bucket的时间即1秒。必须符合rolling window % numberBuckets == 0。默认1
*/
@HystrixProperty(name = "metrics.rollingStats.numBuckets", value = "10"),
// 设置滑动窗口的统计时间。熔断器使用这个时间
/** 设置统计的时间窗口值的,毫秒值。
circuit break 的打开会根据1个rolling window的统计来计算。
若rolling window被设为10000毫秒,则rolling window会被分成n个buckets,
每个bucket包含success,failure,timeout,rejection的次数的统计信息。默认10000
**/
@HystrixProperty(name = "metrics.rollingStats.timeInMilliseconds", value = "10000")
fallbackMethod:方法执行时熔断、错误、超时时会执行的回退方法,需要保持此方法与 Hystrix 方法的签名和返回值一致。
defaultFallback:默认回退方法,当配置 fallbackMethod 项时此项没有意义,另外,默认回退方法不能有参数,返回值要与 Hystrix方法的返回值相同。
在hystrix中还可以设置超时熔断
由于客户端请求服务端方法时,服务端方法响应超过1秒将会触发降级,所以我们可以配置Hystrix默认的超时配置
如果我们没有配置默认的超时时间,Hystrix将取default_executionTimeoutInMilliseconds作为默认超时时间
代码中修改默认超时配置(改为3秒):
@HystrixCommand(commandProperties = {
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "3000")
})
除此以外还可以在application.properties中设置默认超时时间:
#1.修改默认超时时间:
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=3000
#2.配置具体方法的超时时间
hystrix.command.test.execution.isolation.thread.timeoutInMilliseconds=3000
方法2可以为@HystrixCommand注解中的commandKey 属性的值为test的方法设置超时时间为3000毫秒