Cloud Endpoints 架构概览

Endpoints 是一个由多种服务、运行时环境和工具组成的分布式 API 管理系统,可提供管理、监控和身份验证功能。

Endpoints 包含以下组件:

  • Extensible Service Proxy (ESP) 或 Extensible Service Proxy V2 (ESPv2) - 用于引入 Endpoints 功能。

  • Service Control - 用于应用 API 管理规则。

  • Service Management - 用于配置 API 管理规则。

  • Cloud SDK - 用于进行部署和管理。

  • Google Cloud Console - 用于提供日志记录、监控和共享功能

Endpoints 架构

Endpoints 架构

Endpoints 组件

ESP

ESP 是一种基于 NGINX 的代理,它在后端的前面运行,并引入身份验证、监控和日志记录等 Endpoints 功能。ESP 会从 Service Management 中检索服务配置,并使用该配置来验证传入的请求。

ESP 可以部署在容器化环境中,用于验证 JWT 和 Google ID 令牌。它利用频繁缓存和异步调用等多种方法来确保轻量级和高性能。

ESP 支持适用于以下平台:

ESPv2

ESPv2 是一种基于 Envoy 的可扩缩高性能代理,它在 OpenAPI 或 gRPC API 后端的前面运行。使用 ESPv2 的 Endpoints 支持 OpenAPI 规范和 gRPC 规范的第 2 版。

ESPv2 与 Google Service Infrastructure 集成,可大规模实现 API 管理功能,包括身份验证、遥测报告、指标和安全。

ESPv2 支持适用于以下平台:

Service Control

Service Control 会在运行时应用 API 管理规则,例如密钥身份验证、监控和日志记录。Service Control 提供以下方法:

  • 检查 - 核查身份验证和 API 密钥,并指示是否应允许调用

  • 报告 - 将日志记录和监控记录报告给系统

Service Management

您需要在 YAML 文件(称为 Endpoints 配置)中描述 gRPC 服务的行为。您可以使用用于配置 API 管理规则的 Cloud SDK 将 Endpoints 配置和已编译的 .proto 文件部署到 Service Management。其他与配置相关的任务也在此处进行,例如与其他开发者共享 API、在不同项目中启用或停用 API 以及生成 API 密钥。

Cloud SDK

Cloud SDK 提供了 gcloud 命令行工具,可使用该工具调用各种 Google Cloud 服务。您可以使用 gcloud 命令行工具将 Endpoints 配置部署到 Service Management。

Google Cloud Console

Cloud Console 是 Google Cloud 的图形界面。Endpoints 使用 Cloud Console 显示从 ESP 或 ESPv2 发送并由 Service Control 记录的监控和日志记录数据,与其他开发者共享 API,并且其他开发者可以使用 Cloud Console 生成 API 密钥以调用 API。

部署场景

部署选项取决于将 ESP 或 ESPv2 用作 Endpoints 代理的方式。ESPv2 可部署为远程代理,ESPv2 和 ESP 均可部署为 Sidecar 模式,如以下部分所述。

远程代理模式

如果使用 ESPv2,则可将 Endpoints 部署为远程代理。此模式用于支持在无服务器平台(例如 Cloud Run、Cloud Functions 和 App Engine 标准环境)上运行的应用。

在此模式下,ESPv2 部署为 Cloud Run 应用。您使用 OpenAPI 服务配置中的 x-google-backend 字段将该应用配置为将 ESPv2 用作远程后端。在此部署模式下用作远程代理时,单个 ESPv2 可以支持多个远程后端。

如需了解详情,请参阅配置 Endpoints

Sidecar 模式

ESP 和 ESPv2 均支持与后端的每个实例一起部署到容器中。这种服务器-本地拓扑结构非常适合面向 Web 的 API 以及微服务。它不但可以避免通常与集中式代理关联的网络跃点,而且还可让 API 管理功能保持出色的性能和可扩缩性。

通常情况下,流量在到达 ESP 或 ESPv2 之前已经过负载平衡。在 Compute Engine 上,负载平衡通过 Cloud Load Balancing 实现。对于 Kubernetes 部署,您可以使用入站代理实现负载平衡。在 Google Kubernetes Engine 中,您可以使用 Cloud Load Balancing 或入站代理实现负载平衡。

ESP 或 ESPv2 启动时会从 Service Management 中获取其服务配置。该服务配置是根据 OpenAPI 规范或 gRPC(服务配置 YAML 文件)生成的,它会告知 ESP 或 ESPv2 需管理的 API 的表面以及相关政策,例如哪些方法要求进行身份验证,哪些方法要求使用 API 密钥。

请求路由

ESP 或 ESPv2 收到请求后会为 Cloud Trace 创建跟踪令牌。

接下来,ESP 或 ESPv2 会将传入请求的路径与 API 的表面进行匹配。找到匹配路由后,ESP 或 ESPv2 会为指定的方法执行必要的身份验证步骤。

如果需要进行 JWT 验证,ESP 或 ESPv2 会使用相应的签名者公钥核查身份验证,并验证 JWT 中的目标对象字段。如果需要 API 密钥,ESP 或 ESPv2 会调用 Service Control API 来验证密钥。

Service Control 会查找密钥以对其进行验证,并确保与密钥关联的项目已启用 API。如果密钥无效或项目未启用 API,则调用会被拒绝并且 Service Control API 会记录该调用。

如果 Service Control 成功验证密钥,则请求将与所有原始标头和一个 JWT 验证标头(如果适用)一起转发到后端。

从后端收到响应后,ESP 或 ESPv2 会将该响应返回给调用者,并将最终的耗时信息发送到 Trace。Service Control API 会记录这些调用点,并将指标和日志写入其相应的目标。

Kubernetes 上的 ESP 或 ESPv2

下图显示了 ESP 作为 Sidecar 容器在 API 服务应用容器前运行的整体架构,其中 my-api API 托管在 my-api.com 中并由一项 Kubernetes 服务提供支持。使用 ESPv2 的 Sidecar 部署的架构与此相同。

Kubernetes 上的 Endpoints 概览

后续步骤