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