fallback 和 fallbackFactory 都是用于在 Feign 客户端调用远程服务失败时提供回退逻辑的机制
FeignClient的 fallbackFactory
我们今天就来研究一下FeignClient的具体机制原理
FeignClientsRegistrar 扫描注册包含 @FeignClient 注解的类 ,然后调用FeignClientFactoryBean.getObject 创建 FeignClient(代理类)
通过获取Feign.Builder 的bean,构造Feign实例或者叫代理类(HardCodedTarget),这里会根据@FeignClient的不同进行不同的构造
通过FeignClientFactoryBean.loadBalance设置feign 的负载均衡器
通过 InvocationHandlerFactory 设置 FeignClient 的代理类,其中会设置fallbackFactory和 fallback
设置 fallback=T.class 其实相当于 设置了fallbackFactory= FallbackFactory.Default<T.class>,两个在后续的处理逻辑一致
实际上 一个Feign接口的调用其是调用的就是代理类,通过代理类发送http请求与处理数据
当发生异常的时候就调用@FeignClient设置的降级处理类
若 fallbackFactory != null 就调用 FallbackFactory.create 创建降级类
1 | FeignClientsRegistrar.registerFeignClient --> 扫描并注册 |
fallbackFactory每一个接口都要手写一遍降级配置,可不可以提供一个思路,统一设置的fallbackFactory?
这个是可以的 ! 只需要变动 Feign.Builder中设置fallbackFactory 即可, 用我们自定义的代理类 代理 fallbackFactory的创建
具体思路可以参考: https://blog.csdn.net/tianmuyuren/article/details/127755216
@FeignClien
1 | name:(必需)指定远程服务的名称,通常是服务的注册名称(在服务注册中心中注册的名称)。 |