服务有时会以本地主机的身份注册到尤里卡。尤里卡复制
Services sometime register to eureka as localhost. Eureka replication
简介
所以总的来说一切正常。
但我注意到有时在重启后我们的一些服务会注册为本地主机。
这让 spring 引导管理员变得疯狂,它开始向我们发送垃圾邮件说服务已关闭。
因此我们开始收到以下电子邮件:
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
基础设施
我们有三台服务器。
所以我们有两台服务器,每台服务器 运行 一个尤里卡,它们也是 运行 微服务。
我们有第三台服务器,它是 运行 指标,spring 引导管理员。
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}
Eureka-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 的电子邮件,告诉我们服务已关闭。
但该服务并未关闭 - 它已在本地主机上注册。
当我们重新启动它时,一切都很好。这通常发生在重启后。
2) 这个配置是否正确且稳健?我的想法是,如果一个尤里卡或服务器出现故障,另一个将取代它。
我最终使用的解决方案是切换到 IP 地址而不是主机名。
我怀疑什么时候:
- 微服务与 eureka 在同一台服务器上运行 &
- eureka.instance.preferIpAddress=假
微服务可以注册为 hostname=localhost。
通过设置 eureka.instance.preferIpAddress=true
,现在我的微服务总是使用它们的 IP 地址注册。到目前为止,它一直是 public IP 地址。
Spring Cloud 依靠名为 InetUtils
的 class 来确定主机名。它通过检查 first/highest 优先级非环回网络接口的主机名来实现。
如果找不到非环回网络接口,则使用 spring.cloud.inetutils.default-hostname
中配置的主机名。这个属性的默认值为localhost
.
如果可以找到非环回接口,但确定主机名的时间超过 1 秒,它将回退到 localhost
。 注意,在这种情况下,您不能覆盖主机名,因为它使用硬编码的本地主机值。不过,您可以通过配置 spring.cloud.inetutils.timeout-seconds
属性.
更改 1 秒的超时
在我们的例子中,后者是问题所在。我们通过将超时增加到 5 秒来解决它:
spring.cloud.inetutils.timeout-seconds=5
要找出罪魁祸首,您可以为 InetUtils
class:
启用跟踪日志记录
logging.level.org.springframework.cloud.commons.util.InetUtils=trace
简介
所以总的来说一切正常。 但我注意到有时在重启后我们的一些服务会注册为本地主机。
这让 spring 引导管理员变得疯狂,它开始向我们发送垃圾邮件说服务已关闭。
因此我们开始收到以下电子邮件:
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
基础设施
我们有三台服务器。 所以我们有两台服务器,每台服务器 运行 一个尤里卡,它们也是 运行 微服务。
我们有第三台服务器,它是 运行 指标,spring 引导管理员。
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}
Eureka-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 的电子邮件,告诉我们服务已关闭。 但该服务并未关闭 - 它已在本地主机上注册。 当我们重新启动它时,一切都很好。这通常发生在重启后。
2) 这个配置是否正确且稳健?我的想法是,如果一个尤里卡或服务器出现故障,另一个将取代它。
我最终使用的解决方案是切换到 IP 地址而不是主机名。
我怀疑什么时候:
- 微服务与 eureka 在同一台服务器上运行 &
- eureka.instance.preferIpAddress=假
微服务可以注册为 hostname=localhost。
通过设置 eureka.instance.preferIpAddress=true
,现在我的微服务总是使用它们的 IP 地址注册。到目前为止,它一直是 public IP 地址。
Spring Cloud 依靠名为 InetUtils
的 class 来确定主机名。它通过检查 first/highest 优先级非环回网络接口的主机名来实现。
如果找不到非环回网络接口,则使用 spring.cloud.inetutils.default-hostname
中配置的主机名。这个属性的默认值为localhost
.
如果可以找到非环回接口,但确定主机名的时间超过 1 秒,它将回退到 localhost
。 注意,在这种情况下,您不能覆盖主机名,因为它使用硬编码的本地主机值。不过,您可以通过配置 spring.cloud.inetutils.timeout-seconds
属性.
在我们的例子中,后者是问题所在。我们通过将超时增加到 5 秒来解决它:
spring.cloud.inetutils.timeout-seconds=5
要找出罪魁祸首,您可以为 InetUtils
class:
logging.level.org.springframework.cloud.commons.util.InetUtils=trace