将AWS负载均衡器(用于公共访问)和Amazon ECS服务发现(用于内部通信)相结合,是Web应用程序的完美选择。
ECS中的内置服务发现是另一个功能,使得开发动态容器环境变得容易,而无需管理应用程序之外的多个资源。ECS和Route 53结合使用,提供高可用性、完全托管和安全的服务发现。
服务发现是一种技术,用于通过容器的直接IP地址将流量从一个容器传输到另一个容器,而不是像负载均衡器这样的中介。它适用于各种用例:
- 私有的、内部的服务发现
- 服务之间低延迟通信
- 长期的双向连接,例如gRPC。
是的,您可以使用AWS ECS服务发现,在私有子网中拥有所有服务,以使它们之间能够通信。
这使得ECS服务能够自动在Amazon Route 53中注册自己,并获得可预测且友好的DNS名称。随着服务根据负载或容器健康状况的变化而缩放,Route 53托管区域会保持最新状态,允许其他服务根据每个服务的状态查找需要建立连接的位置。
是的,您可以使用负载均衡器使前端微服务可以通过互联网对终端用户进行访问。您可以查看此图表,其中显示了用于ECS中Web应用程序的AWS LB和服务发现。
![https://aws.amazon.com/blogs/aws/amazon-ecs-service-discovery/](https://istack.dev59.com/iChsi.webp)
您可以通过ALB访问位于私有子网中的后端容器,而其余容器使用AWS服务发现。
Amazon ECS服务发现
让我们使用服务发现启动一个应用程序!首先,我将创建两个任务定义:“flask-backend”和“flask-worker”。它们都是简单的AWS Fargate任务,具有一个容器用于处理HTTP请求。我会让flask-backend请求worker.corp执行一些工作,并返回响应以及Route 53为worker返回的地址。例如下面的代码:
@app.route("/")
namespace = os.getenv("namespace")
worker_host = "worker" + namespace
def backend():
r = requests.get("http://"+worker_host)
worker = socket.gethostbyname(worker_host)
return "Worker Message: {]\nFrom: {}".format(r.content, worker)
请注意,在这个私有架构中,没有公共子网,只有一个私有子网。子网内的容器可以使用其内部IP地址相互通信。但是他们需要一些方式来发现彼此的IP地址。
AWS服务发现提供了两种方法:
- 基于DNS(Route 53创建和维护一个自定义DNS名称,该名称解析为其他容器的一个或多个IP地址,例如
http://nginx.service.production。然后其他容器可以通过使用此DNS名称打开连接来将流量发送到目标)
- 基于API(容器可以查询API以获取可用IP地址目标列表,然后直接打开连接到另一个容器之一。)
您可以阅读更多关于AWS服务发现和用例
amazon-ecs-service-discovery 和
here