亚马逊AWS官方博客

Amazon ECS 服务发现

Amazon ECS 现包含集成式服务发现。这使得 ECS 服务可以在 Amazon Route 53 中自动注册一个可预测且易于辨认的 DNS 名称。当您的服务为响应负载或容器运行状况而扩展或收缩时,Route 53 托管区域会保持最新状态,允许其他服务根据每项服务的状态查找需要建立连接的位置。您可以在虚构社交网络应用程序中看到服务发现演示:https://servicediscovery.ranman.com/

服务发现


向微服务和现代架构过渡需要动态、自动缩放和稳健的服务,能够迅速响应故障和不断变化的负载。您的服务可能有复杂的服务依赖关系,依赖某些服务,又提供某些服务。现代架构的最佳实践是以松散的方式耦合这些服务,允许它们指定自己的依赖关系,但在动态环境中,这项任务就非常复杂了,因为每项服务服务都必须找到自己的连接点。

像 consul、etcd 或 zookeeper 这样的传统服务发现方法能够很好地解决这个问题,但它们需要在您的容器或实例中额外预置和维护基础设施,或安装代理。以前,为了确保服务能够相互发现和连接,您必须配置并运行自己的服务发现系统或将每个服务都连接到负载均衡器。现在,您可以通过 ECS 控制台、AWS CLI 或 ECS API 启用容器化服务的服务发现功能。

Amazon Route 53 服务注册库和自动命名 API 简介

Amazon ECS 服务发现通过与 Amazon Route 53 服务注册库和自动命名 API 通信发挥作用。由于先前的博客文章并未提到过相关内容,我想简要介绍一下这些 Route 53 API 的工作原理。首先介绍几个术语:

  • 命名空间 – 命名空间会指定您要将流量路由到的域名 (例如,internal、local、corp)。您可以将其视为一种逻辑边界,在此边界内,服务应能彼此发现。要创建命名空间,您可以调用 aws servicediscovery create-private-dns-namespace 命令,或在 ECS 控制台中创建。命名空间大致等同于 Route 53 中的托管区域。命名空间包含服务,也就是我们要介绍的下一个术语。
  • 服务 – 服务是命名空间中的特定应用程序或一组应用程序,如“auth”、“timeline”或“worker”。一项服务包含多个服务实例。
  • 服务实例 – 服务实例包含的信息可以指示 Route 53 应如何响应 DNS 资源查询。

Route 53 提供用于创建以下内容的 API:命名空间、每个任务 IP 的 A 记录,以及每个任务 IP + 端口的 SRV 记录。

在向 Route 53 请求 worker.corp 等某些资源时,我们应该会收到一组满足请求条件的 IP。如果我们连接到的应用程序公开了动态端口,那么调用方应用程序就可以轻松查询 SRV 记录,以获得更多信息。

ECS 服务发现基于 Route 53 API 构建,为您管理所有基础 API 调用。现在,我们已经了解了服务注册库的作用,下面来看看 ECS 端,了解服务发现的实际操作。

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)

既然已经有了容器和任务定义,下面我将在控制台中创建一项服务。

进行服务向导中的第二步时,填写服务发现部分,并让 ECS 为我创建一个新的命名空间。

我还会让 ECS 监视服务中任务的运行状况,并根据需要向 Route 53 中添加或从中删除。然后,我会在我们将要使用的 A 记录上设置 10 秒的 TTL。

为我的“worker”服务重复执行相同的步骤,大约一分钟之后,我的大部分任务应该均已正常启动并运行。

在 Route 53 控制台中,我可以看到我的任务的所有记录!

我们可以使用 Route 53 服务发现 API 来列举所有可用服务和任务,并以编程方式连接到每项服务和任务。在后端和 worker 以外,我们可以轻松扩展到任意数量的服务。我创建了一个简单的虚构社交网络演示,包括“auth”、“feed”、“timeline”、“worker”、“user”及其他一些服务;有关详情请访问此处:https://servicediscovery.ranman.com/。您可以在 github 上查看用于运行该页面的代码。

现已推出
Amazon ECS 服务发现现已在美国东部 (弗吉尼亚北部)美国东部 (俄亥俄)美国西部 (俄勒冈)欧洲 (爱尔兰) 推出。AWS Fargate 目前只在美国东部 (弗吉尼亚北部) 提供。使用 ECS 的服务发现功能时,您将按照所使用的 Route 53 资源量 (包括您创建的每个命名空间) 以及您的服务所执行的查找查询量付费。容器级运行状况检查不产生额外的费用。有关定价的更多信息,请参阅相关文档

请在评论区或 Twitter 上告诉我们您将使用服务发现构建或重构什么内容。

Randall

附:我的每篇博文都得到了诸多 AWS 同事的大力支持。我要借此机会,对所有团队中帮助构建服务发现的所有人诚恳地说一句:谢谢!:)