1

我对假装调用的无限循环可能会如何表现感到困惑。一个例子:假设我有 2 个 API,A 和 B。如果我调用 API A,而 API A 又通过 feign HTTP 调用调用 API B,而后者又通过 feign 再次调用 API A,它会识别这一点并中断调用链?

调用的快速流程图:A -> B -> A -> B ...无限重复?

我没有尝试过这段代码,这只是一个想法。但我假设 spring-cloud-starter-feign 会提供一些方法来解决这个问题?这个假设正确吗?

    @PostMapping(RestJsonPath.API_A)
    ResponseEntity<byte[]> apiA();

    @PostMapping(RestJsonPath.API_B)
    ResponseEntity<byte[]> apiB();

会一直执行到超时还是hystrix会停止?</p>

4

1 回答 1

0

TL;博士:

Feign 将在从 A 到 B 的初始请求上保持连接打开,直到预先配置的超时开始。此时,Feign 将使请求超时,如果您指定了 Hystrix 回退,Spring 将使用您的 Hystrix 回退作为回复。

解释:

spring-boot-starter-feign 为编写 HTTP 请求代码提供了一个抽象层。它不会处理代码中的潜在循环或循环。

这是来自他们的教程网站的示例 spring boot feign 客户端用于演示:

@FeignClient(value = "jplaceholder",
        url = "https://jsonplaceholder.typicode.com/",
        configuration = ClientConfiguration.class,
        fallback = JSONPlaceHolderFallback.class)
public interface JSONPlaceHolderClient {

    @RequestMapping(method = RequestMethod.GET, value = "/posts")
    List<Post> getPosts();


    @RequestMapping(method = RequestMethod.GET, value = "/posts/{postId}", produces = "application/json")
    Post getPostById(@PathVariable("postId") Long postId);
}

首先请注意,这是一个接口- 所有代码都是 Spring 在启动时自动生成的,并且该代码将对通过注释配置的 url 发出 RESTful 请求。例如,第二个请求允许我们传入一个路径变量,Spring 将确保它位于出站请求的 URL 路径上。

这里要强调的重要一点是,这个接口负责 HTTP 调用,而不是任何潜在的循环。使用此接口的逻辑(我可以像注入任何其他 Spring Bean 一样将其注入任何其他 Spring Bean),由开发人员决定。

此示例来自的 Github 存储库

spring-boot-starter-openfeign 上的 Spring Boot 文档

希望这可以帮助您了解 openfeign 项目的目的,并帮助您了解处理应用程序代码中的循环和无限循环取决于您。

至于 Hystrix,只有当这些生成的 HTTP 请求之一失败时,该框架才会发挥作用(如果它已启用),无论是超时、4xx 错误、5xx 错误还是响应反序列化错误。您将 Hystrix 配置为合理的默认值或 HTTP 请求失败时的回退。

这是关于 Hystrix 的一个不错的教程

需要指出的一点是,Hystrix 后备必须实现您的 Feign 客户端接口,并且您必须在注释中将此类指定为您的 Hysterix 后备@FeignClient。如果 Feign 请求失败,Spring 和 Hystrix 会自动调用你的 Hystrix 类。

于 2019-08-18T03:30:25.730 回答