Spring cloud - 如何获得分布式弹簧应用的重试,负载平衡和断路器的好处

时间:2015-08-09 05:00:23

标签: spring-boot spring-cloud netflix-eureka

我想在spring-cloud-Eureka支持的微服务应用程序中使用以下功能。

1)负载平衡 - 如果我有一个服务的3个节点,它们之间应该进行负载平衡

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

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

看看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 个答案:

答案 0 :(得分:8)

  

我确实看到有一个@FeignClient。它是否有助于重试和断路器以及负载均衡一体机?

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

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

Eureka - Service Registry

让你动态地注册你的服务,这样你只需要在你的应用程序中安装一个主机(尤里卡)。

功能区 - 负载均衡器

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

Feign - Http客户端

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

Hystrix - 断路器

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

你必须配置一点才能使你的工作正常工作(实际上你的配置上只有几个@Enable注释)。

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

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