熔断
熔断是一种保护机制,用于在系统出现故障时停止向该服务发送请求,避免请求导致故障扩散或者系统崩溃。在Hystrix中,熔断机制是通过跟踪服务调用的成功率和失败率来实现的。当失败率达到一定的阈值时,熔断器将会打开,停止向该服务发送请求一段时间,防止请求继续失败导致系统崩溃。在打开状态下,一部分请求会被拒绝并直接返回,而另一部分请求则会被转发到fallback方法中执行。
以下是一些常用的熔断参数:
circuitBreaker.enabled
:是否启用熔断器,默认值为true。circuitBreaker.requestVolumeThreshold
:在一个统计窗口期内,最小的请求数量。如果这个值没有被满足,熔断器将不会打开。circuitBreaker.sleepWindowInMilliseconds
:当熔断器被打开后,它会进入一个休眠状态,这个属性定义了休眠的时间。在休眠期间,不会向服务发送请求。circuitBreaker.errorThresholdPercentage
:错误比率阈值。当在一个统计窗口期内错误比率超过这个阈值时,熔断器将会打开。
以下是一个使用Hystrix熔断的示例代码:
代码语言:javascript复制public class MyHystrixCommand extends HystrixCommand<String> {
private final Logger logger = LoggerFactory.getLogger(MyHystrixCommand.class);
protected MyHystrixCommand() {
super(HystrixCommandGroupKey.Factory.asKey("MyHystrixCommandGroup"));
}
@Override
protected String run() throws Exception {
// 执行命令逻辑
return "success";
}
@Override
protected String getFallback() {
// 执行fallback逻辑
return "fallback";
}
public static void main(String[] args) {
HystrixCommand.Setter setter = HystrixCommand.Setter
.withGroupKey(HystrixCommandGroupKey.Factory.asKey("MyHystrixCommandGroup"))
.andCommandPropertiesDefaults(HystrixCommandProperties.Setter()
.withCircuitBreakerEnabled(true)
.withCircuitBreakerRequestVolumeThreshold(10)
.withCircuitBreakerSleepWindowInMilliseconds(5000)
.withCircuitBreakerErrorThresholdPercentage(50)
);
String result = new MyHystrixCommand().execute();
System.out.println(result);
}
}
在这个示例中,我们使用HystrixCommand.Setter
来配置命令和熔断属性。我们将熔断器启用,请求阈值设为10,休眠时间设为5000毫秒,错误比率阈值设为50%。这样,在一个统计窗口期内,如果错误比率超过50%并且请求数量达到10个时,熔断器将会打开,停止向该服务发送请求。打开状态持续5秒钟,5秒钟后熔断器将会关闭并重新进入半开状态,允许一部分请求通过执行run方法,测试服务是否恢复正常。
下面我们来测试一下这个示例代码。我们首先运行服务并向它发送10次请求,让它失败的次数超过50%:
代码语言:javascript复制public class TestHystrix {
public static void main(String[] args) {
for (int i = 0; i < 10; i ) {
String result = new MyHystrixCommand().execute();
System.out.println(result);
}
}
}
这时候我们可以看到输出的结果是fallback。这是因为在10次请求中,有超过50%的请求失败,熔断器被打开,请求被转发到fallback方法中执行。
接下来我们等待5秒钟,等熔断器进入半开状态,再次发送10次请求:
代码语言:javascript复制public class TestHystrix {
public static void main(String[] args) throws InterruptedException {
for (int i = 0; i < 10; i ) {
String result = new MyHystrixCommand().execute();
System.out.println(result);
Thread.sleep(1000);
}
}
}
这时候我们可以看到输出的结果是success。这是因为在半开状态下,部分请求被允许通过执行run方法,测试服务是否恢复正常。如果请求成功,熔断器将会关闭,否则将会继续保持打开状态。