通过 AWS Cloud Map 实现服务发现 - 微服务间的动态名称解析
通过 DNS 和 API 两种方式动态发现微服务端点。介绍与 ECS、EKS 集成实现服务自动注册和注销的方法。
Cloud Map 概述
Cloud Map 是一项为应用程序资源提供服务发现的服务。在微服务架构中,当服务 A 调用服务 B 时,无需硬编码服务 B 的端点,而是通过查询 Cloud Map 进行动态解析。提供 DNS 和 API 两种发现方式,并与 ECS 和 EKS 集成实现服务的自动注册和注销。
DNS 与 API 发现
DNS 命名空间将服务注册为 DNS 记录,通过 service-b.my-namespace.local 这样的 DNS 名称进行解析。现有应用程序可以通过 DNS 查询发现服务,无需修改代码。HTTP 命名空间通过 DiscoverInstances API 获取服务实例,并可按自定义属性(version=v2、environment=prod)进行过滤。ECS 服务发现在任务启动时自动向 Cloud Map 注册实例,在任务停止时自动注销。通过 Route 53 健康检查检测异常实例并将其从发现结果中排除。
与 ECS 和 EKS 的集成
在 ECS 服务中启用 Cloud Map 后,服务实例会随着任务的启动和停止自动注册和注销。基于 DNS 的发现会在 Route 53 中创建 SRV 或 A 记录,客户端通过 DNS 名称解析服务。基于 API 的发现通过 DiscoverInstances API 获取已通过健康检查的实例列表,在客户端实现负载均衡。在 EKS 中,可以使用 AWS Cloud Map MCS Controller 将 Kubernetes Service 自动同步到 Cloud Map。健康检查可选择 Route 53 健康检查或自定义健康检查(应用程序调用 UpdateInstanceCustomHealthStatus API 的方式)。
Cloud Map 的定价与运维
Cloud Map 的定价由资源注册数和 API 调用数决定。DNS 查询适用 Route 53 的标准费率,DiscoverInstances API 每 100 万次请求收费 1 美元(截至 2026 年 8 月)。在实例注册和注销频繁发生的自动扩展环境中,API 调用数会增加,因此需要在客户端实现缓存以控制成本。在命名空间设计中,建议按环境(dev/staging/prod)分离命名空间,服务名称在各环境间保持统一,以消除应用程序代码的环境依赖。通过 CloudWatch 指标监控 DiscoverInstances 的调用次数和延迟,检测异常增长。
作为服务注册表的角色
Cloud Map 作为记录哪个服务在何处运行的注册表发挥作用。在微服务架构中,服务的实例会增减,部署位置也会动态变化,因此无法以固定的端点为前提。只要将当前正在运行的实例注册到 Cloud Map,调用方就能始终查询并解析最新的所在位置。与服务网格这类上层机制组合使用时,这个注册表同样是基础。通过集中管理服务的所在位置,即使在动态的环境中也能实现稳定的调用。
健康检查的设计
如果发现结果中混入异常的实例,调用就会失败。Cloud Map 与健康检查联动,可以设计成只返回健康的实例。有通过网络确认状态的方式和由应用程序自身报告其健康状况的方式,根据需求进行选择。在容器环境中,注册和注销会与任务的启动和停止联动实现自动化,因此可以防止被分配到已停止实例的事故。适当设置健康状况的判定标准和检查间隔,以便在发生故障时能够迅速将其隔离。
容器以外及混合环境中的使用
Cloud Map 与 ECS、EKS 的集成简便,但也可以注册除此以外的资源。使用 API,可以手动或通过程序注册 EC2 实例、本地服务器和外部端点,并以同样的机制将其作为名称解析的对象。由此,即使在容器与传统服务器混合存在的环境中,也能统一处理服务的所在位置。对于处于迁移期的系统或混合架构的应用程序来说,能够统一地发现新旧组件,有助于推进分阶段的现代化。
故障时的行为与设计注意事项
使用服务发现时,需注意解析结果的缓存与新鲜度之间的平衡。通过 DNS 解析时,如果 TTL 过长,旧的实例信息会残留,有尝试连接到已停止目标的风险。反之,如果过短,查询会增加,影响成本和延迟。要点是一种在客户端适当缓存、同时通过健康检查迅速排除异常的设计。在注册和注销频繁的自动扩展环境中,API 调用会增加,因此通过改进缓存策略来抑制负载和成本,维持稳定的服务间通信。
总结
引入 Cloud Map 最便捷的入口是与 ECS 服务发现的集成。只需在 ECS 服务中启用 Cloud Map,即可自动化与任务启动和停止联动的服务注册。如果现有应用程序通过 DNS 进行名称解析,选择 DNS 命名空间;如果需要按自定义属性过滤,选择 HTTP 命名空间。在命名空间设计中,建议按环境(dev/staging/prod)分离,服务名称在各环境间保持统一。
参考资料(AWS 官方)
本页的第一手信息来源是 AWS 官方网站及官方文档。最新的规格与价格请以下列官方页面为准。
如本页内容与官方文档不一致,请以官方文档为准。