双Eureka Server集群单节点宕机后服务注册注销异常问题咨询
问题根因排查
1. 业务服务配置存在两处致命错误
这是导致你问题的核心原因:
- 配置键拼写错误:
eureka.client.service-url下的键被误写为deaufaultZone,正确应为defaultZone。拼写错误会导致服务客户端无法识别第二个Eureka节点peer2的地址,默认只会请求http://localhost:8761/eureka,因此peer1宕机后,服务找不到其他可用注册节点,自然不会向peer2发起注册、发送心跳,相关的实例更新、注销操作也不会同步到peer2。 - 占位符语法错误:你写的
${EUREKA_URI:{http://peer1:8761/eureka}, ${EUREKA_URI:{http://peer2:8762/eureka}语法不符合Spring配置规范,多注册中心地址仅需用英文逗号分隔即可,无需重复声明变量。
2. 自我保护机制影响实例剔除
你两台Eureka Server都开启了自我保护enable-self-preservation: true,当peer1宕机后,集群整体的服务续约数会低于你设置的阈值0.85,此时Eureka会进入自我保护模式,停止主动剔除过期服务实例,这就是你观察到已注销服务无法自动剔除的原因。
3. 需核对hosts配置
确认两台Eureka Server、所有业务服务的hosts文件都已经配置了peer1、peer2对应的正确IP地址,否则会出现节点间跨域通信失败的问题。
修复后的业务服务参考配置
spring: application: name: service server: port: 8000 eureka: client: service-url: # 修正拼写错误和占位符语法 defaultZone: ${EUREKA_URI:http://peer1:8761/eureka,http://peer2:8762/eureka} instance: hostname: service lease-renewal-interval-in-seconds: 30
验证步骤
- 修正配置后重启所有业务服务
- 先启动两台Eureka Server,确认控制台显示互为可用副本
- 关闭peer1,等待1分钟左右重启业务服务,查看peer2控制台是否能正常展示新注册的实例
- 测试服务剔除:关闭业务服务,等待
lease-expiration-duration-in-seconds配置的90秒后查看peer2实例列表。如果需要测试自动剔除逻辑,可临时关闭Eureka的自我保护:eureka.server.enable-self-preservation: false,生产环境建议保留自我保护机制,避免网络波动导致大量实例被误删。
内容的提问来源于stack exchange,提问作者Sebastian2211
相关产品推荐
相关产品推荐

