我一直在网上寻找关于如何正确部署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就会自动关联?所有这些都似乎缺乏文档支持。