首页 > 解决方案 > 服务有时会以 localhost 的身份注册到 eureka。尤里卡复制

问题描述

介绍

所以总的来说一切都很好。但我注意到有时在重新启动后我们的一些服务会注册为 localhost。

这让 Spring Boot 管理员发疯了,它开始向我们发送垃圾邮件说服务已关闭。

所以我们开始收到以下电子邮件:

SEQUENCE-SERVICE (52c98f2235a2) is OFFLINE 
Instance 52c98f2235a2 changed status from OFFLINE to OFFLINE 
Status Details
exception
io.netty.channel.AbstractChannel$AnnotatedConnectException
message
Connection refused: no further information: localhost/127.0.0.1:8007
Registration
Service Url http://localhost:8007/ 

Health Url  http://localhost:8007/sequence-service/v1/actuator/health 

Management Url  http://localhost:8007/actuator 

基础设施

我们有三台服务器。所以我们有两台服务器,每台服务器都运行一个 eureka,而且它们也在运行微服务。

我们有第三台服务器正在运行指标,以及 spring boot admin。

Out Eureka 配置基本上是:

尤里卡-0

server.port=7995
eureka.instance.hostname=prod
eureka.instance.appname= discovery-service
eureka.client.registerWithEureka=true
eureka.client.fetchRegistry=true
eureka.client.serviceUrl.defaultZone=http://admin:admin@prod1:7995/eureka/


spring.application.name = discovery-service
security.user.name=admin
security.user.password=admin
spring.security.user.name=admin
spring.security.user.password=admin

endpoints.health.sensitive=false
management.endpoints.web.exposure.include=info, health


spring.profiles.active=prod,mbakTest

eureka.instance.metadata-map.user.name=${security.user.name}
eureka.instance.metadata-map.user.password=${security.user.password}

尤里卡-1

server.port=7995
eureka.instance.hostname=prod1
eureka.instance.appname= discovery-service
eureka.client.registerWithEureka=true
eureka.client.fetchRegistry=true
eureka.client.serviceUrl.defaultZone=http://admin:admin@prod:7995/eureka/


spring.application.name = discovery-service
security.user.name=admin
security.user.password=admin
spring.security.user.name=admin
spring.security.user.password=admin

eureka.instance.metadata-map.user.name=${security.user.name}
eureka.instance.metadata-map.user.password=${security.user.password}

序列服务

#Eureka configuration
eureka.client.enabled=true
eureka.client.healthcheck.enabled=true
eureka.client.registerWithEureka=false
eureka.client.fetchRegistry=true
eureka.instance.leaseRenewalIntervalInSeconds=15
eureka.instance.leaseExpirationDurationInSeconds=30
    eureka.client.serviceUrl.defaultZone=${EUREKA_SERVICE_URL:http://admin:admin@prod:7995/eureka/,http://admin:admin@prod1:7995}/eureka/

问题

所以我有两个问题

1)所以我不明白为什么有时一切都很好,而其他时候,我们收到来自 spring-boot-admin 的电子邮件,告诉我们服务已关闭。但是服务并没有关闭——它已经在 localhost 上注册了。当我们重新启动它时,一切都很好。这通常发生在重新启动后。

2) 这种配置是否正确且健壮?我的想法是,如果一个 eureka 或服务器出现故障,另一个将取代它。

标签: springspring-bootspring-clouddiscoveryspring-boot-admin

解决方案


Spring Cloud 依赖于一个被调用的类InetUtils来确定主机名。它通过检查第一个/最高优先级非环回网络接口的主机名来实现。

如果找不到非环回网络接口,则它使用在 中配置的主机名spring.cloud.inetutils.default-hostname。此属性的默认值为localhost

如果可以找到非环回接口,但确定主机名的时间超过 1 秒,它将回退到localhost. 请注意,在这种情况下,您不能覆盖主机名,因为它使用硬编码的 localhost 值。您可以通过配置spring.cloud.inetutils.timeout-seconds属性来更改 1 秒的超时。

在我们的案例中,后者是问题所在。我们通过将超时时间增加到 5 秒来解决它:

spring.cloud.inetutils.timeout-seconds=5

要找出罪魁祸首,您可以为InetUtils该类启用跟踪日志记录:

logging.level.org.springframework.cloud.commons.util.InetUtils=trace

推荐阅读