在 Spring Boot 中使用 FeignClient 进行同步 Rest API 调用

Posted

技术标签:

【中文标题】在 Spring Boot 中使用 FeignClient 进行同步 Rest API 调用【英文标题】:Make Simultaneous Rest API calls using FeignClient in Spring Boot 【发布时间】:2021-11-13 15:13:57 【问题描述】:

假设我有 2 个微服务 A 和 B。现在,对于服务 A 上的特定请求,A 需要对 B(使用不同的参数)对同一 API 进行多次 API 调用。最初,我使用 feign 客户端在微服务之间进行休息调用[隐式支持负载平衡、服务发现和从 Feign 客户端添加端口元数据等]。

这种方法的问题是,调用是同步的并且需要很多时间。如何/使用什么来触发多个请求并以非阻塞和异步方式等待响应?

TIA!

【问题讨论】:

Feign 被设计阻止了。见github.com/Playtika/feign-reactive 如果您正在寻找支持 WebClient 的声明式 REST 客户端,您还可以查看 Spring Cloud Square:github.com/spring-projects-experimental/spring-cloud-square 【参考方案1】:

我觉得你可以考虑Spring WebClient,它是Spring Reactive框架提供的一种异步、非阻塞的解决方案。

当然,您也可以同时拨打电话。例如,

Mono<String> response1 = request1();
Mono<String> response2 = request2();

Mono.zip(response1, response2)
        .flatMap(result -> transformer(result));

【讨论】:

嗨@Sam,我已经看到网络客户端对任何请求都使用显式URL。但是,在多 pod 环境中,它的自动解析是 feign。如何使用 webclient 来实现这一点?抱歉,我问的是非常底层的细节,因为我对这种反应范式很陌生! @DeekshithAnand 你好,你可以做到的,请参考这个例子:developpaper.com/…【参考方案2】:

您可以使用 ExecutorServices 创建两个任务并使用 CompletableFutures 捕获来自两个微服务的两个响应

【讨论】:

嗨@jayaneetha,我之前使用过这种方法,请求是从那些执行程序线程中触发的。但是它们仍然阻塞在那些执行线程中。此外,如果启用了 hystrix,我在那些 hystrix 线程上看到了 feign 日志,从中我推断请求进一步从专用执行线程委托给 hystrix 线程。

以上是关于在 Spring Boot 中使用 FeignClient 进行同步 Rest API 调用的主要内容,如果未能解决你的问题,请参考以下文章

在 spring-boot 项目中使用 spring mvc xml 项目

Spring boot在Spring boot中Redis的使用

如何在 spring-boot 中禁用 spring-data-mongodb 自动配置

如何在 Spring Boot 中使用 @Transactional 注解

spring-boot实战09:Spring Boot中使用@Scheduled创建定时任务

在 spring-boot 中使用一个模板引擎渲染多个后缀