如何在 zuul 启用 Hystrix 断路器?

Posted

技术标签:

【中文标题】如何在 zuul 启用 Hystrix 断路器?【英文标题】:How to enable Hystrix circuit breaker at zuul? 【发布时间】:2019-07-05 17:40:15 【问题描述】:

在我的应用程序中,我们正在使用 springboot 微服务,带有 eureka 注册中心,zuul api 网关, 这里假设我有 2 个支付服务实例, zuul 正在使用功能区将 /payment 端点负载平衡到支付服务, 当支付服务的一个节点没有响应,并且仍然在尤里卡注册时。这里我们已经在 Zuul apigateway 配置了 hystrix 断路器,但是没有为无响应的节点打开 hystrix 断路器。

【问题讨论】:

【参考方案1】:

这可以通过将负载平衡策略更改为 <ServiceName>: ribbon: NFLoadBalancerRuleClassName: com.netflix.loadbalancer.AvailabilityFilteringRule 来使用功能区实现 https://github.com/Netflix/ribbon/wiki/Working-with-load-balancers

【讨论】:

【参考方案2】:

Zuul 为每个路由创建 Hystrix 断路器 (serviceId)。这意味着一个 Hystrix 断路器将在您的所有支付服务实例之间共享

Zuul 为每条路由创建的断路器并不是为了从路由列表中移除一个不健康的实例。只是为了防止Zuul的宕机,可能是一种服务宕机引起的。

假设您使用的是 Hystrix 的默认配置。如果您有 3 个支付服务实例,并且 3 个实例中有 2 个实例宕机,则支付服务的熔断器将被打开(因为默认的断路失败阈值为 50%)。这意味着从 Zuul 到您的支付服务(包括您的一个健康实例)的所有流量都将被阻止。

您想要的 - 从路由列表中删除不正常的实例 - 是 Ribbon 的角色。 Ribbon 定义了许多接口来定义其行为,如 IRule、IPing。他们中的一些人拥有你想要的能力。

【讨论】:

那么,在每个服务中,你应该定义单独的命令吗?

以上是关于如何在 zuul 启用 Hystrix 断路器?的主要内容,如果未能解决你的问题,请参考以下文章

Hystrix 断路器实现在 Zuul API 网关级别或 REST API 服务级别

Hystrix断路器在微服务网关中的应用(Spring Cloud Gateway)

SpringCloud断路器(Hystrix)

Zuul高级配置(zuul--3)

Netflix Zuul 在一个端口上,Hystrix Dashboard 在另一个端口上

Spring Cloud Consul