你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

将内部 API 发布给外部用户

Azure API 管理
Azure 应用程序网关
Azure DevOps
Azure Monitor
Azure 虚拟网络

在此场景中,组织使用虚拟网络内部署的 Azure API 管理在内部合并多个 API。

体系结构

体系结构图显示了外部用户使用的内部 API 的完整生命周期。

下载此体系结构的 Visio 文件

上图介绍了外部用户使用的内部 API 的完整生命周期。

数据流

数据流如下所示:

  1. 开发人员将代码签入到连接到 Azure VM 上安装的 CI/CD 管道的 GitHub 存储库代理。
  2. 该代理将生成推送到托管在 ILB ASE 上的 API 应用程序。
  3. Azure API 管理通过 API 管理策略中指定的主机头使用上述 API。
  4. API 管理对所有 API 使用应用服务环境的 DNS 名称。
  5. 应用程序网关公开 API 管理的开发人员和 API 门户。
  6. Azure 专用 DNS 用于在 ASE、API 管理和应用程序网关之间内部路由流量。
  7. 外部用户通过应用程序网关的公共 IP 来利用公开的开发人员门户使用 API。

组件

  • 通过 Azure 虚拟网络,Azure 资源能够以安全方式彼此通信、与 Internet 通信以及与本地网络通信。
  • Azure 专用 DNS 允许在虚拟网络中解析域名,无需添加自定义 DNS 解决方案。
  • Azure API 管理可帮助组织将 API 发布给外部、合作伙伴和内部开发人员,以使用他们的数据和服务。
  • 应用程序网关是一种 Web 流量负载均衡器,可用于管理 Web 应用程序的流量。
  • 内部负载均衡器应用服务环境是一项 Azure 应用服务功能,可提供完全隔离和专用的环境,以便高度安全地运行应用服务应用。
  • Azure DevOps 是用于管理开发生命周期的服务,包括用于规划和项目管理、代码管理、生成和发布的功能。
  • Application Insights 是多个平台上面向 Web 开发人员的可扩展应用程序性能管理 (APM) 服务。
  • Azure Cosmos DB 是 Microsoft 提供的全球分布式多模型数据库服务。

备选方法

方案详细信息

在此方案中,组织使用 Azure 应用程序服务环境 (ILB ASE) 托管多个 API,并且想要通过使用部署在虚拟网络中的 Azure API 管理 (APIM) 在内部整合这些 API。 内部 API 管理实例还可以向外部用户公开,以允许充分利用 Api 的全部潜能。 通过使用 Azure 应用程序网关将请求转发到内部 API 管理服务可以实现这种外部公开,而内部 API 管理服务又会使用 ASE 中部署的 API。

  • Web API 托管在受保护的 HTTPS 协议上,并将使用 TLS 证书
  • 此外,还在端口 443 上配置应用程序网关,用于进行安全、可靠的出站调用。
  • API 管理服务配置为使用 TLS 证书的自定义域。
  • 查看应用服务环境的建议网络配置
  • 需要明确提及端口 3443 允许 API 管理通过 Azure 门户或 PowerShell 进行管理。
  • 利用 APIM 中的策略为 ASE 上托管的 API 添加主机标头。 这可确保 ASE 的负载均衡器会正确地转发请求。
  • API 管理为应用服务环境中托管的所有应用接受 ASE 的 DNS 条目。 添加 APIM 策略来显式设置主机头,以允许 ASE 负载平衡器区分应用服务环境下的应用。
  • 考虑与 Azure Application Insights 集成,这样还可以通过 Azure Monitor 公开指标用于监视。
  • 如果使用 CI/CD 管道来部署内部 API,请考虑在虚拟网络中的 VM 上构建自己的托管代理

可能的用例

  • 在客户进行更改后,在内部同步客户地址信息。
  • 通过公开唯一数据资产吸引开发人员使用平台。

注意事项

这些注意事项实施 Azure 架构良好的框架的支柱原则,即一套可用于改善工作负载质量的指导原则。 有关详细信息,请参阅 Microsoft Azure 架构良好的框架

可靠性

可靠性可确保应用程序符合你对客户的承诺。 有关详细信息,请参阅可靠性支柱概述

可用性

可以将 Azure API 管理服务部署为多区域部署,以实现更高的可用性并减少延迟。 仅在“高级”模式下提供此功能。 在此特定方案中,API 管理服务将从应用服务环境中使用 API。 还可以将 APIM 用于内部本地基础结构上托管的 API。

应用服务环境可利用流量管理器配置文件来分发在应用服务环境中托管的流量,以实现更高的规模和可用性。

复原

此示例方案介绍了有关配置的详细信息,在应用服务环境中托管的 API 应该具有足够的复原力,以处理请求中的错误,最终这些错误由 API 管理服务和应用程序网关进行管理。 在 API 设计中考虑重试和断路器模式。 若需可复原解决方案的通用设计指南,请参阅设计适用于 Azure 的可复原应用程序

安全性

安全性针对蓄意攻击及滥用宝贵数据和系统提供保障措施。 有关详细信息,请参阅安全性支柱概述

由于上述示例方案完全托管在内部网络上,因此 API 管理和 ASE 已经部署在安全基础结构 (Azure VNet) 上。 可以将应用程序网关与 Microsoft Defender for Cloud 集成,提供一种无缝的方式来阻止、检测和响应环境中的威胁。 有关设计安全解决方案的通用指导,请参阅 Azure 安全性文档

成本优化

成本优化是关于寻找减少不必要的费用和提高运营效率的方法。 有关详细信息,请参阅成本优化支柱概述

