服务发现 - 用 AWS Cloud Map 自动化微服务的连接

解说使用 AWS Cloud Map 构建服务发现的方法。介绍基于 DNS 和基于 API 的服务发现、与 ECS/EKS 的集成以及与 App Mesh 的配合(AWS 已于 2026 年 9 月 30 日终止对 App Mesh 的支持)。

服务发现的挑战

在微服务架构中,如何解析服务之间的通信目标是一个重要的问题。在单体应用中,通信目标是固定的,但在微服务中,IP 地址会因容器的启动 / 停止、Auto Scaling、部署而动态变化。也有在各服务前端配置负载均衡器(ALB)的方法,但随着服务数量增加,成本和管理的复杂度会增大。AWS Cloud Map 是一种在命名空间中集中管理微服务端点的服务发现服务。它将各服务的实例(IP 地址、端口、自定义属性)注册到注册表中,其他服务可以按名称查找连接目标。它提供基于 DNS 和基于 API 两种发现方式,可以根据使用场景选择。

命名空间与服务的注册

Cloud Map 以命名空间(Namespace)→ 服务(Service)→ 实例(Instance)的 3 层结构进行管理。命名空间有基于 DNS(公有 DNS 或私有 DNS)和基于 API(HTTP)两种。在 DNS 命名空间中,服务名称作为 DNS 记录注册,可以通过标准的 DNS 查询解析连接目标。例如,可以通过 payment.myapp.local 这个 DNS 名称获取 payment 服务的 IP 地址。在 API 命名空间中,通过 DiscoverInstances API 查找服务,并可以按自定义属性(版本、环境、区域等)进行筛选。

# 创建私有 DNS 命名空间
aws servicediscovery create-private-dns-namespace \
  --name myapp.local \
  --vpc vpc-12345 \
  --region ap-northeast-1

# 注册服务
aws servicediscovery create-service \
  --name payment \
  --namespace-id ns-xxxx \
  --dns-config '{"DnsRecords":[{"Type":"A","TTL":10}]}'

实例的注册 / 注销通过手动(API 调用)或与 ECS/EKS 的集成自动进行。

ECS 集成与健康检查

借助 Cloud Map 与 ECS 的原生集成,ECS 服务的任务启动时,实例会自动注册到 Cloud Map,任务停止时会自动注销。在 ECS 服务定义中仅指定 serviceRegistries,集成便告完成。由此,在服务间通信中,可以不经过 ALB,直接通过 Cloud Map 的 DNS 名称解析任务的 IP 地址并进行通信。可以削减 ALB 的成本(每台每月约 22 美元起),延迟也会降低(截至 2026 年 8 月)。健康检查支持 2 种。Route 53 健康检查对拥有公有 IP 的实例执行 HTTP/HTTPS/TCP 健康检查。自定义健康检查由应用程序一侧调用 UpdateInstanceCustomHealthStatus API 报告健康状态。在 ECS 集成的情况下,由于与 ECS 的任务健康检查联动,通常不需要额外的健康检查设置。

与 App Mesh 的配合与费用

AWS App Mesh(服务网格)曾将 Cloud Map 用作服务发现后端。不过,AWS 已于 2026 年 9 月 30 日终止对 App Mesh 的支持(该日之后无法访问 App Mesh 的控制台和资源)。通过将 Cloud Map 的服务关联到 App Mesh 的虚拟服务,Envoy 代理曾从 Cloud Map 自动获取端点,并应用流量路由、重试、断路器等网格功能。在 EKS 环境中,可以使用 AWS Cloud Map Controller for Kubernetes。借助它,Kubernetes 的 Service 资源可以与 Cloud Map 自动同步。费用为每个命名空间每月 0.10 美元、每 1,000 个实例注册 0.10 美元、DiscoverInstances API 每 100 万次查询 1.00 美元。DNS 查询适用 Route 53 的费用(每 100 万次查询 0.40 美元)。在小到中等规模的微服务环境中,可以以每月几美元左右的费用使用。

基于 DNS 与基于 API 的选择

Cloud Map 的服务发现有通过 DNS 解析名称的方式和通过 API 获取服务列表的方式。DNS 方式的优点是,现有应用程序可以直接沿用通过主机名访问的机制,因此在不修改代码的情况下容易采用。另一方面,API 方式可以按赋予服务的自定义属性进行筛选,因此能够进行更精细的控制,例如按版本或环境等条件选择连接目标。根据应用程序的构造以及所需控制的精细程度来选择方式。理解两者的特性并恰当地选用,会带来有效的服务发现设计。

在动态环境中的实践

在微服务中,实例会因自动扩缩而频繁增减。Cloud Map 可以与容器的启动 / 停止联动,自动完成服务的注册 / 注销,因此即使在这样的动态环境中,也能始终保持最新的连接目标。客户端与负载均衡相结合,将通信分配到健康的实例。即使在分阶段切换到新版本的场景中,也可以通过控制所注册的实例来管理流量的迁移。在实例频繁变化的环境中,让连接目标自动跟随的机制支撑着稳定的服务间通信。

总结 - Cloud Map 的利用指南

AWS Cloud Map 是集中管理微服务端点的服务发现服务。其主要优势是基于 DNS 和基于 API 两种发现方式、与 ECS 的原生集成,以及通过健康检查自动排除异常实例。在 ECS 上运营微服务时,通过采用 Cloud Map 代替在服务间通信中使用 ALB,可以实现成本削减和延迟降低。

参考资料(AWS 官方)

本页的第一手信息来源是 AWS 官方网站及官方文档。最新的规格与价格请以下列官方页面为准。

如本页内容与官方文档不一致,请以官方文档为准。

分享