【问题标题】: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会停止?

【问题讨论】:

    标签: java spring-cloud-netflix hystrix openfeign


    【解决方案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 可以介入默认值 - 通常只是一个空列表、空对象,甚至是精心设计的有意义的异常消息。
    猜你喜欢
    • 2019-06-14
    • 2014-10-24
    • 1970-01-01
    • 2019-04-02
    • 1970-01-01
    • 2017-01-21
    • 1970-01-01
    • 2021-11-29
    • 2019-04-13
    相关资源
    最近更新 更多