部署高度可扩展的 GraphQL 解决方案

此参考架构演示了如何部署基于 GraphQL 的解决方案,可以轻松扩展以满足负载需求。

GraphQL 是 API 的开源数据查询和处理语言,是一个使用现有数据执行查询的运行时,是显式定义所需属性的移动应用程序等实施的理想组件。它提供了客户端可能需要请求相关实体间数据以优化请求和响应流的 API,例如将移动应用的移动网络流量降至最低。GraphQL 还提供了一种有效方法来帮助 API 使用者从后端解决方案中抽象如何实施后端解决方案,方法是提供一个方案来涵盖许多不同的后端服务。

体系结构

此体系结构为静态和动态 API 内容定义了不同的路由。通过在多个层配置高速缓存选项(包括使用内容传送网络 (Content Delivery Network,CDN)、负载平衡器以及加载和服务内容的后端服务),此方法可以更轻松地优化对静态内容的访问。

后端服务在此体系结构中通过微服务实现。这些服务还可以通过开源 CMS 选项部署 CMS 解决方案,例如 Oracle Content and Experience。由于内容是静态的,因此安全风险较低。

API 内容通过 API 网关进行路由,因此可以验证和控制 API 请求(例如,速率受限)。然后,流量将发送到 Oracle Kubernetes 引擎负载平衡器,该负载平衡器是进入集群的入站点,将流量定向到 GraphQL 服务器。理想情况下,如果使用微服务来处理静态内容,则支持 GraphQL 的服务以及静态内容保存在单独的名称空间中,以增强隔离和控制。

此实现采用开源 Apollo GraphQL 服务器来接收调用并分解工作,以分隔承载解析程序和变异程序逻辑的微服务。您可以使用单独的服务在数据模型中实施不同的子域,从而更高效地扩展实施。因此,使用任何内存中高速缓存来优化解决方案更容易。

下图说明了此引用体系结构。

后面是 deploy-hs-graphql.png 的说明
插图 deploy-hs-graphql.png 的说明

deploy-hs-graphql.zip

有关体系结构(包括示例服务)的代码和文档位于相关的 GitHub 存储库中(请参见下面的“部署”主题)。API 路由针对每个子域使用 Apollo GraphQL 服务器和 Python 服务。提供的 GitHub 文档中包括了更多详细信息。

