服务发现 - 用 AWS Cloud Map 自动化微服务连接
解析用 AWS Cloud Map 构建服务发现。介绍基于 DNS/API 的服务检测、ECS/EKS 集成、App Mesh 联动。
服务发现的挑战
微服务架构中,如何解析服务间的通信目标是重要课题。单体应用中通信目标是固定的,但微服务中容器的启停、Auto Scaling、部署会导致 IP 地址动态变化。在每个服务前放置负载均衡器 (ALB) 也是一种方法,但服务数增加时成本和管理复杂度也增大。AWS Cloud Map 是在命名空间中集中管理微服务端点的服务发现服务。将各服务的实例 (IP 地址、端口、自定义属性) 注册到注册表,其他服务可按名称搜索连接目标。提供基于 DNS 和基于 API 两种发现方式,可根据用例选择。
命名空间与服务注册
Cloud Map 以命名空间 (Namespace) → 服务 (Service) → 实例 (Instance) 的三层结构管理。命名空间有基于 DNS (公共 DNS 或私有 DNS) 和基于 API (HTTP) 两种。DNS 命名空间中,服务名注册为 DNS 记录,可通过标准 DNS 查询解析连接目标。例如用 payment.myapp.local 这个 DNS 名获取 payment 服务的 IP 地址。API 命名空间中,通过 DiscoverInstances API 搜索服务,可按自定义属性 (版本、环境、区域等) 过滤。 ```bash # 创建私有 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 USD/月),延迟也降低。健康检查支持两种。Route 53 健康检查对拥有公共 IP 的实例执行 HTTP/HTTPS/TCP 健康检查。自定义健康检查由应用侧调用 UpdateInstanceCustomHealthStatus API 报告健康状态。ECS 集成时与 ECS 的任务健康检查联动,通常无需额外健康检查设置。 要拓展网络设计知识,可参考Amazon 的专业书籍。
App Mesh 联动与费用
AWS App Mesh (服务网格) 使用 Cloud Map 作为服务发现后端。将 App Mesh 的虚拟服务关联 Cloud Map 的服务后,Envoy 代理自动从 Cloud Map 获取端点,应用流量路由、重试、断路器等网格功能。EKS 环境中,使用 AWS Cloud Map Controller for Kubernetes 可自动同步 Kubernetes 的 Service 资源与 Cloud Map。费用为每个命名空间 0.10 USD/月,每 1,000 次实例注册 0.10 USD,DiscoverInstances API 每 100 万查询 1.00 USD。DNS 查询适用 Route 53 费用 (每 100 万查询 0.40 USD)。中小规模微服务环境月费仅数美元。
总结 - Cloud Map 的活用指南
AWS Cloud Map 是集中管理微服务端点的服务发现服务。基于 DNS 和基于 API 的两种发现方式、与 ECS 的原生集成、健康检查自动排除异常实例是其主要优势。ECS 运行微服务时,用 Cloud Map 替代 ALB 进行服务间通信,可实现成本削减和延迟降低。