以下四个层中提供了 API 管理:开发人员、基本、标准和高级。 在 Azure API 管理定价指导中,可以找到有关这些层的差异的详细指导。

客户可通过添加和删除单元来缩放 API 管理。 每个单元的容量取决于其所在的层。

注意

可以使用开发人员层来评估 API 管理功能。 不应将开发人员层用于生产。

若要查看预计成本并根据部署需求进行自定义,可在 Azure 定价计算器中修改缩放单元和应用服务实例的数目。

同样,你可以找到应用服务环境定价指导

可以配置应用程序网关定价,具体取决于所需的层和资源。

性能效率

性能效率是指工作负载能够以高效的方式扩展以满足用户对它的需求。 有关详细信息,请参阅性能效率要素概述

可伸缩性

可以根据多个因素横向扩展 API 管理实例,例如并发连接的数量和速率、配置策略的类型和数量、请求和响应大小以及 API 的后端延迟。 横向扩展实例选项在基本层、标准层和高级层中可用,但在基本层和标准层中受扩展上限的限制。 实例被称为单位,可以在基本层中纵向扩展到两个单位,在标准层中最多四个,在高级层可到任意数量。 还可以使用自动缩放选项根据规则启用横向扩展。

应用服务环境旨在根据定价层限制进行缩放。 可以配置应用服务环境下托管的应用来横向扩展(实例数)或纵向扩展(实例大小),具体取决于应用程序的要求。

在所有全球 Azure 区域中,Azure 应用程序网关自动缩放作为区域冗余 SKU 的一部分提供。 请参阅公共预览功能,了解应用网关自动缩放。

部署此方案

前提条件和假设

  1. 需要购买自定义域名。
  2. 需要为所有自定义域使用 TLS 证书(使用 Azure 证书服务中的通配符证书)。 你还可以购买用于开发测试方案的自签名证书。
  3. 此特定部署为域使用域名 contoso.org 和通配符 TLS 证书。
  4. 部署使用“部署”部分中提到的资源名称和地址空间。 可以配置资源名称和地址空间。

部署并将它们放在一起

部署到 Azure

需要进一步配置使用上述资源管理器模板部署的组件,如下所示:

  1. VNet 具有以下配置:

    • 名称:ase-internal-vnet
    • VNet 的地址空间:10.0.0.0/16
    • 四个子网
      • DNS 服务 backendSubnet:10.0.0.0/24
      • 内部 API 管理服务 apimsubnet:10.0.1.0/28
      • ILB ASE asesubnet:10.0.2.0/24
      • 测试 VM 和内部 DevOps 托管代理 VM 的 VMSubnet:10.0.3.0/24
  2. 专用 DNS 服务(公共预览版),因为添加 DNS 服务要求 VNet 为空。

  3. 具有内部负载均衡器 (ILB) 选项的应用服务环境:aseinternal(DNS:aseinternal.contoso.org)。 部署完成后,上传 ILB 的通配符证书

  4. 以 ASE 作为位置的应用服务计划

  5. API 应用(简洁的应用服务) - srasprest(URL: https://srasprest.contoso.org) – ASP.NET 基于 MVC 的 web API。 部署后,配置:

    • 使用 TLS 证书的 web 应用
    • 上述应用的 Application Insights:api-insights
    • 为在 VNet 内部托管的 Web API 创建 Azure Cosmos DB 服务:noderestapidb
    • 在创建的专用 DNS 区域上创建 DNS 条目
    • 可以使用 Azure Pipelines 在虚拟机上配置代理,以在内部网络上部署 Web 应用的代码
    • 若要在内部测试 API 应用,请在 VNet 子网中创建测试 VM
  6. 创建 API 管理服务:apim-internal

  7. 将服务配置为连接到子网上的内部 VNet:apimsubnet。 部署完成后,请执行以下附加步骤:

    • 使用 TLS 为 APIM 服务配置自定义域
      • API 门户 (api.contoso.org)
      • 开发人员门户 (portal.contoso.org)
      • 在 API 部分中,使用 ASE 的 DNS 名称配置 ASE 应用,为 Web 应用添加主机标头策略
      • 使用上面创建的测试 VM 在虚拟网络内部测试 API 管理服务

    注意

    从 Azure 门户测试 APIM API 仍然无法工作,因为 api.contoso.org 无法公开解析。*

  8. 配置应用程序网关 (WAF V1) 以访问 API 服务:端口 80 上的 apim-gateway。 将 TLS 证书添加到应用程序网关以及相应的运行状况探测和 http 设置。 此外,将规则和侦听器配置为使用 TLS 证书。

成功完成上述步骤后,请使用应用程序网关的公共 DNS 名称在 api.contoso.org 和 portal.contoso.org 的 Web 注册机构 CNAME 条目中配置 DNS 条目:ase-appgtwy.westus.cloudapp.azure.com。 验证是否能够从公共访问开发门户,以及是否能够使用 Azure 门户测试 APIM 服务 API。

注意

对于 APIM 服务的内部和外部终结点,使用相同的 URL 不是一个好的做法(目前在上面的演示中,两个 URL 是相同的)。 如果为内部和外部终结点选择不同的 URL,可以使用支持 http 重定向及其他功能的应用程序网关 WAF v2。

作者

本文由 Microsoft 维护, 最初由以下参与者撰写。

主要作者:

其他参与者:

若要查看非公开的 LinkedIn 个人资料,请登录到 LinkedIn。

后续步骤

使用 Azure API 管理迁移 Web 应用