我有一个场景,我必须在AWS ECS上部署多个微服务。我想让服务能够通过在每个微服务中开发的API相互通信。我也想在AWS ECS上部署前端,它可以公开访问,也可以与部署在AWS ECS上的其他微服务进行通信。我怎样才能做到这一点?我是否可以使用AWS ECS服务发现,让所有服务都在一个私有子网中,以支持它们之间的通信?我能否使用弹性负载均衡器使前端微服务仅通过HTTP/HTTPS协议使终端用户通过HTTP/HTTPS协议访问,同时将其保存在私有子网中?
发布于 2019-08-18 02:02:27
AWS负载均衡器(用于公共访问)和Amazon服务发现(用于内部通信)的组合是web应用程序的最佳选择。
ECS中的内置服务发现是另一个特性,它可以轻松地开发动态容器环境,而无需管理应用程序之外的资源。ECS和路由53结合在一起,提供高度可用、完全管理和安全的服务发现
服务发现是一种使用容器直接IP地址将流量从一个容器传送到另一个容器的技术,而不是像负载平衡器这样的中介。它适用于各种用例:
是的,您可以使用AWS服务发现将所有服务都放在一个私有子网中,以启用它们之间的通信。
这使得ECS服务能够在Amazon 53中使用可预测和友好的DNS名称自动注册自己。由于您的服务在响应负载或容器健康状况时向上或向下扩展,路由53托管区域将保持最新,从而允许其他服务查找它们需要根据每个服务的状态建立连接的地方。
是的,您可以使用负载均衡器使终端用户可以通过互联网获得前端微服务。您可以查看这个图表,它显示了ECS中Web应用程序的AWS和服务发现。

您可以看到位于私有子网中的后端容器,它通过ALB为公共请求服务,而容器的其余部分则使用AWS服务发现。
Amazon服务发现
让我们启动一个具有服务发现的应用程序!首先,我将创建两个任务定义:“烧瓶后端”和“烧瓶工人”。这两个任务都是简单的AWS Fargate任务,只有一个容器为HTTP请求提供服务。我将让烧瓶后端要求worker.corp做一些工作,我将返回响应以及为工人返回的地址路由53。如下代码所示:
@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服务发现提供了两种方法:
您可以阅读有关AWS服务发现和用例amazon-ecs-服务-发现和这里的更多信息。
发布于 2019-08-12 14:11:40
根据文档,"Amazon不支持将服务注册到公共DNS命名空间“。
换句话说,当它注册DNS时,它只使用服务的私有IP地址,这可能会有问题。“公共”服务的DNS将注册到私有IP地址,例如,如果您在专用网络的VPN上工作,而不管您的子网规则是什么。
我认为更好的解决方案是把服务附加到两个负载平衡器中的一个.一个面向互联网的,一个内部的。无论如何,我认为这对于扩展服务来说是比较自然的。服务发现很酷,但实际上更适合于相互交谈的服务,而不是外部客户端。
发布于 2019-08-17 23:01:35
我也想在AWS ECS上部署前端,它可以公开访问,也可以与部署在AWS ECS上的其他微服务进行通信。
我将使用服务发现将服务内部连接起来,并使用弹性负载均衡器集成,使公众能够访问这些服务。
负载平衡器可以一边进行负载平衡,而DNS SRV记录可以在内部为您的API进行负载平衡。
这里有一个关于堆栈溢出的类似问题,答案1概述了使用负载均衡器和ECS中的服务发现集成的一个可能的解决方案。
我能否使用弹性负载均衡器使前端微服务仅通过HTTP/HTTPS协议使终端用户通过HTTP/HTTPS协议访问,同时将其保存在私有子网中?
是的,负载均衡器可以在私有子网中注册目标。
参考文献
https://stackoverflow.com/questions/57445666
复制相似问题