关于动态创建Feign Client的问题

Hi ~ 小老弟开始转公众号啦,欢迎大家来指点迷津呀

 

太久没写了,今天更一下 [手动滑稽]


好的正题:如何动态创建Feign Client~

众所周知,spring cloud.......懒得写了,直接堆代码吧

项目所用的feign是openfeign

<dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

一般来说,我们是直接定义一个interface,然后在上面 @FeignClient(value="xxx")

@FeignClient(value = "xxx")
public interface ITestFeign {

}

毕竟springcloud,如果是同一个接口,分散到n个服务当中,并且只有一个入口的时候,那么问题就来了:我是写对应的n个FeignClient还是写个模板动态构建FeignClient呢?

1. 常规办法:写对应的n个FeignClient。

2. 一个模板 + 动态构建!


首先,我们ctrl + 左键 点 @FeignClient 的时候可以直接进入FeignClient 这个注解里面,然后继续 ctrl + 左键 点 FeignClient 可以找到使用它的代码

让我们来聚焦

### 实现 OpenFeign 动态创建 Client 为了实现在运行时动态创建 Feign 客户端,通常的做法是利用 `Target` 接口以及 `Feign.Builder` 来构建新的实例。这种方式允许应用程序根据不同的条件来决定要调用的服务地址或其他配置属性。 #### 使用 Target 和 Builder 创建动态客户端 下面是一个简单的例子展示如何基于给定的目标 URL 构建一个新的 Feign 客户端: ```java import feign.Feign; import feign.Target; public class DynamicFeignClient { public static <T> T create(Class<T> type, String url) { return Feign.builder() .target(new HardCodedTarget<>(type, url)); } private static final class HardCodedTarget<T> implements Target<T> { private final Class<T> type; private final String url; public HardCodedTarget(Class<T> type, String url) { this.type = type; this.url = url; } @Override public Class<T> type() { return type; } @Override public String name() { return "dynamic-client"; } @Override public String url() { return url; } } } ``` 这段代码定义了一个通用的方法用于创建任意类型的 Feign 客户端,并接受目标服务的基础URL作为参数[^1]。 当需要为特定 API 调用创建一个临时性的 Feign 客户端时,只需提供相应的接口类型和远程服务器的地址即可完成初始化工作。这种方法非常适合那些希望保持灵活性的应用场景,在这些情况下可能直到最后一刻才知道确切的目的地或API细节[^4]。 此外,如果想要更深入理解此类操作背后的机制,则可以通过研究 Spring 提供的相关扩展类如 `ImportBeanDefinitionRegistrar` 来学习 Bean 注入到 IoC 容器中的过程,这对掌握 OpenFeign 的内部运作也有很大帮助[^3]。
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值