微服务假装无限循环的调用?

Posted

技术标签:

【中文标题】微服务假装无限循环的调用?【英文标题】:Microservice feign infinite loop of invocations? 【发布时间】:2019-12-23 18:21:58 【问题描述】:

我对假装调用的无限循环可能会如何表现感到困惑。 一个例子: 假设我有 2 个 API,A 和 B。 如果我调用 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会停止?

【问题讨论】:

【参考方案1】:

TL;DR:

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 repo where this example came from.

Spring Boot Docs on spring-boot-starter-openfeign.

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

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

This is a decent tutorial on Hystrix.

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

【讨论】:

表示我应该自己处理和检查循环调用,hysix可以帮助我处理请求超时或其他异常 是的,确切地说,您将负责确保您的代码没有任何无限循环,并且如果请求链花费的时间过长或出现错误以提供合理的信息,则 hysterix 可以介入默认值 - 通常只是一个空列表、空对象,甚至是精心设计的有意义的异常消息。

以上是关于微服务假装无限循环的调用?的主要内容,如果未能解决你的问题,请参考以下文章

Laravel REST API - 无限循环

在函数调用上反应无限循环

方法结束前的递归不是无限循环?

react + redux 无限循环

为啥这个回调会产生无限循环

从孩子设置上下文会导致无限调用循环