微服务假装调用的无限循环?
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。
我对假装调用的无限循环的行为方式感到困惑。 一个例子: 假设我有 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。