亚马逊AWS官方博客

新功能 — Amazon ECS 服务连接,轻松实现微服务之间的通信

微服务架构是一种众所周知的软件开发方法,它使应用程序由小型独立服务组成,这些服务通过定义明确的应用程序编程接口(API)进行通信。当客户开始将其整体应用程序分解为微服务时,他们面临着挑战,因为这需要专业的网络知识才能与其他微服务进行内部通信。

Amazon Elastic Container Service(Amazon ECS)客户有多种服务到服务的解决方案,但每种解决方案都有一些挑战和复杂性:1) 弹性负载均衡(ELB)需要谨慎规划配置基础设施以实现高可用性,并产生额外的基础设施成本。2) 使用 Amazon ECS Service Discovery 通常需要开发人员编写自定义应用程序代码,以收集流量指标并使网络调用富有弹性。3) 尽管服务之间具有高级流量监控和路由功能,但诸如 AWS App Mesh 之类的服务网格解决方案在 Amazon ECS 之外运行。

今天,我们宣布全面推出 Amazon ECS Service Connect,这是一项新功能,可简化弹性分布式应用程序的构建和运行。ECS Service Connect 提供简单的网络设置和部署在多个 ECS 集群和虚拟私有云(VPC)上的无缝服务通信。您可以为 ECS 服务通信增加一层弹性,无需更改应用程序代码即可获得对流量的见解。

通过 ECS Service Connect,您可以使用 AWS Cloud Map 提供的命名空间,按逻辑名称引用和连接您的服务,并自动在 ECS 任务之间分配流量,而无需部署和配置负载均衡器。您可以为每个 ECS 服务设置一些安全的流量弹性默认值,例如运行状况检查、503 错误自动重试以及连接耗尽。此外,Amazon ECS 控制台还提供带有实时网络流量指标的易于使用的仪表板,以方便操作和简化调试。

开始使用 Amazon ECS Service Connect
要开始使用 ECS Service Connect,您可以在创建 ECS 集群的过程中指定命名空间,或者在 Cloud Map 中创建一个命名空间。命名空间是构建服务的一种方式,可以跨位于不同 VPC 中的多个 ECS 集群。只要存在网络级连接,属于特定命名空间的所有 ECS 服务都可以与命名空间中的现有服务通信。

您还可以在 Amazon ECS 控制台左侧导航窗格的命名空间中看到 Cloud Map 命名空间列表。选择某个命名空间时,它会显示来自两个不同 ECS 集群且具有相同命名空间的服务列表,这些集群包含数据库服务(db-mysqldb-redis)和后端服务(webuiappserver)。

创建 ECS 集群时,可以在网络设置的默认命名空间中选择其中一个命名空间。在 AWS FargateAmazon EC2 实例中运行的所有新 ECS 服务均已启用 ECS Service Connect。要启用所有现有服务,您需要使用新版本的 ECS 优化亚马逊云机器镜像(AMI)或支持 ECS Service Connect 的新 Fargate 代理进行重新部署。

或者,您可以通过 AWS 命令行界面(AWS CLI)使用 serviceConnect 参数和默认 Cloud Map 命名空间名称创建集群,用于服务发现。

$ aws ecs create-cluster
     --cluster "svc-cluster-2"
     --serviceConnect {
       "defaultNamespace": "svc-namespace"
}

此命令将代表 AWS 创建一个具有该命名空间的 ECS 集群。如果您想使用已经存在的 Cloud Map 命名空间,只需在此处传递现有命名空间的名称即可。

接下来,让我们使用任务定义创建服务,并使用 ECS Service Connect 展示您的 Web 用户界面服务器。

$ aws ecs create-service
--cluster "svc-cluster-2"
--service-name "webui"
--task-definition "webui-svc-cluster"
--serviceConnect {
  "enabled": true,
  "namespace": "svc-namespace",
  "services":
   [
      {
         "portName": "webui-port",
         "discoveryName": "webui-svc",
         "clientAliases": [
           {
              "port": 80, // *Required *//
              "dnsName": "webui-svc-domain" // * Optional *//
            }
        }
     ]
   ]
}

在此命令中,portName 表示对容器端口的引用,clientAliases 分配端口号和 DNS 名称,覆盖端点中使用的发现名称。每项服务都有一个端点 URL,其中包含协议、DNS 名称和端口。您可以在任务定义或 ECS 服务配置中选择协议和端口名称。例如,端点可以是 http://webui:80grpc://appserver:8080http://db-redis:8888

在 ECS 控制台中,你可以在 svc-cluster-2 cluster 中看到 webui 服务的 ECS Service Connect 的这种配置。

如您所见,您可以使用相同的 clientAlias 和命名空间名称在不同的集群上运行相同的工作负载,以实现高可用性。ECS Service Connect 将智能地对 ECS 任务的流量进行负载平衡。要连接到在不同 ECS 集群中运行的服务,您需要为需要相互通信的所有 ECS 服务指定相同的命名空间名称。ECS Service Connect 将使您的服务可供同一命名空间中的所有其他服务发现。

利用可观察性数据提高服务弹性
您可以使用 ECS Service Connect 可观察性功能收集流量指标。默认情况下,对于每个 ECS 服务,您可以查看运行状况良好和不良的端点的数量,以及入站和出站流量。

ECS Service Connect 支持 HTTP/1、HTTP/2、gRPC 和 TCP 协议。因此,您可以收集请求数量、HTTP 错误数量和平均呼叫延迟。对于 gRPC 和 TCP,您可以看到活跃连接的总数。所有这些指标都通过自定义日志路由推送到 Amazon CloudWatch 或其他 AWS 分析服务

高级菜单中,您可以发布 ECS Service Connect 代理日志,以帮助在出现问题时进行调试。

这些指标仅在 CloudWatch 控制台的原始界面中可见。当您使用 CloudWatch 控制台时,切换到原始界面可查看 ECS 分组下的“发现名称”和“目标发现名称”等其他指标维度。

默认设置为您提供了构建弹性应用程序的起点,您可以使用 AWS 管理控制台或专用 ECS API 微调参数,以限制故障、延迟峰值和网络波动对应用程序行为的影响。

现已推出
Amazon ECS Service Connect 在所有商业区域推出,但中国除外,中国提供 Amazon ECS。AWS CloudFormationAWS CDKAWS CopilotAWS Proton 完全支持 ECS Service Connect 用于基础设施配置、代码部署和服务监控。要了解更多信息,请参阅 Amazon ECS 开发人员指南

我的同事,南非高级容器专家 Hemanth AVS 和高级开发运营顾问 Satya Vajrapu 准备了一场动手实验研讨会,以演示 ECS Service Connect 的示例。参加 AWS re:Invent 2022 时,加入 Amazon ECS 的 CON303 联网、服务网格和服务发现

尝试一下,请将反馈发送给 AWS re:Post for Amazon ECS 或通过常见的 AWS Support 联系人发送。

Channy