spring-cloud-netflix eureka aws deployment

时间:2017-03-02 05:56:08

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

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

标准spring-cloud-starter-eureka-server(弹簧云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;      
}

来自cloud config repo的相关配置:

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 fetch默认转到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获取服务网址兼容并且似乎并没有得到netflix自身的良好支持(我已经阅读了有关bug的评论netflix工程师认为route53活页夹是社区捐赠的代码,并且他们没有在netflix上使用它。我也读过有关EIP绑定的内容,但我不确定如何在ECS中使用它。我是否只创建了与eureka服务器一样多的EIP,将它们放在route53 txt记录中,eureka会自动关联吗?这一切似乎都非常缺乏文档。

1 个答案:

答案 0 :(得分:4)

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

  

我是否只创建了与eureka服务器一样多的EIP,并将其放入   route53 txt记录和eureka会自动关联吗?

是的,这正是我所做的,而且有效。我创建了2个EIP,因为在我的环境中,每个AZ中只有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地址并自动绑定到相应区域中的一个。微服务应用程序中的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的域名的其他2个: 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中启动一个新服务器,该服务器将绑定到您刚刚添加的地址。