【发布时间】:2017-04-01 21:11:57
【问题描述】:
我正在使用 Spring Boot 和 Spring Cloud 开发微服务。我开始了解 hystrix 和断路器模式。我知道断路器用于在下游微服务出现错误时以备用响应进行响应,我依赖这些微服务来获取数据。我的问题是,如果我没有提供任何有意义的替代响应,我为什么需要断路器?
【问题讨论】:
标签: java spring spring-boot microservices hystrix
我正在使用 Spring Boot 和 Spring Cloud 开发微服务。我开始了解 hystrix 和断路器模式。我知道断路器用于在下游微服务出现错误时以备用响应进行响应,我依赖这些微服务来获取数据。我的问题是,如果我没有提供任何有意义的替代响应,我为什么需要断路器?
【问题讨论】:
标签: java spring spring-boot microservices hystrix
简短回答:主要是为了在复杂的分布式系统中停止级联故障。
我没有任何有意义的替代回复可以提供,为什么要提供 我需要一个断路器吗?
仅当您的服务器仅提供一个 REST 端点(和一个 HTTP 动词)时,此问题才有意义。但几乎总是如此。即使是“微”服务也会有多个端点 + 多个 http 动词的组合。您不希望一个端点挂在缓慢的上游服务上,并在线程不断等待并最终导致整个应用程序崩溃后堆积线程。
看看官方documentation
Hystrix 有什么用? --- Hystrix 旨在执行以下操作:
- 保护和控制通过第三方访问(通常通过网络)依赖项的延迟和故障
客户端库。- 停止复杂分布式系统中的级联故障。
- 快速失败并快速恢复。
- 尽可能回退并优雅降级。
- 实现近乎实时的监控、警报和操作控制。
“尽可能回退并优雅降级”只是 hystrix 提供的功能之一。
【讨论】:
如果您重构单体应用程序以将其拆分为多个微服务,Hystrix 也可能很有用。 将其投入生产时,您可能希望将旧的单体代码保留一段时间作为替代响应。所以如果微服务不可用,只会执行旧代码,所以基本上可以降低风险。如果一切正常,您可以从单体应用中删除旧代码并继续使用微服务。
通过扩展 HystrixCommand 类可以轻松完成。
public class MicroserviceCommand extends HystrixCommand<String>
{
@Override
protected String run()
{
//return response from your new microservice
}
@Override
protected String getFallback()
{
//microservice is not available,
//so execute old code which was not removed from application yet
}
}
【讨论】: