先写两者却别:
一、 fallback(降级处理类) 不推荐:不能捕获异常打印堆栈信息,不利于问题排查。
- fallback是在Feign客户端接口上通过@FeignClient注解的fallback属性指定的一个类。
- 这个类通常实现了远程服务接口,它的方法是对远程服务调用失败或异常情况的降级处理逻辑。
- 当远程服务调用失败或抛出异常时,Feign会使用fallback中对应的方法来执行降级逻辑。
- fallback适用于对所有远程服务接口通用的降级逻辑,适用范围相对较广。
二、fallbackFactory(降级处理工厂类) 推荐:可以捕获异常信息并返回默认降级结果。可以打印堆栈信息。
- fallbackFactory是在Feign客户端接口上通过@FeignClient注解的fallbackFactory属性指定的一个类,它实现了FallbackFactory接口。
- FallbackFactory接口有一个方法create,该方法返回一个实现了远程服务接口的降级处理类。
- 当远程服务调用失败或抛出异常时,Feign会使用fallbackFactory中的create方法来创建降级处理类的实例,并执行降级逻辑。
- fallbackFactory可以根据需要为不同的远程服务接口提供不同的降级处理逻辑,更加灵活。
原本在FeignClient回调中直接配置为接口降级实现类
@FeignClient(name = "crm", contextId = "", fallback = CrmServiceImpl.class)
public interface CrmService {
/**
* 查询客户信息
*
* @param ids ids
* @return entity
*/
@PostMapping("/crmCustomer/querySimpleEntity")
public Result<List<SimpleCrmEntity>> queryCustomerInfo(@RequestBody Collection ids);
}
@Component
@Slf4j
public class CrmServiceImpl implements CrmService {
@Override
public Result<List<SimpleCrmEntity>> queryCustomerInfo(Collection ids) {
return Result.ok(new ArrayList<>());
}
}
以上写法,当被调用接口正常返回数据,但调用方接收回传的数据时如果报错,无法监控到报错日志,就无法分析报错原因(实际是因为实体类日期类型未做格式处理导致抛出异常),后查询相关文章后发现改为降级工厂可监控日志。
新建降级工厂类
@Slf4j
@Component
public class CrmServiceFallbackFactory implements FallbackFactory<CrmService> {
@Override
public CrmService create(Throwable throwable) {
CrmServiceImpl crmServiceFallback = new CrmServiceImpl();
crmServiceFallback.setCause(throwable);
return crmServiceFallback;
}
}
feign客户端改为调用降级工厂类
//@FeignClient(name = "crm", contextId = "", fallback = CrmServiceImpl.class)
@FeignClient(value = "crm", fallbackFactory = CrmServiceFallbackFactory.class)
public interface CrmService {
/**
* 查询客户信息
*
* @param ids ids
* @return entity
*/
@PostMapping("/crmCustomer/querySimpleEntity")
public Result<List<SimpleCrmEntity>> queryCustomerInfo(@RequestBody Collection ids);
}
改完后即可监控到接口回传时的报错日志,分析日志再修改bug即可。
两者对比
特性 | fallback | fallbackFactory |
适用场景 | 通用的降级逻辑,所有方法共享相同的降级处理 | 针对不同方法需要不同降级逻辑的情况 |
声明方式 | 通过@FeignClient的fallback属性指定 | 通过@FeignClient的fallbackFactory属性指定 |
类型 | 一个降级处理类,实现远程服务接口 | 一个降级处理工厂类,实现FallbackFactory接口 |
方法创建时机 | 初始化时创建 | 每次远程服务调用失败时动态创建 |
异常信息捕获 | 不可以捕获到熔断的异常信息 | 可以捕获到熔断的异常信息 |
灵活性 | 较低,所有方法共享相同的降级逻辑 | 较高,不同方法可以有不同的降级逻辑 |
参数传递 | 不能传递Throwable对象 | 可以传递Throwable对象 |