FeignClient的fallbackFactory使用,以及如何实现OpenFeign统一降级

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
2
3
4
5
6
7
FeignClientsRegistrar.registerFeignClient --> 扫描并注册
FeignClientFactoryBean.getObject -->
FeignClientFactoryBean.getTarget --> 返回代理类
FeignClientFactoryBean.loadBalance --> 步骤2.1 此处还会设置feign 的负载均衡器


A 服务 调用->B.test()-> Feign 代理

fallbackFactory每一个接口都要手写一遍降级配置,可不可以提供一个思路,统一设置的fallbackFactory?

这个是可以的 ! 只需要变动 Feign.Builder中设置fallbackFactory 即可, 用我们自定义的代理类 代理 fallbackFactory的创建

具体思路可以参考: https://blog.csdn.net/tianmuyuren/article/details/127755216

@FeignClien

1
2
3
4
5
6
7
8
9
10
11
name:(必需)指定远程服务的名称,通常是服务的注册名称(在服务注册中心中注册的名称)。
url:(可选)指定远程服务的基础 URL。如果您不使用服务注册中心,而是直接使用远程服务的 URL,则可以使用此参数指定远程服务的地址。当 url 和 value 参数都未指定时,Feign 将会从服务注册中心中查找服务。
value:(可选)与 name 参数功能相同,用于指定远程服务的名称。
contextId:(可选)Feign 上下文的唯一标识符,默认为 name。
configuration:(可选)用于指定 Feign 客户端的配置类。可以通过该配置类自定义 Feign 客户端的行为,比如设置连接超时、读取超时等。
fallback:(可选)指定当远程服务调用失败时的回退逻辑所在的类。当远程服务不可用时,Feign 将会调用指定类中的对应方法进行回退处理。
fallbackFactory:(可选)指定一个实现了 FallbackFactory 接口的工厂类,用于创建回退逻辑的实例。与 fallback 参数类似,但可以更加灵活地定制回退逻辑。
path:(可选)用于指定远程服务的基础路径。可以在该路径下定义相对于 url 或服务注册中心查找的完整路径。
decode404:(可选)用于指定是否将 404 响应解码为 null 值。默认为 false,即不解码为 null。
primary:(可选)用于指定是否将该 Feign 客户端作为默认的 Feign 客户端。当存在多个 Feign 客户端时,可以通过设置 primary=true 来指定默认的 Feign 客户端。
以上是 @FeignClient 注解的常用参数及其详解。您可以根据实际需求选择合适