在微服务架构中存在多个可直接调用的服务,这些服务若在调用时出现故障会导致连锁效应,也就是可能会让整个系统得不可用,这种情况我们称之为服务雪崩效应。
如何避免服务雪崩效应?通过Hystrix就能够解决,下 面我们一起来学习如何用Hystrix实现服务容错处理。
Hystrix是Netflix针对微服务分布式系统采用的熔断保护中间件,相当于电路中的保险丝。 在微服务架构下,很多服务都相互依赖,如果不能对依赖的服务进行隔离,那么服务本身也有可能发生故障,Hystrix 通过HystrixCommand
对调用进行隔离,这样可以阻止故障的连锁反应,能够让接口调用快速失败并迅速恢复正常,或者回退并优雅降级。
一、 Hystrix 的简单使用
创建一个空的 Maven 项目,在项目中增加 Hystrix 的依赖,如以下代码所示:
<dependency>
<groupId>com.netflix.hystrix</groupId>
<artifactId>hystrix-core</artifactId>
<version>1.5.13</version>
</dependency>
编写第一个HystrixCommand
,如以下代码所示:
public class MyHystrixCommand extends HystrixCommand<String> {
private final String name;
public MyHystrixCommand(String name) {
super (Hystr ixCommandGroupKey .Factory .asKey( "MyGroup"));
this.name = name;
}
@Override
protected String run() {
return this.name + ":" + Thread. currentThread() .getName();
}
}
首先需要继承HystrixCommand
,通过构造函数设置一个Groupkey
。具体的逻辑在run方法
中,我们返回了一个当前线程名称的值。写一个main方法
来调用上面编写的MyHystrixCommand
程序,如以下代码所示:
public static void main(String[] args)throws InterruptedException, ExecutionException {
String result = new MyHystrixCommand("yinjihuan").execute();
System.out.println(result);
}
输出结果是: yinjihuan:hystrix-MyGroup。由此可以看出,构造函数中设置的组名变成了线程的名字。
上面是同步调用,如果需要异步调用可以使用一下代码所示方法:
public static void main(String[] args)throws InterruptedException