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

Microservice feign infinite loop of invocations?

我对假装调用的无限循环的行为方式感到困惑。 一个例子: 假设我有 2 APIs,A 和 B。 如果我调用 API A,后者又通过伪造 HTTP 调用调用 API B,后者又通过伪造再次调用 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会停止?

长话短说:

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

解释:

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

这里有一个示例 spring 从他们的教程网站引导 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 在启动时自动生成的,并且该代码将发出 RESTful 请求到通过注释配置的 url。例如,第二个请求允许我们传入一个路径变量,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 注释。 Spring 如果 Feign 请求失败,Hystrix 将自动调用您的 Hystrix class。