微服务假装无限循环的调用?
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 可以介入默认值 - 通常只是一个空列表、空对象,甚至是精心设计的有意义的异常消息。以上是关于微服务假装无限循环的调用?的主要内容,如果未能解决你的问题,请参考以下文章