0

有两个具有以下配置的 eureka 服务器(比如 ES1 和 ES2)。

spring:
  profiles: production

server:
  port: 8761    

eureka:
  client:
    registerWithEureka: true
    fetchRegistry: true
    serviceUrl:
      defaultZone: http://${eureka.peer.hostname}:8761/eureka/

同步工作,但在发布到生产期间,当一个 eureka 服务器(比如 ES2)关闭时,另一个 eureka 服务器(ES1)仍然维护旧的缓存信息,并且当 ES2 重新启动时,它会注册 eureka 客户端但取消注册旧客户端不会发生,这会导致功能区负载均衡器使用过时的信息。

使用以下配置注册尤里卡客户端。

eureka:
  instance:
    metadataMap:
      instanceId: ${service.contextPath}:${spring.application.instance_id:${random.value}}
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/

为什么旧实例没有从尤里卡服务器上注销?因此,我们必须完全关闭并重新启动我们的基础设施。

4

1 回答 1

0

我猜你看到的是尤里卡自我保护功能的结果。简而言之,当 Eureka 服务器注意到它在最后一分钟收到的预期续订少于 80% 时,它会自动停止过期的实例租约。当 ES1 宕机时,ES2 不再接收来自最初在 ES1 注册的客户端的心跳——然后它可能会激活自我保护模式。

为避免这种情况,您应该同时使用 ES1ES2 配置客户端:如果 ES1 不可用,客户端将自动切换到 ES2。为此,只需按如下方式列出两个地址:

eureka:
  client:
    serviceUrl:
      defaultZone: http://ES1:8761/eureka/,http://ES2:8761/eureka/

您也可以禁用自我保护功能 - 但这不是集群中的预期配置 - 所以期待奇怪的行为:-(

于 2015-07-16T19:35:01.417 回答