模式概览

将您的 Web 或移动应用构建为一组微服务,这些微服务可以由不同的应用团队独立测试、部署和拥有。将服务公开为 REST API,并使用 API 与其他微服务进行通信。

对于 Web 或移动应用,最重要的要求是:

  • 它必须支持一系列客户端,例如浏览器和移动设备
  • 它必须安全
  • 它必须提供 24/7/365 的可用性
  • 它必须扩展以应对需求峰值
  • 它必须处理低网络延迟
  • 更新或修改时,其停机时间必须为零

Oracle Cloud Infrastructure (OCI) 为高要求的 Web 和移动应用提供可扩展、安全、可靠、高性能的基础设施。本文档介绍了用于构建 Web 或移动应用程序的设计原则,以及基于这些原则的参考架构。

设计原则

使用轻量级开源框架和成熟的编程语言

使用 Graal Development Kit for Micronaut 或 Helidon 构建应用。两者都提供了日志记录、遥测、安全性和配置等功能,以及构建 REST API 等常见模式。

使用 Java:一种独立于平台的便携式语言,其中包含一组丰富的库,数百万开发人员使用这些库来构建可扩展、可恢复且安全的应用。

构建使用 API 进行通信的应用即服务

将您的应用构建为一组微服务,这些微服务可以由不同的应用团队独立测试、部署和拥有。公开服务以及定义良好的 REST API,并使用这些 API 与其他服务进行通信。将 OCI API Gateway 用作所有客户端的单点入口,然后将 API 请求路由到相应的服务。

使用 OCI 服务网格简化并保护 Oracle Container Engine for Kubernetes (OKE) 集群中托管的服务之间的通信。OCI Service Mesh 还允许您通过代理组件发出的指标和日志来观察服务之间的所有网络流量,这些指标和日志以 sidecar 形式在应用云池上运行。

自动化构建、测试和部署

频繁交付代码,然后以尽可能减少停机时间的方式部署应用。使用 OCI DevOps 建立一致的自动化方法来开发、构建、打包、测试和部署应用。使用 Oracle Cloud Infrastructure Resource Manager 可可靠地预配基础设施元素,例如 API 网关、负载平衡器、数据库、Kubernetes 集群和其他服务。

使用完全托管的服务消除应用开发、运行时和数据管理的复杂性

使用全托管式服务,例如 Oracle Container Engine for Kubernetes (OKE)、Oracle Cloud Infrastructure Object StorageOracle Autonomous Database :这些服务可最大限度地提高可用性和可扩展性,满足不断变化的应用需求。完全托管的服务可确保应用可用性,并在托管应用基础设施的数据中心发生故障时提供保护。

使应用程序层保持无状态

尽可能保持应用的中间层组件无状态。如有必要,请使用 Oracle Autonomous Database 存储应用程序状态,以实现一致性、持久性和快速可恢复性。

在所有数据中使用具有完整功能支持的融合数据库

您的应用可能会使用多种格式的数据,例如表格(关系)、非结构化、XML、JSON、空间或图形。传统上,这种数据格式需要不同类型的数据库,例如关系数据的关系数据库、非结构化数据的文档存储或分层链接数据的图形数据库。但是,使用多个数据库通常会增加运营复杂性和数据不一致性。而是使用单个多模型 Oracle Autonomous Database 来存储、索引和搜索多种类型和格式的数据。

仪器端对端监控和跟踪

开发团队开发自己的可观察性工具以了解他们拥有的服务和应用程序,这很有诱惑力。您的应用可能包含数百项服务,由不同的应用和业务团队拥有。而不是每个团队构建自己的工具,而是使用 Oracle Cloud Observability and Management Platform 集中管理解决方案:它监视整个堆栈的所有层,以查找和修复应用程序中的问题。

通过自动数据复制和故障恢复消除单点故障

