AWS Cloud Map

提供微服务的服务发现,通过 DNS 或 API 解析服务位置的服务

概述

AWS Cloud Map 是提供云资源服务发现的全托管服务。在微服务架构中,动态解析服务的 IP 地址和端口号,实现服务间通信。提供基于 DNS 的发现 (与 Route 53 集成) 和基于 API 的发现两种方式,可统一管理运行在容器、Lambda、EC2 等不同计算平台上的服务。通过与 ECS 和 EKS 的深度集成,在容器部署和扩缩容时服务注册表会自动更新。

命名空间与服务注册机制

Cloud Map 的命名空间是将服务逻辑分组的容器。命名空间有 HTTP 命名空间 (仅用于 API 发现)、DNS 命名空间 (公共 DNS 或私有 DNS) 共 3 种类型。私有 DNS 命名空间最常用于 VPC 内的服务间通信,例如创建 internal.myapp.local 这样的内部域名。在命名空间下注册服务,并为每个服务关联实例 (实际端点)。实例可设置 IP 地址、端口号和自定义属性 (版本、环境、区域等)。自定义属性在 API 发现中很有用,可以实现"仅获取 version=v2 且 region=ap-northeast-1 的实例"这样的过滤。服务的注册和注销通过 API 进行,使用 ECSEKS 的服务发现集成时,实例会随任务或 Pod 的生命周期自动注册和注销。每个命名空间的服务数和实例数有软限制,大规模环境中可能需要申请限额提升。

基于 DNS 与基于 API 的发现

基于 DNS 的发现是通过标准 DNS 查询解析服务端点的方式。Cloud Map 在 Route 53 的私有托管区域中自动管理记录,可以通过 payment.internal.myapp.local 这样的 DNS 名称访问服务。支持 A 记录 (IP 地址) 和 SRV 记录 (IP + 端口),使用 SRV 记录还可以动态解析端口号。DNS 方式的优点是客户端无需修改,现有应用程序可以直接通过 DNS 名称调用服务。另一方面,由于 DNS 缓存的 TTL (最短 10 秒),实例变更的反映会有延迟。基于 API 的发现是直接调用 DiscoverInstances API 的方式,不受 DNS 缓存影响,可以获取实时的实例信息。适用于需要自定义属性过滤或健康检查状态即时反映的场景。但需要在应用程序端嵌入 AWS SDK 调用代码。DiscoverInstances API 内置了区域级缓存,即使高频调用也能低延迟响应。

与 ECS、EKS 的集成及健康检查

ECS 服务中启用 Cloud Map 的服务发现后,任务启动时会自动注册实例,任务停止时会自动注销。ECS 的 awsvpc 网络模式为每个任务分配独立的 ENI (IP 地址),因此 Cloud Map 中注册的是准确的 IP。与 Fargate 组合使用时,服务注册表会随任务的扩缩容实时更新,无需负载均衡器即可实现服务间的直接通信。在 EKS 环境中,通常使用 ExternalDNS 控制器将 Kubernetes Service 资源与 Cloud Map 同步。健康检查有 Route 53 健康检查 (DNS 命名空间) 和自定义健康检查 (通过 API 手动报告) 两种。Route 53 健康检查执行 HTTP/HTTPS/TCP 端点监控,自动将异常实例从 DNS 响应中排除。自定义健康检查实现应用特有的健康逻辑 (数据库连接确认、依赖服务响应确认等),通过 UpdateInstanceCustomHealthStatus API 报告状态。费用基于实例注册数和 DiscoverInstances API 调用次数的按量计费,小规模配置每月仅需几美元。

共有するXB!