练习 - 部署 N 层体系结构

已完成

回想一下我们将应用程序从本地迁移到 Azure 的场景。 此体系结构的外观如何? 你的组织有一个非关键应用程序,这是一个不错的候选练习对象。此应用程序旨在解决一个极其常见的问题:午餐吃什么。

想想你最后一次和一群朋友或同事共进午餐。 你是觉得做决定很容易,还是费了很多心思去揣测每个人说“我都喜欢”时的真正含义?我们将根据可帮助解决此问题的三层体系结构来部署应用程序。让我们部署一个基于三层体系结构的应用程序,它可以帮助你解决此问题。 此应用程序允许你提出午餐建议,并且每个人都可以投票选择他们喜爱的选项。

我们为此应用程序创建了一个模板,该模板将每个层级都部署为 Azure 资源,然后部署实际代码。 这是一个部署在 Linux 服务器上的 ASP.NET Core MVC 应用程序,但无论基础 OS 平台或 SDK 如何,都可以使用此体系结构样式。

下面是该模板部署内容的概要可视化效果。

Visualization of the N-tier architecture to be deployed in this unit.

部署 N 层体系结构

  1. 运行以下命令以启动部署。 az deployment group create 命令使用我们指定的模板文件和参数在沙盒资源组中启动部署。 我们还指定从 head /dev/urandom | tr -dc A-Za-z0-9 | head -c 32 命令生成的由 32 个随机字符组成的字符串作为密码参数。

    完成此部署大约需要 5 分钟。

    az deployment group create \
      --resource-group <rgn>[sandbox resource group name]</rgn> \
      --template-uri  https://raw.githubusercontent.com/MicrosoftDocs/mslearn-n-tier-architecture/master/Deployment/azuredeploy.json \
      --parameters password="$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 32)"
    

查看已部署的资源并测试应用程序

完成部署后,测试应用程序。 请运行以下命令,该命令会返回应用的 URL。

az deployment group show \
  --output table \
  --resource-group <rgn>[sandbox resource group name]</rgn> \
  --name azuredeploy \
  --query properties.outputs.webSiteUrl

打开 Web 浏览器并访问该站点。 你会看到一个可以添加食物选项的框。 添加某个选项后,便可选择它投上一票。

Screenshot of the sample voting application.

“午餐吃什么?”的三个层级

这款应用程序设计得很简单。 它很有趣,但仍然演示了三层体系结构。 该模板创建两个虚拟机 (VM)、一个 Azure SQL 数据库以及支持这些资源所需的资源,例如磁盘、NIC 和虚拟网络。 它还部署代码以在每个层级上运行应用程序。 我们部署的虚拟网络有两个子网,一个用于呈现层,另一个用于应用层,以便为每个层级提供一个安全边界。

在部署过程中,我们还向资源应用了标记,以反映资源支持的层级(tier:presentationtier:applicationtier:data)。 标记是一种向 Azure 资源应用元数据的方法,在本例中,它们让我们能够为每个层级轻松筛选资源。

让我们更详细地了解每个层级。 下面是部署资源的详细可视化效果。

Visualization of the N-tier architecture to be deployed in this unit again.

呈现层

运行以下命令以列出呈现层资源。

az resource list --tag tier=presentation --output table

在我们引用的三层体系结构中,这代表了呈现层。 负责 Web 界面的代码部署在此层级上,它呈现 UI 并直接处理用户请求。 此层级只关心如何向用户呈现网站。 它不能直接访问数据,也不包含业务逻辑。

我们部署了一个名为 demo-web-vm 的 Web 服务器,用于运行我们要访问的网站。 该服务器有一个网络接口 demo-web-vm-nic,该接口有一个与之关联的公共 IP 地址 demo-web-vm-nic-pip。 此公共 IP 地址是我们之前检索到的 URL。 它还有一个网络安全组 demo-web-nsg,后者只允许从 Internet 入站的端口 80 (HTTP) 流量通过。 此网络安全组会限制为仅允许访问该网站,并阻止可能被恶意使用的非必要端口的访问。 此层级通过 HTTP 与呈现层通信,以完成用户的请求。

应用层

运行以下命令以列出应用层资源。

az resource list --tag tier=application --output table

我们已将应用层部署在运行业务逻辑的名为 demo-biz-vm 的 VM 上。 它也有一个网络接口 demo-biz-vm-nic,但是这个网络接口只有一个专用 IP 地址,因此不提供与服务器进行直接入站连接的机制。 它还有一个网络安全组 demo-biz-nsg,后者只允许从呈现层的子网进行访问。

此层级是应用程序访问数据的通道。 用于公开呈现层所调用的 API 的代码部署在此服务器上。 此处不存储任何数据,并且用户无法直接访问此服务器。 为了访问数据和完成用户请求,此层级通过 T-SQL 命令与数据层进行通信。

应用程序的此层级包含一个简单的业务逻辑示例。 它通过将午餐建议与可接受的值列表进行比较,对其进行服务器端验证。 如果你尝试添加不在此列表中的选项,则不会接受该选项。 将返回包含有效午餐选项的消息。

数据层

运行以下命令以列出数据层资源。

az resource list --tag tier=data --output table

数据层为 Azure SQL 数据库服务器 demo-dbserver-abc123(我们向服务器名称添加了一个随机字符串,以实现全局唯一性)。 此服务器将应用程序的数据存储在名为 demo-sqldb 的数据库中。 应用程序的此层级只关心数据的存储,并提供访问它的方法。 在本例中,应用程序通过 T-SQL 对数据库执行操作。 我们不在此层级处理任何业务逻辑,也不向用户呈现任何数据。

此层级通过 VNet 服务终结点在端口 1433 公开连接。 VNet 服务终结点是一种将 PaaS 服务(例如 Azure SQL 数据库)连接到子网并限制为只能连接该子网内的资源的机制。

这也是一个使用 PaaS 服务代替基础结构即服务 (IaaS) VM 来运行应用程序层级的示例。 我们通常将 N 层应用程序视为基于 VM 的应用程序,但 VM 并不是必需的。 通过用 PaaS 服务代替 VM,可降低成本、提高安全性并减少管理要求。