您的应用必须具有弹性,从故障中恢复,并尽可能减少停机和数据丢失。通过以下方式实现冗余,消除单点故障:

  • 在 OKE 中,在多可用性域区域中,设置至少包含三个节点的节点池,每个节点位于单独的可用性域中。
  • 在单个可用性域区域中,在 OKE 中设置至少三个节点的节点池,每个节点位于单独的容错域中。
  • 使用单个公共负载平衡器和多个具有多个入站控制器的专用负载平衡器在 OKE 中实现冗余。
  • 设计一个先导灾难恢复拓扑,以便在发生灾难时将应用托管在主区域,从而在备用区域中快速重新启动应用和恢复负载。
  • 配置 CI/CD 管道,将应用部署到备用区域以从区域故障中恢复。
  • 使用块存储卷复制和对象存储复制跨区域复制块存储卷。
  • 如果主区域发生故障,请使用 Oracle Cloud Infrastructure Resource Manager 在备用区域中预配所需的基础设施。
  • 使用 Autonomous Data Guard 设置 Oracle Autonomous Database 以实现最高可用性,从而尽可能减少运营停机和数据丢失。

此外,测试弹性,以查看应用程序在间歇性发生的异常情况下的行为。例如,您可以采用 Chaos Monkey 框架进行混沌测试。还可以使用节流、断路器和重试机制来实现弹性应用程序。

实施深度防御方法来保护应用生命周期

您应该设计具有足够安全性的应用程序,以防范恶意实体的攻击。查看您的应用、客户端代码和第三方代码以检查可疑行为。使用过滤规则并使用 Web 应用防火墙 (Web Application Firewall,WAF) 设置 DDoS 保护,以保护您的应用免受不需要的流量影响。

Oracle Cloud Infrastructure Vault 中存储敏感信息,例如密码和身份验证/授权令牌。在 etcd 中设置 Kubernetes 密钥的加密。在您的应用使用的证书上轮换和设置短生命周期,使攻击者更难模拟可信的实体。

按照最小权限原则,确保用户和服务账户只有执行其任务所需的最小权限。使用 Oracle Cloud Infrastructure Identity and Access Management (IAM) 控制谁可以访问您的应用及其组件。在 IAM 中使用多因素身份验证对管理员实施强身份验证,以限制对应用程序及其组件的访问。

体系结构

对于由部署为 OKE 上 Kubernetes 集群中的容器的微服务组成的 Web 或移动应用程序,建议使用此体系结构模式。数据持久性是通过 Oracle Autonomous Database 实现的。应用程序的媒体和图像文件存储在对象存储中。

下图说明了此体系结构。



architecture-maf-web-mobile-oracle.zip(体系结构 -maf-web-mobile-oracle.zip)

该体系结构具有以下组成部分:

  • Web Application Firewall (WAF)

    WAF 可保护应用免受恶意和不需要的互联网流量攻击。它可以保护任何面向互联网的端点,并在所有应用中提供一致的规则实施。

  • Oracle Cloud Infrastructure API 网关

    OCI API 网关是一种完全托管的区域 API 网关服务,可为 OKE 以及 Oracle Cloud Infrastructure 上运行的任何其他服务或端点提供受保护的 RESTful API 端点。在此体系结构中,请求将路由到专用负载平衡器,该负载平衡器会将请求转发到在 OKE 中运行的服务。

  • Oracle Cloud Infrastructure Identity and Access Management (OCI IAM)

    OCI IAM 提供强大的多因素身份验证、社交登录、面向最终用户的自我注册、身份管理、单点登录和应用身份治理。

  • Load balancer

    负载平衡服务提供从单个入口点到可从虚拟云网络访问的多个服务器的自动流量分配,例如体系结构中容器化微服务的 OKE 节点

  • Oracle Autonomous Database

    Oracle Autonomous Database 是一个完全托管的数据库环境,可弹性扩展,提供快速查询性能,并且不需要数据库管理。您不需要配置或管理任何硬件,也不需要安装任何软件。

  • Object storage

    通过对象存储,可以快速访问任意内容类型的大量结构化和非结构化数据,包括数据库备份、分析数据以及图像和视频等丰富内容。将标准存储用于需要快速、立即和频繁访问的热存储。将归档存储用于长期保留的冷存储,很少或很少访问。

    在此架构中,应用的媒体资产存储在对象存储中,存储在标准存储类的存储桶中。

  • 适用于 Kubernetes 的容器引擎 (OKE)

    OKE 是一种完全托管、可扩展的高可用性服务,用于将容器化应用部署到云。您可以指定应用所需的计算资源,OKE 在现有租户中的 OCI 上预配这些资源。容器引擎使用 Kubernetes 跨主机集群自动部署、扩展和管理容器化应用。

  • Service mesh

    Oracle Cloud Infrastructure (OCI) Service Mesh 是 OCI 管理的应用基础设施层,用于服务到服务通信。它通过定义观测、安全性和流量管理标准来简化云原生应用的开发和部署。服务网格作为一系列轻量级代理实现,这些代理与应用程序代码一起部署在客户的云池中,而无需应用程序了解它们。

