目录
1 概述
微服务架构的系统中通常会包含很多个服务,服务间采用HTTP通信,当某个微服务不可用时,很容易导致级联故障,即雪崩效应,因此在服务间进行调用时,需要一定的容错机制,Hystrix就是一个实现了调用超时和断路器的容错组件。
Feign中已经集成了Hystrix,本篇以user-ms为例,添加对role-ms调用的熔断处理。
2 Hystrix配置
修改user-ms配置文件,添加如下配置,启用feign下的hystrix:
feign:
hystrix:
enabled: true
2.1 添加回退处理
创建一个熔断后退处理类,其需要实现feign接口,如下所示:
@Component
public class RoleFeignClientFallback implements RoleFeignClient {
@Override
public Object list() {
return "list:Service Unavailable";
}
@Override
public String insert(Role role) {
return "insert:Service Unavailable";
}
}
修改FeignClient接口,添加fallback配置,如下所示:
@FeignClient(name = "role-ms", fallback = RoleFeignClientFallback.class)
public interface RoleFeignClient {
@RequestMapping(value = {"/role/list"}, method = RequestMethod.GET)
Object list();
@RequestMapping(value = "/role/insert", method = RequestMethod.POST)
String insert(@RequestBody Role role);
}
至此,熔断回退处理就添加完成了,在不启动role-ms(role-ms崩溃)的情况下,user-ms调用role-ms服务,则会返回Fallback类中的数据。
2.2 检查回退原因
创建一个熔断后退处理工厂类,其需要实现FallbackFactory接口,如下所示:
@Component
public class RoleFeignClientFallbackFactory implements FallbackFactory<RoleFeignClient> {
@Override
public RoleFeignClient create(Throwable throwable) {
RoleFeignClient roleFeignClient = new RoleFeignClient() {
@Override
public Object list() {
return throwable.getMessage();
}
@Override
public String insert(Role role) {
return throwable.getMessage();
}
};
return roleFeignClient;
}
}
修改FeignClient接口,添加fallbackFactory配置,如下所示:
@FeignClient(name = "role-ms", fallbackFactory = RoleFeignClientFallbackFactory.class)
public interface RoleFeignClient {
@RequestMapping(value = {"/role/list"}, method = RequestMethod.GET)
Object list();
@RequestMapping(value = "/role/insert", method = RequestMethod.POST)
String insert(@RequestBody Role role);
}
在不启动role-ms(role-ms崩溃)的情况下,user-ms调用role-ms服务,则会返回 com.netflix.client.ClientException: Load balancer does not have available server for client: role-ms,这样使用FallbackFactory可以更灵活的控制返回数据。
注意:当fallback和fallbackFactory同时配置时,会优先使用fallback。
本篇的配置和测试都比较简单,这里就不贴测试结果了。