【问题标题】:dynamicaly parameterized FeignClients动态参数化的 Feign 客户端
【发布时间】:2020-01-14 14:58:40
【问题描述】:

我需要访问共享相同 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 实现谁?有可能吗?

【问题讨论】:

    标签: feign openfeign


    【解决方案1】:

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

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

    这将为每个目标 url 创建一个新的客户端,但是,通过确保支持组件(例如 EncoderDecoderClientErrorDecoder)是单例实例和线程安全的,客户的成本将是最低的。

    如果您不想创建多个客户端,另一种方法是包含一个URI 作为方法参数。

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

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

    【讨论】:

    • 感谢您的宝贵时间,我最终完成了第一个解决方案并将客户端映射到配置类中
    猜你喜欢
    • 2018-10-14
    • 2018-01-05
    • 2018-07-22
    • 1970-01-01
    • 2020-01-27
    • 2020-04-12
    • 2019-11-04
    • 1970-01-01
    • 2016-03-09
    相关资源
    最近更新 更多