动态参数化的 Feign 客户端
dynamicaly parameterized FeignClients
我需要访问共享同一 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 目标。
Client clientA = Feign.builder()
.target(Client.class, "https://url.a");
Client clientB = Feign.builder()
.target(Client.class, "https://url.b");
这将为每个目标创建一个新客户端 url,但是,通过确保 Encoder
、Decoder
、Client
和ErrorDecoder
是单例实例和线程安全的,客户端的成本将是最小的。
如果您不想创建多个客户端,替代方法是包含一个 URI
作为方法参数。
@RequestLine("POST /repos/{owner}/{repo}/issues")
void createIssue(URI host, Issue issue, @Param("owner") String owner, @Param("repo") String repo);
上例中的值 host
将替换构建器中提供的基本 uri。这种方法的缺点是您需要修改接口以将此 URI
添加到适当的方法并调整调用者以提供目标。
我需要访问共享同一 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 目标。
Client clientA = Feign.builder()
.target(Client.class, "https://url.a");
Client clientB = Feign.builder()
.target(Client.class, "https://url.b");
这将为每个目标创建一个新客户端 url,但是,通过确保 Encoder
、Decoder
、Client
和ErrorDecoder
是单例实例和线程安全的,客户端的成本将是最小的。
如果您不想创建多个客户端,替代方法是包含一个 URI
作为方法参数。
@RequestLine("POST /repos/{owner}/{repo}/issues")
void createIssue(URI host, Issue issue, @Param("owner") String owner, @Param("repo") String repo);
上例中的值 host
将替换构建器中提供的基本 uri。这种方法的缺点是您需要修改接口以将此 URI
添加到适当的方法并调整调用者以提供目标。