当前位置: 首页 > 知识库问答 >
问题:

spring cloud-如何为分布式spring应用获得重试、负载平衡和断路器的好处

尹雅健
2023-03-14

我想在spring-云-尤里卡支持的微服务应用程序中提供以下功能。

1)负载平衡--如果一个服务有3个节点,那么它们之间应该发生负载平衡

2)重试逻辑--如果其中一个节点没有响应,重试应该发生一定的次数(例如3。应该是可配置的),然后返回到另一个节点。

3)断路器--如果由于某种原因,服务的3个节点都出现了访问db的问题,并且抛出异常或没有响应,则电路应打开,调用回落方法,服务恢复后电路自动关闭。

看了很多spring云的例子,我发现

1)RestTemplate会对选项1有所帮助。但是当RestTemplate访问一个服务实例时,如果该节点失败,它会尝试使用其他两个节点吗?

2)Hystix将提供断路器选项(上面的3)。但是如果只有一个节点没有响应,它会尝试其他节点,然后打开电路并调用回退方法。并且一旦服务恢复,它会自动关闭电路吗?

3)如何使用spring云获得retryLogic?我确实知道@retryable注释。但它在以下情况下会有帮助吗?用一个节点重试3次,失败后,在断路器启动之前,再尝试下一个节点3次,最后一个节点3次。

我看到这些配置在spring cloud都有。但很难理解如何为所有这些配置以获得高效的解决方案。

以下是一项建议:

@HystrixCommand
@Retryable
public Object doSomething() {
   // use your RestTemplate here
}

但我不完全知道它是否能帮助我掌握上面提到的所有细微之处。

我确实看到有一个@FeignClient。但是从这个博客中,我了解到它为HTTP客户端请求提供了一个高级特性。它对重试、断路器和负载平衡一体机有帮助吗?

谢谢

共有1个答案

丁安宜
2023-03-14

我确实看到有一个@FeignClient。它对重试、断路器和负载平衡一体机有帮助吗?

如果您使用的是完整的spring-云栈,它实际上解决了您提到的一切。

该场景中的netflix组件在spring云中如下所示:

尤里卡-服务登记处

让您动态注册您的服务,这样您只需要修复一个主机在您的应用程序(eureka)。

带状负载均衡器

它为您提供了循环负载平衡,但是您可以实现自己的@RibbonClient(甚至对于特定的服务),并设计您的自定义负载平衡(例如,基于eureka元数据)。负载平衡发生在客户端。

假Http客户端

通过@feignclient,您可以为其他服务(或基础结构之外的服务)快速开发客户端。它与ribbon和eureka集成,因此您可以引用您的服务@FeignClient(yourServiceNameInEureka),最终得到的是一个客户机,该客户机使用您首选的逻辑在已注册的实例之间进行负载平衡。如果您正在使用spring,您可以使用熟悉的@requestmapping注释来描述您正在使用的端点。

Hystrix断路器

默认情况下,假客户机将使用hystrix,每个请求都将包装在hystrix命令中。当然,您可以手工创建hytrix命令,并根据需要配置它们。

您必须对其进行一些配置才能使其正常工作(实际上只需在配置上添加几个@enable注释)。

我强烈推荐阅读所提供的spring文档,因为它在相当快速的阅读中概括了您的几乎所有方面。

http://cloud.spring.io/spring-cloud-netflix/spring-cloud-netflix.html

 类似资料:
  • AWS推出了应用程序负载平衡器,可以进行基于路径的路由。是否可以将经典负载平衡器放在应用程序负载平衡器之后。 示例:假设我们有两个经典的负载平衡器。应用程序负载平衡器将流量路由到所有url(如应用程序负载平衡器/前端)的第一个经典负载平衡器,并将流量路由到所有url(如应用程序负载平衡器/后端)的第二个经典负载平衡器* 目前,似乎我们只能将主机置于应用程序负载平衡器之后。是否可以将负载平衡器置于应

  • 我希望在现有的服务器设置中集成WAF,因为我有经典的负载平衡器(带有EC2实例),它不支持WAF,我需要迁移到应用程序负载平衡器。 是否可以在不更改DNS(记录)的情况下将现有的经典负载平衡器迁移到应用程序负载平衡器?

  • 在阅读了一些文章后,我得到了以下理解:菲恩使用Ribbon作为负载均衡器。Ribbon配置在一个属性文件中,其中包含所有应用程序客户端的不同主机列表。 我的问题是: 既然我没有找到任何可理解的示例,我该如何使用Spring云负载平衡器

  • 我是微服务的新手。(学习阶段)。我有一个问题。我们在云中部署微服务。(例如 AWS)。云已经提供了负载平衡和日志。我们还在Spring Boot中实现了负载平衡(功能区)和日志(Rabbit MQ和Zipkin)。这两种实现有什么区别?我们两者都需要吗?有些人可以回答这些问题吗? 提前感谢。

  • 在Kubernetes中创建负载平衡器类型的服务时,它是创建一个全新的外部负载平衡器,还是只为负载平衡器类型的第一个服务创建一个负载平衡器,并将该负载平衡器重新用于负载平衡器类型的所有后续服务? 这个问题特别重要,因为为每个服务构建一个单独的负载平衡器对我来说成本太高。 如果它特定于云提供商,我使用Azure,但我很想知道其他云提供商是否不同。

  • 这意味着Zookeeper将负载均衡器理解为一个客户机,并与之建立联系。但是负载均衡器只是ping TCP2181就出来了。