netflix-eureka - spring-cloud-netflix eureka aws 部署

标签 netflix-eureka amazon-ecs spring-cloud-netflix

我一直在互联网上寻找有关将 spring-cloud-netflix eureka 服务器部署到 aws 的正确方法的指导。我们已经在使用 spring-cloud 和 nodejs 的微服务中使用了相当多的 docker,所以我一直在尝试将我的 spring-boot spring-cloud eureka 应用程序部署到 ECS。 spring-cloud 文档中的信息非常有限,但我在这里找到了一些相当有用的信息:https://www.slideshare.net/ToddMiller34/spring-cloud-into-production。基于此,我目前有以下内容:

标准 spring-cloud-starter-eureka-server (spring-cloud Camden.SR5, spring-boot 1.5.1)

@Bean
@Autowired
@Profile("aws")
public EurekaInstanceConfigBean eurekaInstanceConfigBean(InetUtils inetUtils) {
    EurekaInstanceConfigBean config = new EurekaInstanceConfigBean(inetUtils);
    AmazonInfo info = AmazonInfo.Builder.newBuilder().autoBuild("eureka");
    config.setHostname(info.get(AmazonInfo.MetaDataKey.publicHostname));
    config.setIpAddress(info.get(AmazonInfo.MetaDataKey.publicIpv4));
    config.setDataCenterInfo(info);
    return config;      
}

来自云配置仓库的相关配置:
eureka:
  instance:
    non-secure-port: ${server.port}
  environment: test
  client:
    eurekaServerDNSName: test.mydomain.com
  datacenter: cloud
  client:
    region: us-west-2
    registerWithEureka: true
    fetchRegistry: true
    eurekaServerURLContext: eureka
    eurekaServerPort: 8761
    useDnsForFetchingServiceUrls: true

旁白:我很惊讶 eureka.client.region 是必需的,但没有它,服务 url 的 dns 获取默认转到 txt.us-east-1...。

私有(private)托管区域中的 route53 txt 记录:
txt.us-west-2.test.mydomain.com = "us-west-2a.test.mydomain.com" "us-west-2b.test.mydomain.com"
txt.us-west-2a.test.mydomain.com = "ec2-123-456-789-123.us-west-2.compute.amazonaws.com"
txt.us-west-2b.test.mydomain.com = "ec2-987-654-321-123.us-west-2.compute.amazonaws.com"

我将一些 eureka.server.bindingStrategy 设置为“route53”,但这不起作用(给我一个错误,提示我无法从 Route53Binder 第 135 行在 localhost 中找到免费域)。

我从 ec2 容器实例中获得了 ec2-### 主机名,一切似乎都在工作,但我非常担心这些主机名会在容器实例重新启动时发生变化。我已经阅读了有关 route53 绑定(bind)的信息,但这似乎与从 dns 获取服务 url 不兼容,而且 netflix 本身似乎也不太支持(我已经阅读了 netflix 工程师对 route53 绑定(bind)程序的错误的评论)社区捐赠的代码,并且他们不在 netflix 上使用它)。我还阅读了有关 EIP 绑定(bind)的信息,但我不确定如何将它与 ECS 一起使用。我是否只需创建与 eureka 服务器一样多的 EIP,将它们放在 route53 txt 记录中,然后 eureka 会自动关联?这一切似乎都非常缺乏文档。

最佳答案

回答我自己的问题,以防其他人遇到这个问题,这很有帮助。

Do I just create as many EIPs as I have eureka servers, put those in the route53 txt records and eureka will automatically associate?



是的,这正是我所做的,并且有效。我创建了 2 个 EIP,因为我在我的环境中的 2 个可用区中的每个可用区中只有 1 个 eureka 实例。 EIP 只是 IP 地址。然后我把它们放在我的 route53 txt 记录中,如下所示:
txt.us-west-2.test.mydomain.com = "us-west-2a.test.mydomain.com" "us-west-2b.test.mydomain.com" 
txt.us-west-2a.test.mydomain.com = "ec2-123-456-789-123.us-west-2.compute.amazonaws.com" 
txt.us-west-2b.test.mydomain.com = "ec2-987-654-321-123.us-west-2.compute.amazonaws.com"

在这种情况下,ec2-###-###-###-### 条目是基于 EIP 的 IP 地址的主机名。例如,如果 EIP 地址是 123.456.789.123,并且您在 us-west-2,则使用 ec2-123-456-789-123.us-west-2.compute.amazonaws.com。

ECS 中的 Eureka 启动,因为我的 eureka 客户端设置设置为从 dns 获取,它会找到 EIP 地址并自动绑定(bind)到相应区域中的一个。微服务应用程序中的 Eureka 客户端需要相同的 Eureka 客户端配置,因此它们可以找到相同的 Eureka 服务器主机名。

云配置 yml 文件的相关部分:
application.yml
==================
eureka:
  datacenter: cloud
  environment: production
  client:
    fetchRegistry: true
    eurekaServerURLContext: eureka
    region: us-west-2
    eurekaServerPort: 8761
    useDnsForFetchingServiceUrls: true
    eurekaServerDNSName: test.mydomain.com

eureka-server.yml
======================
eureka:
  server:
    renewalPercentThreshold: 0.49 

请注意,在 TXT 记录查找例程中使用了 eurekaServerDNSName。在这种模式下(eureka.client.useDnsForFetchingServiceUrls),spring-cloud eureka 服务器和客户端似乎使用 txt.${eureka.client.region}.${eureka.client.eurekaServerDNSName}

查找此记录:
txt.us-west-2.test.mydomain.com = "us-west-2a.test.mydomain.com""us-west-2b.test.mydomain.com"

然后使用该 dns 查找的结果来查找其他 2 个实际指向基于 EIP 的域名:
txt.us-west-2a.test.mydomain.com = "ec2-123-456-789-123.us-west-2.compute.amazonaws.com"
txt.us-west-2b.test.mydomain.com = "ec2-987-654-321-123.us-west-2.compute.amazonaws.com"

这就是他们填充 Eureka 服务器集群节点成员的方式。如果您需要添加另一个服务器,您需要配置另一个 EIP,添加到 route53 记录,然后在 ECS 中启动一个新服务器,该服务器将绑定(bind)到您刚刚添加的地址。

关于netflix-eureka - spring-cloud-netflix eureka aws 部署,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42547845/

相关文章:

在客户端重新启动之前,无法使用 docker-compose 访问 Spring Config 服务器

docker - 由于 'no such image' 错误,无法删除 docker 镜像的标签

amazon-web-services - 如何在 Debian 中安装 Amazon ECS 容器代理? (ecs-init)

spring - @LoadBalanced RestTemplate 调用嵌套上下文端点

asynchronous - 这个异步 HystrixCommand 有什么问题?

netflix-eureka - Eureka 和领事

spring-cloud - 了解 Eureka 点对点通信

spring - Spring Eureka 中的instanceid是什么?

configuration - 为基于 Spring Cloud Netflix 的 Eureka Server 设置对等感知

amazon-web-services - 让 ECS 在耗尽旧任务之前等待负载均衡器健康检查?