我想问您是否有一个基于Spring Boot的微服务架构,其中涉及Amazon Elastic Container Service(ECS)和Application Load Balancer(ALB),平台会自动执行服务发现,还是需要特殊的机制(如Eureka或Consul)?
从文档(ECS和ALB)中并不清楚是否提供了此功能。
我想问您是否有一个基于Spring Boot的微服务架构,其中涉及Amazon Elastic Container Service(ECS)和Application Load Balancer(ALB),平台会自动执行服务发现,还是需要特殊的机制(如Eureka或Consul)?
从文档(ECS和ALB)中并不清楚是否提供了此功能。
我已经与Amazon支持团队进行了交流,他们给出了以下回答: "...在AWS ECS上使用服务发现[..]只需要使用ALB."
因此,这里有三个选项: 1)使用ALB/ELB作为服务端点(对于ALB来说是目标组,如果使用ELB则需要分开设置ELB)
2)使用Route53和DNS进行服务发现
3)使用Consul.io等第三方产品与Nginx结合使用。
让我分别介绍一下这些选项。
对于这个选项,思路是在每个服务的前面使用ELBs或ALB目标组。 我们定义一个Amazon CloudWatch Events过滤器,监听来自AWS CloudTrail的所有ECS服务创建消息,并触发Amazon Lambda函数。 此函数识别新服务使用的Elastic Load Balancing负载平衡器(或ALB目标组),并使用Amazon Route 53插入指向它的DNS资源记录(CNAME)。 Lambda函数还处理服务删除,以确保DNS记录反映运行在您的集群中的应用程序的当前状态。
这里的缺点是,如果您使用ELBs,则可能会产生更高的成本-因为每个服务都需要一个ELB。而且可能不是最简单的解决方案。 如果您想要了解更多信息,可以在这里[1]了解更多。
这种方法涉及使用Route53并在ECS容器实例上运行一个简单的代理[2]。 当您的容器停止/启动时,代理将更新Route53 DNS记录。它会创建一个SRV记录。同样,一旦容器停止,它也会删除这些记录。
此方法的另一部分是一个Lambda函数,对ECS容器实例执行健康检查,并在失败的情况下从R53中删除它们。
您可以在我们的博客文章[3]中阅读更多关于此方法的信息。
使用像Consul.io这样的工具在ECS上可以运行,但AWS不支持它。所以您可以自由使用它,但我们很遗憾不能为其提供支持。
总之,在AWS ECS上实现服务发现有几种方法 - 我在这里展示了使用AWS资源的两种方法,当然还可以使用第三方应用程序的方式。
您在AWS中没有现成的解决方案,但是可以通过一些努力来实现,如https://aws.amazon.com/es/blogs/compute/service-discovery-an-amazon-ecs-reference-architecture/所述。
您还可以安装Zuul + Ribbon + Eureka或Nginx + Consul,并使用ALB将流量分配到Zuul或Nginx之间。