Spring Cloud——分布式spring应用如何获得重试、负载均衡和断路器的好处

Posted

技术标签:

【中文标题】Spring Cloud——分布式spring应用如何获得重试、负载均衡和断路器的好处【英文标题】:Spring cloud - how to get benefits of retry,load balancing and circuit breaker for distributed spring application 【发布时间】:2015-11-01 06:36:23 【问题描述】:

我希望 spring-cloud-Eureka 支持的微服务应用程序具有以下功能。

1) 负载平衡 - 如果我有 3 个节点用于一项服务,负载平衡应该发生在它们之间

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

3) 断路器 - 如果由于某些原因,所有 3 个服务节点在访问数据库时出现问题并抛出异常或没有响应,电路应该打开,调用回退方法并在服务恢复后自动关闭电路.

看了很多Spring-cloud的例子,我想通了

1) RestTemplate 将有助于选项 1。但是当 RestTemplate 访问一个服务实例时,如果该节点发生故障,它会尝试其他两个节点吗?

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

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

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

这里是one 建议:

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

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

我确实看到有一个@FeignClient。但是从这个blog,我了解到它为HTTP 客户端请求提供了高级功能。它对重试和断路器以及负载平衡多合一有帮助吗?

谢谢

【问题讨论】:

【参考方案1】:

我确实看到有一个@FeignClient。它对重试和断路器以及负载平衡多合一有帮助吗?

如果您使用的是完整的 spring-cloud 堆栈,它实际上可以解决您提到的所有问题。

本场景中的netflix组件在spring-cloud中如下:

Eureka - 服务注册表

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

功能区 - 负载均衡器

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

Feign - Http 客户端

使用@FeignClient,您可以为您的其他服务(或基础架构之外的服务)快速开发客户端。它与功能区和尤里卡集成,因此您可以参考您的服务@FeignClient(yourServiceNameInEureka),您最终得到的是一个客户端,它使用您的首选逻辑在注册实例之间进行负载平衡。如果您使用的是 spring,您可以使用熟悉的 @RequestMapping 注解来描述您正在使用的端点。

Hystrix - 断路器

默认情况下,您的 feign 客户端将使用 hystrix,每个请求都将包装在 hystrix 命令中。您当然可以手动创建 hytrix 命令并根据需要进行配置。

您必须进行一些配置才能使它们正常工作(实际上只是在您的配置上添加了几个@Enable 注释)。

我强烈建议您阅读提供的 spring 文档,因为它以相当快的速度概括了您的几乎所有方面。

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

【讨论】:

通过 Zuul(api 网关)代理所有 @FeignClient 请求是否可行,是否有意义? 视情况而定,如果您可以直接访问服务,我会省略中间人,但如果有充分的理由将网关放在资源池前面,那将是有意义的。

以上是关于Spring Cloud——分布式spring应用如何获得重试、负载均衡和断路器的好处的主要内容,如果未能解决你的问题,请参考以下文章

spring boot 2.0.3+spring cloud (Finchley)6配置中心Spring Cloud Config

Spring Cloud-鸿鹄Cloud分布式微服务云系统—Config

Spring cloud--鸿鹄Cloud分布式微服务云系统—Config

spring boot/cloud 应用监控

spring cloud互联网分布式微服务云平台规划分析--spring cloud服务监控中心

spring cloud互联网分布式微服务云平台规划分析--spring cloud服务监控中心