使用Zuul和Eureka的Spring Cloud无法处理服务实例

时间:2016-07-20 09:32:01

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

我在使用Docker的Spring Cloud环境中使用Netflix Eureka和Zuul时遇到问题。

我目前的设置如下:3个Docker容器:

  • a Eureka服务器
  • 一个Zuul服务器,它使用Eureka将路由映射到服务,并在同一服务的多个容器之间进行负载平衡。
  • 服务(目前只返回一个简单的字符串)

此设置工作正常,但当我开始使用服务的缩放时,麻烦就开始了。 当我扩展时,Zuul会在30秒后获取新服务器。这对我很好。但是,当我取下服务容器时,对Zuul的调用可能会失败(HTTP错误代码为200!),因为Zuul仍然认为服务器位于活动池中。

我使用的是Spring Boot 1.3.6和Spring Cloud 1.1.2

我的问题:

  • 可以配置Zuul重试呼叫吗?
  • 有没有办法强制Zuul使用REST调用对所有服务器执行ping操作?据我所知,没有Spring Cloud端点。发布到/路线并没有做我想要的。
  • 如果不可能,当服务器没有及时响应时,Zuul是否可以配置为实际发送除200以外的其他内容?

1 个答案:

答案 0 :(得分:1)

你不必告知zuul关于服务器列表中的更改,就像它在下面完成的那样。这里的真正问题是,尤里卡决定将这些实例保留在其注册表中。 有一条规则:如果少于85%的服务响应healthcheck,那么eureka认为它是由于网络故障/分区并将所有服务保留在注册表中。如果您只有3个服务实例,那么很可能会发生这种情况。可以想象,如果一个关闭(所有3个实例中的33.3%),eureka将忽略它并仍然向客户提供此实例。

如果你有100台服务器,这可能是一个不错的功能:)它的netflix工具主要是根据他们的需要进行调整。

您可以尝试关闭selfPreservation:

eureka.server.enable-self-preservation=false

或将阈值调整到某个较低的值:

eureka.server.renewal-percent-threshold=0.85

http://cloud.spring.io/spring-cloud-static/spring-cloud.html#_appendix_compendium_of_configuration_properties