动态参数化的FeignClients

时间:2019-09-12 17:17:26

标签: feign openfeign

我需要访问共享同一REST接口的服务器的不同实例。

对于一台服务器或同一台服务器的不同实例,我将使用Ribbon和feignClient,但是服务器不可互换。

我的application.yml文件中也有一个服务器地址列表,同样:

servers:
  - id: A
    url: http://url.a
  - id: B
    url: http://url.b

我希望能够请求有关输入参数的服务器,例如:

ClientA -> /rest/api/request/A/get -> http://url.a/get
ClientB -> /rest/api/request/B/get -> http://url.b/get

中间件与客户端无关,但是后端服务器已绑定到客户端。

many clients -> one middleware -> some clients

使用Feign,您将实现谁?甚至有可能吗?

1 个答案:

答案 0 :(得分:1)

最简单的方法是通过重用接口和构建器来创建两个Feign目标。

Client clientA = Feign.builder()
                      .target(Client.class, "https://url.a");
Client clientB = Feign.builder()
                      .target(Client.class, "https://url.b");

这将通过确保诸如EncoderDecoderClientErrorDecoder之类的支持组件为每个目标URL创建一个新的客户端。单例实例和线程安全实例,客户端的成本将降至最低。

如果您不想创建多个客户端,则可以选择将URI作为方法参数。

@RequestLine("POST /repos/{owner}/{repo}/issues")
void createIssue(URI host, Issue issue, @Param("owner") String owner, @Param("repo") String repo);

以上示例中的值host将替换构建器中提供的基本uri。这种方法的缺点是,您需要修改界面以将此URI添加到适当的方法中,并调整调用方以提供目标。