gad*_*s00 4 amazon-ecs netflix-eureka 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;
}
Run Code Online (Sandbox Code Playgroud)
来自 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
Run Code Online (Sandbox Code Playgroud)
aside: I was surprised that eureka.client.region was required, but without it the dns fetch for service urls went to txt.us-east-1... by default.
route53 txt records in private hosted zone:
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"
Run Code Online (Sandbox Code Playgroud)
I had some eureka.server.bindingStrategy set to 'route53', but this doesn't work (gives me an error about not being able to find a free domain in localhost from Route53Binder line 135).
I got the ec2-### hostnames from the ec2 container instances, and things seem to be working, but I'm very concerned that these hostnames are going to change anytime the container instances get restarted. I've read about route53 binding, but that doesn't seem to be compatible with fetching service urls from dns and also doesn't seem well supported by netflix themselves (I've read comments on bugs by netflix engineers that the route53 binder was community-donated code, and that they don't use it at netflix). I've also read about EIP binding, but I'm not sure how to use that with ECS. Do I just create as many EIPs as I have eureka servers, put those in the route53 txt records and eureka will automatically associate? This all seems sorely lacking in documentation.
回答我自己的问题,以防其他人遇到这个问题,这很有帮助。
我是否只创建与 eureka 服务器一样多的 EIP,将它们放在 route53 txt 记录中,eureka 会自动关联?
是的,这正是我所做的,并且有效。我创建了 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"
Run Code Online (Sandbox Code Playgroud)
在这种情况下,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
Run Code Online (Sandbox Code Playgroud)
请注意,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 查找的结果来查找其他 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 中启动一个新服务器,该服务器将绑定到您刚刚添加的地址。
| 归档时间: |
|
| 查看次数: |
5194 次 |
| 最近记录: |