Spring Cloud Netflix Eureka AWS 部署

5
我一直在网上寻找关于如何正确部署Spring Cloud Netflix Eureka Server到AWS的指导。我们已经使用Docker来构建微服务,其中包括Spring Cloud和Node.js,因此我一直在尝试将我的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...

在私有托管区域中使用 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绑定的文章,但是它似乎不能与从dns获取服务url兼容,并且netflix自己也没有很好地支持它(我已经看到过netflix工程师在bug评论中说route53 binder是社区捐赠的代码,并且他们不在netflix中使用它)。我还阅读过关于EIP绑定的信息,但是我不确定如何将其与ECS一起使用。我是否只需创建与我的eureka服务器数量相同的EIP,将其放入route53 txt记录中,然后eureka就会自动关联?所有这些都似乎缺乏文档支持。

1个回答

5

如果有人遇到同样的问题,希望我的回答能有所帮助。

我是否只需为每个eureka服务器创建一个EIP,将它们放在route53 txt记录中,然后eureka会自动关联?

是的,这就是我所做的,而且它运作良好。因为我的环境中每个AZ只有一个eureka实例,所以我创建了2个EIPs。这些EIPs只是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地址并自动绑定到适当区域的一个地址。微服务应用程序中的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 

请注意,eurekaServerDNSName 用于 TXT 记录查找例程。在此模式下(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 查找的结果来查找其他两个实际指向基于 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 服务器,该服务器将绑定到您刚刚添加的地址。

1
{btsdaf} - Chris
你好 @gadams00,能否分享一下你的服务端和客户端Eureka的application.yml文件吗?文档非常有限,我不确定如何配置。 - Renato Garcia
我编辑了这个答案并添加了一些更多的信息。希望这能有所帮助。 - gadams00
使用EIP,您不是也将您的Eureka服务器暴露在互联网上吗?这是您想要的吗? - derSteve

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接