此体系结构包含以下组成部分:
  • 租户

    租户涵盖正在使用的所有区域。为了实现优化的性能和可恢复性,您希望在世界各地的多个不同的区域中复制部署,并组合使用公共 DNS 路由,这样客户可以转到最近的区域来尽可能地减少延迟。这需要在区域之间复制后端数据。

  • 区域

    Oracle Cloud Infrastructure 区域是一个局部地理区域,其中包含一个或多个数据中心,称为可用性域。区域独立于其他区域,而广阔的距离可以分离它们(跨国家甚至大陆)。

  • 区间

    区间是 Oracle Cloud Infrastructure 租户中的跨区域逻辑分区。使用区间在 Oracle Cloud 中组织资源,控制对资源的访问并设置使用限额。要控制对给定区间中资源的访问,您需要定义策略来指定谁可以访问资源以及他们可以执行的操作。可以添加此体系结构的区间控件来分隔公共访问层和后端,从而最大限度地降低意外创建安全层的直接路径的风险。

  • 可用性域

    可用性域是一个区域中的独立数据中心。每个可用性域中的物理资源都与其他可用性域中的资源隔离,因而具备容错能力。可用性域不共享电源、冷却设备或内部可用性域网络等基础设施。因此,一个可用性域出现故障不会影响区域中的其他可用性域。在此参考架构中,Kubernetes worker 节点分布在容错域和可用性域之间,以确保高度的可恢复性。

  • 容错域

    故障域是可用性域内一组硬件和基础设施。每个可用性域都有三个具有独立电源和硬件的容错域。在多个容错域之间分配资源时,您的应用可以承受容错域中的物理服务器故障、系统维护和电源故障。

  • 虚拟云网络 (VCN) 和子网

    VCN 是可在 Oracle Cloud Infrastructure 区域中设置的可定制的软件定义网络。与传统的数据中心网络一样,VCN 允许您完全控制您的网络环境。VCN 可以具有多个不可重叠的 CIDR 块,您可以在创建 VCN 后更改这些块。您可以将 VCN 分段到子网,这些子网可以限定到区域或可用性域。每个子网包含一个连续的地址范围,这些地址与 VCN 中的其他子网不重叠。您可以在创建子网后更改其大小。子网可以是公共子网,也可以是专用子网。

  • 负载平衡器

    Oracle Cloud Infrastructure Load Balancing 服务提供从单个入口点到后端多个服务器的自动流量分配。在此参考架构中,负载平衡器将包括路由策略,以便将定向到 API 网关的流量与动态数据以及静态内容(例如图像、Web 页等)的流量区分开。然后,这可以使用负载平衡器的 Web 应用程序加速 (WAA) 功能。

  • 安全列表

    对于每个子网,您可以创建安全规则来指定必须允许传入和传出子网的通信的源、目标和类型。

  • NAT 网关

    NAT 网关允许 VCN 中的专用资源访问互联网上的主机,同时不会向传入的互联网连接公开这些资源。

  • 服务网关

    通过服务网关,可以从 VCN 访问其他服务,例如 Oracle Cloud Infrastructure Object Storage。从 VCN 到 Oracle 服务的流量通过 Oracle 网络结构传输,永远不会经过互联网。

  • Cloud Guard

    您可以使用 Oracle Cloud Guard 监视和维护 Oracle Cloud Infrastructure 中资源的安全。Cloud Guard 使用检测器配方,您可以定义这些配方来检查资源是否存在安全漏洞,以及监视操作员和用户是否有风险活动。检测到任何错误配置或不安全活动时,Cloud Guard 将根据您可以定义的响应器配方建议更正操作并协助执行这些操作。

  • 安全区域

    安全区域一开始就确保 Oracle 的安全最佳做法,强制实施加密数据等策略并防止对整个区间的网络进行公共访问。安全区域与同名的区间关联,并包括安全区域策略或应用于区间及其子区间的“配方”。无法将标准区间添加或移动到安全区域区间。

  • 自治数据库

    Oracle Cloud Infrastructure 自治数据库是完全托管的预配置数据库环境,可用于事务处理和数据仓库负载。您不需要配置和管理任何硬件,也不需要安装任何软件。Oracle Cloud Infrastructure 负责创建数据库以及备份、打补丁、升级和优化数据库。

  • Container Engine for Kubernetes

    Oracle Cloud Infrastructure Container Engine for Kubernetes 是一款完全托管、可扩展且高度可用的服务,可用于将容器化应用部署到云端。您可以指定应用所需的计算资源,Container Engine for Kubernetes 将其预配在现有租户的 Oracle Cloud Infrastructure 上。Container Engine for Kubernetes 使用 Kubernetes 自动在主机集群中部署、扩展和管理容器化应用。Kubernetes 集群会将节点分配给不同的 Vault 区域和可用性区域,以最大程度地提高可恢复性和可用性。Kubernetes 集群最好具有 Istio 或其他服务网格功能来管理和监视微服务。GraphQL 服务将存在于其自己的云池中,各种解析器和变异器将作为自己的微服务部署到 Kubernetes 集群中。

  • 注册表

    Oracle Cloud Infrastructure Registry 是一个由 Oracle 管理的注册表,可用于简化开发到生产的工作流。通过该注册表,您可以轻松地存储、共享和管理开发构件,例如 Docker 映像。Oracle Cloud Infrastructure 的高可用性和可扩展性架构可确保您能够可靠地部署和管理应用。

建议

