一、什么是FeignFallbackFactory
Feign是一个基于HTTP客户端的轻量级服务调用框架,支持多种编码器/解码器,具有可插拔的注解支持,并提供了负载均衡、服务发现等功能,在微服务架构中被广泛使用。
FeignFallbackFactory是Feign的一种失败回退机制,当请求发生错误时,会转到fallbackFactory指定的类进行处理,避免了服务的雪崩效应。FeignFallbackFactory支持在不同的线程池中处理fallback逻辑,提高了可靠性和稳定性。
二、FeignFallbackFactory的使用方法
1. 首先,在pom.xml文件中添加Feign依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2. 创建一个Feign接口,并在接口方法上加上@FeignClient注解,指定调用的服务名称和fallbackFactory类:
@FeignClient(name = "service-name", fallbackFactory = MyFallbackFactory.class)
public interface MyFeignClient {
@GetMapping("/api/{id}")
String getInfo(@PathVariable("id") Long id);
}
3. 创建fallbackFactory类,并实现FallbackFactory接口,重写create方法来返回fallback实例。在fallback实例中,可以定义具体的处理逻辑:
public class MyFallbackFactory implements FallbackFactory
{
@Override
public MyFeignClient create(Throwable cause) {
return new MyFeignClient() {
@Override
public String getInfo(Long id) {
// 处理fallback逻辑
return "fallback info";
}
};
}
}
三、FeignFallbackFactory的高级用法
1. 设置fallbackFactory的全局默认值
在Feign的配置文件中,可以设置fallbackFactory的默认值,这样所有的Feign客户端都会使用同一个fallbackFactory类:
feign:
hystrix:
enabled: true
client:
default:
fallbackFactory: com.example.MyFallbackFactory
2. 设置不同线程池的fallbackFactory
在@FeignClient注解中,除了可以设置fallbackFactory外,还可以设置一个threadPool属性,用于指定fallback逻辑所在的线程池。如果有多个线程池,可以为不同的线程池设置不同的fallbackFactory:
@FeignClient(name = "service-name", fallbackFactory = MyFallbackFactory1.class, threadPool = "fallbackThreadPool1")
public interface MyFeignClient1 {
@GetMapping("/api/{id}")
String getInfo(@PathVariable("id") Long id);
}
@FeignClient(name = "service-name", fallbackFactory = MyFallbackFactory2.class, threadPool = "fallbackThreadPool2")
public interface MyFeignClient2 {
@GetMapping("/api/{id}")
String getInfo(@PathVariable("id") Long id);
}
3. 实现FallbackFactory接口的泛型
如果Feign接口的返回值是一个泛型类型,fallbackFactory需要实现泛型参数:
public class MyFallbackFactory implements FallbackFactory<MyFeignClient<T>> {
@Override
public MyFeignClient<T> create(Throwable cause) {
return new MyFeignClient<T>() {
@Override
public T getInfo(Long id) {
// 处理fallback逻辑
return null;
}
};
}
}
public interface MyFeignClient<T> {
@GetMapping("/api/{id}")
T getInfo(@PathVariable("id") Long id);
}
四、FeignFallbackFactory的优点
1. 保证了服务的可靠性和稳定性,避免了服务的雪崩效应;
2. 支持多个fallbackFactory类,可以实现不同的处理逻辑;
3. 支持在不同的线程池中处理fallback逻辑,提高了可靠性和稳定性。