【问题标题】:Eureka on spring-cloud-netflix with DNS based config, all instances showing up as unavailable具有基于 DNS 配置的 spring-cloud-netflix 上的 Eureka,所有实例都显示为不可用
【发布时间】: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

【问题讨论】:

    标签: spring spring-cloud netflix-eureka spring-cloud-netflix


    【解决方案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 感谢您的指点。我在代码中添加了注释以进一步强调这一点。
    猜你喜欢
    • 2015-07-07
    • 2017-05-24
    • 2017-07-21
    • 2020-04-15
    • 2018-06-18
    • 2015-10-12
    • 2016-02-15
    • 2015-10-25
    • 2018-07-31
    相关资源
    最近更新 更多