替代方法

使用微服务并不是创建移动应用或 Web 应用的唯一方法。此备用体系结构模式显示由负载平衡器、自动缩放 Web/应用层和高可用性数据库组成的三层拓扑。

所有资源都部署在 OCI 区域中的单个可用性域中。层在单个虚拟云网络 (Virtual Cloud Network,VCN) 中的单独子网中隔离。安全列表充当防火墙,用于控制与每个层中的资源之间的网络流量。连接到每个子网的路由表包含流量定向到 VCN 外部目的地的规则。

可以考虑其他替代体系结构,例如单页体系结构、渐进式 Web 应用程序 (Progressive Web Applications,PWA) 或 JAMStack,但此处未显示。

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



architecture-maf-web-mobile-alternative-oracle.zip(体系结构 -maf-web-mobile- 备用)

用例示例

此用例介绍了一家在线销售 GPU 的商店的客户订购系统。

下表显示了此用例的体系结构。



architecture-maf-web-mobile-example-oracle.zip(体系结构 -maf-web-mobile- 示例 -oracle.zip)

DNS 服务通过 Web 应用防火墙 (Web Application Firewall,WAF) 将来自公共互联网的流量路由到互联网网关,互联网网关通过负载平衡器将传入请求转发到入站 (Nginx) 微服务。该应用由前端服务、订单服务、消息传递服务和库存服务组成。所有这些服务都已容器化并位于 OKE 群集中。其中每个服务都使用 REST API 公开其接口。数据存储在自治数据库中。

客户通过 Web 应用或移动设备上的应用使用前端服务订购 GPU。订单服务和库存服务使用 NATS 开源消息传递服务相互通信。订单服务在订单可插入数据库 (Orders Pluggable Database,PDB) 中读取和写入订单数据。库存服务在库存 PDB 中读取和写入库存数据。订单服务使用通知服务发送通知,以便通过电子邮件或 Slack 向客户通知订单状态。客户可以从前端检索订单状态,前端使用订单服务的 REST API 查找订单。

部署

Universal Health Organization (UHO) 是一款遵循现代应用开发框架原则的示例应用。特别是,它实现了 Web 或移动、消息传递和事件驱动的体系结构模式的元素,并在 GitHub 上提供。
  1. 转至 GitHub
  2. 将系统信息库克隆或下载到本地计算机。
  3. 按照 README 文档中的说明进行操作。

浏览更多

了解有关资源的更多信息。

更改日志

此日志列出了重大更改:

确认

  • Authors :Raghavendra Prasad、Sajan Parihar
  • 贡献者:Hassan Ajan、Matthias Brantner、James Emerson、Harshad Kasture、Parvez Syed Mohamed、Jeff Schering、Joshua Stanley