具有基于 DNS 配置的 spring-cloud-netflix 上的 Eureka,所有实例都显示为不可用

Posted

技术标签:

【中文标题】具有基于 DNS 配置的 spring-cloud-netflix 上的 Eureka,所有实例都显示为不可用【英文标题】:Eureka on spring-cloud-netflix with DNS based config, all instances showing up as unavailable 【发布时间】:2016-07-17 00:07:42 【问题描述】:

我正在尝试使用基于 DNS 的 EIP 配置在 aws 上设置一个 eureka 集群,如 https://github.com/Netflix/eureka/wiki/Configuring-Eureka-in-AWS-Cloud 所述

似乎一切正常,但 eureka 仪表板坚持认为 eureka 实例不可用。我现在想知道这是否只是一个 ui 问题(我认为是这样),或者我是否遗漏了一些东西。

据我了解仪表板中的“不可用副本”逻辑,这是因为 eureka 正在比较注册主机名和副本主机名。实例在发现客户端使用其内部 VPC ip 注册,但在寻找副本对等方时使用其 EIP 注册(很奇怪,在 eureka 日志中,我可以在内部看到它们也在使用内部 VPC ip)。

问题是:这只是我不应该担心的一些装饰性 ui 问题,还是因为配置错误而等待介入的更大问题?如果它只是一个 ui 的东西:我可以以某种方式“修复”它吗?

编辑:

可能相关https://github.com/spring-cloud/spring-cloud-netflix/issues/102#issuecomment-74446709

【问题讨论】:

【参考方案1】:

在相关 github 问题中 @rozhok 的帮助下,我现在有了一个可行的解决方案。如果有人面临同样的问题,这就是我所做的:

application.yml

eureka:
  datacenter: cloud
  client:
    eurekaServerDNSName: your.dns.name
    eurekaServerPort: 8761
    eurekaServerURLContext: eureka
    region: eu-west-1
    registerWithEureka: true
    fetchRegistry: true
    useDnsForFetchingServiceUrls: true
  server:
    waitTimeInMsWhenSyncEmpty: 0
    enableSelfPreservation: true

尤里卡服务器

@SpringBootApplication
@EnableEurekaServer
@EnableDiscoveryClient
public class EurekaServer 

    @Value("$server.port:8761") 
    private int port;

    public static void main(String[] args) 
        SpringApplication.run(EurekaServer.class, args);
    

    @Bean
    @Autowired
    public EurekaInstanceConfigBean eurekaInstanceConfigBean(InetUtils inetUtils) 
      EurekaInstanceConfigBean config = new EurekaInstanceConfigBean(inetUtils);
      AmazonInfo info = AmazonInfo.Builder.newBuilder().autoBuild("eureka");

      // Don't use spring cloud's hostname here. 
      // See comment below by Michal
      config.setHostname(
          info.get(AmazonInfo.MetaDataKey.publicHostname));

      config.setIpAddress(info.get(AmazonInfo.MetaDataKey.publicIpv4));
      config.setNonSecurePort(port);
      config.setDataCenterInfo(info);
      return config;
    


使用该配置,每个 eureka 服务器仅将其他服务器视为可用副本:

【讨论】:

我认为值得添加一些解释。我最近遇到了同样的问题,使用你的答案让它工作,但最终还是远程调试了在 AWS 中运行的 Eureka 服务器。让它工作的基本部分是config.setHostname(info.get(AmazonInfo.MetaDataKey.publicHostname));,而不是使用eureka.instance.hostname=$spring.cloud.client.hostname。如果没有它,实例的主机名将设置为 AWS 私有 DNS,并且由于与从 route53 获得的公共 DNS 不同,isInstanceURL 无法通过com.netflix.eureka.util.StatusUtil:76 签入。 @Michal 感谢您的指点。我在代码中添加了注释以进一步强调这一点。

以上是关于具有基于 DNS 配置的 spring-cloud-netflix 上的 Eureka,所有实例都显示为不可用的主要内容,如果未能解决你的问题,请参考以下文章

spring-cloud中config配置中心使用(基于eureka的高可用)

基于k8s环境的spring-cloud服务发现和调用配置

干货分享微服务spring-cloud(8.服务治理和配置中心Spring-cloud-zooke)

基于Spring-Cloud的微服务框架设计

spring-cloud 环境中的分布式 Rabbitmq

OPNsense通过Unbound DNS配置DoT