使用以下建议作为起点。您的要求可能不同于此处描述的体系结构。
  • VCN

    创建 VCN 时,根据计划连接到 VCN 中的子网的资源数量,确定所需的 CIDR 块数和每个块的大小。使用标准专用 IP 地址空间内的 CIDR 块。

    选择与要设置专用连接的任何其他网络(在 Oracle Cloud Infrastructure、您的内部部署数据中心或其他云提供商)不重叠的 CIDR 块。

    创建 VCN 后,您可以更改、添加和删除其 CIDR 块。

    设计子网时,请考虑流量和安全性要求。将特定层或角色中的所有资源连接到可以用作安全边界的同一子网。

  • 安全性

    使用 Oracle Cloud Guard 主动监视和维护 Oracle Cloud Infrastructure 中资源的安全。Cloud Guard 使用检测器配方,您可以定义这些配方来检查资源是否存在安全漏洞,以及监视操作员和用户是否有风险活动。检测到任何错误配置或不安全活动时,Cloud Guard 将根据您可以定义的响应器配方建议更正操作并协助执行这些操作。对于需要最大安全性的资源,Oracle 建议您使用安全区域。安全区域是与 Oracle 定义的基于优秀实践的安全策略配方关联的区间。例如,安全区域中的资源不能从公共 Internet 访问,必须使用客户管理的密钥对其进行加密。在安全区域中创建和更新资源时,Oracle Cloud Infrastructure 将根据安全区域配方中的策略验证操作,并拒绝违反任何策略的操作。

  • Cloud Guard

    克隆和定制 Oracle 提供的默认配方以创建定制检测器和响应器配方。通过这些配方,您可以指定哪些类型的安全违规会生成警告,以及允许对它们执行哪些操作。例如,您可能需要检测将可见性设置为公共的对象存储桶。在租户级别应用 Cloud Guard,以涵盖范围最广并降低维护多个配置的管理负担。您还可以使用托管列表功能将某些配置应用于检测器。

  • 网络安全组 (NSG)

    您可以使用 NSG 定义一组适用于特定 VNIC 的入站和出站规则。我们建议使用 NSG 而非安全列表,因为 NSG 允许您将 VCN 的子网体系结构与应用的安全要求区分开来。

    您可以使用 NSG 定义一组适用于特定 VNIC 的入站和出站规则。我们建议使用 NSG 而非安全列表,因为 NSG 允许您将 VCN 的子网体系结构与应用的安全要求区分开来。

  • 负载平衡器带宽

    创建负载平衡器时,您可以选择提供固定带宽的预定义配置,也可以指定在其中设置带宽范围的定制(灵活)配置,并让服务根据流量模式自动缩放带宽。通过任一方法,您可以在创建负载平衡器后随时更改配置。

  • API 网关
    API 网关可用于提供初始级别的筛选和使用控制,例如:
    • 服务验证和授权
    • 服务控制,如速率限制
    • 获取服务使用分析
    此外,API 网关(而非防火墙或负载平衡器)应执行可识别解决方案的路由,因此未满足 GraphQL 功能的任何端点都可定向到正确的位置。因此,应根据后端解决方案支持的最大性能功能以及任何一个服务用户的峰值权利,考虑采用合理的费率限制。

考虑事项

部署此引用体系结构时,请考虑以下几点。

  • 性能

    此体系结构将提供一种方法来构建垂直和水平性能的容量。即使是最优化的微服务,也存在引入新节点的滞后时间,因此在手动或动态处理扩展时也需要允许这样做。对于任何解决方案的持久性层来说,情况尤其如此。

  • 安全性

    您应该在 API 网关中解决应用级别的安全性问题。但是,您可以通过使用 GraphQL 指令(例如 @auth)解决特定于 GraphQL 的细粒度安全性(例如,属性级别访问)。

  • 可用性
    • Kubernetes

      容错域可以在可用性域中提供恢复能力。您可以配置 Kubernetes worker 节点以跨不同的可用性区域进行部署。

    • API 网关、负载平衡器等

      托管服务(例如 API 网关)可以在区域内处理可用性。您可以配置负载平衡器以确保可用性区域之间的协调。

    如果需要,您可以通过采用多区域部署模型进一步提高可用性,尽管这确实会增加复杂性和协调性。
  • 成本

    所需的可用性和可恢复性越高,运营成本越高。这是因为所需数量的冗余计算资源不断增长。考虑您将使用的 GraphQL 实现,以及实施哪些(如果有)许可约束以及提供商是否支持该实施。

部署

按照 Oracle DevRel Github 系统信息库中的说明手动部署此体系结构。将容器映像加载到注册表中并部署 Kubernetes 是一个手动过程,您也可以按照 GitHub 文档中包含的实施详细信息中介绍的过程进行操作。

确认

作者:Phil Wilkins