动手实验:可维护的 Azure 网站:管理更改和缩放

Web Camp 团队

下载 Web Camp 培训工具包

借助 Microsoft Azure,可以轻松地生成网站并将其部署到生产环境。 但是,当应用程序处于活动状态时,你还没有完成,你只是入门! 需要处理不断变化的要求、数据库更新、缩放等。 幸运的是,Azure 应用服务涵盖了大量功能,可帮助你保持网站平稳运行。

Azure 为任何大小的 Web 应用程序提供安全且灵活的开发、部署和缩放选项。 利用现有工具创建和部署应用程序,而无需管理基础结构。

通过轻松部署使用你喜欢的开发工具创建的内容,在几分钟内自行预配生产 Web 应用程序。 可以直接从源代码管理部署现有站点,支持 GitGitHubBitbucketTFS 甚至 DropBox。 直接从你喜欢的 IDE 或使用任何 OS 上运行的 Windows 或 CLI 工具中的 PowerShell 从脚本进行部署。 部署后,使站点始终保持最新状态,同时支持持续部署。

Azure 为任何数据(无论大小)提供可缩放的持久云存储、备份和恢复解决方案。 将应用程序部署到生产环境时,表、Blob 和 SQL 数据库等存储服务可帮助在云中缩放应用程序。

使用 SQL 数据库时,在部署应用程序的新版本时,请务必使生产数据库保持最新状态。 由于Entity Framework Code First 迁移,数据模型的开发和部署得到了简化,可以在几分钟内更新环境。 本动手实验将展示在 Microsoft Azure 中将 Web 应用部署到生产环境时可能遇到的不同主题。

所有示例代码和代码片段都包含在 Web Camp 培训工具包中,可从 https://aka.ms/webcamps-training-kit获取。

有关本主题的更深入介绍,请参阅 使用 Azure 构建 Real-World Cloud Apps 电子书

概述

目标

在本动手实验中,您将了解如何:

  • 使用现有模型启用实体框架迁移
  • 使用实体框架迁移相应地更新对象模型和数据库
  • 使用 Git 部署到Azure 应用服务
  • 使用 Azure 管理门户回滚到以前的部署
  • 使用 Azure 存储缩放 Web 应用
  • 使用 Azure 管理门户为 Web 应用配置自动缩放
  • 在 Visual Studio 中创建和配置负载测试项目

先决条件

完成本动手实验需要以下各项:

设置

若要运行本动手实验室中的练习,需要先设置环境。

  1. 打开 Windows 资源管理器并浏览到实验室的 “源” 文件夹。
  2. 右键单击 “Setup.cmd ”,然后选择“ 以管理员身份运行” 以启动安装过程,该过程将配置环境并安装适用于此实验室的 Visual Studio 代码片段。
  3. 如果显示“用户帐户控制”对话框,请确认操作以继续。

注意

确保在运行安装过程之前,您已检查本实验的所有依赖项。

使用代码段

在整个实验文档中,将指示您插入代码块。 为方便起见,此代码的大部分作为Visual Studio Code代码段提供,你可以从Visual Studio 2013内部访问这些代码片段,以避免手动添加代码段。

注意

每个练习都附带一个起始解决方案,该解决方案位于练习的 Begin 文件夹中,使你能够独立于其他练习跟踪每个练习。 请注意,这些起始解决方案中缺少练习期间添加的代码片段,在完成练习之前可能无法正常工作。 在练习的源代码中,还会发现包含 Visual Studio 解决方案的 End 文件夹,其中包含完成相应练习中的步骤后产生的代码。 如果您在演练本动手实验时需要其他帮助,则可以使用这些解决方案作为指南。


练习

本动手实验包括以下练习:

  1. 使用实体框架迁移
  2. 将 Web 应用部署到过渡
  3. 在生产环境中执行部署回滚
  4. 使用 Azure 存储进行缩放
  5. 使用自动缩放Web 应用 (Visual Studio 2013 Ultimate Edition) 可选

完成本实验室的估计时间: 75 分钟

注意

首次启动 Visual Studio 时,必须选择一个预定义的设置集合。 每个预定义集合旨在匹配特定的开发样式,并确定窗口布局、编辑器行为、IntelliSense 代码片段和对话框选项。 本实验室中的过程描述了在使用 “常规开发设置” 集合时在 Visual Studio 中完成给定任务所需的操作。 如果为开发环境选择不同的设置集合,则应考虑的步骤可能有所不同。

练习 1:使用实体框架迁移

开发应用程序时,数据模型可能会随时间而更改。 如果要) 创建新版本,这些更改可能会影响数据库中的现有模型 (,并且请务必使数据库保持最新状态以防止出现错误。

为了简化模型中对这些更改的跟踪,Entity Framework Code First 迁移自动检测将模型与数据库架构进行比较的更改,并生成特定代码来更新数据库,从而创建数据库的新版本

本练习演示如何为应用程序启用 迁移 ,以及如何轻松检测和生成更改以更新数据库。

任务 1 - 启用迁移

在此任务中,你将完成启用对 Geek Quiz 数据库Entity Framework Code First 迁移、更改模型以及了解这些更改如何反映在数据库中的步骤。

  1. 打开 Visual Studio,然后从 Source\Ex1-UsingEntityFrameworkMigrations\Begin 打开 GeekQuiz.sln 解决方案文件。

  2. 生成解决方案以下载并安装 NuGet 包依赖项。 为此,请右键单击解决方案,然后单击“ 生成解决方案 ”或按 Ctrl + Shift + B

  3. 在 Visual Studio 的“ 工具 ”菜单中,选择“ NuGet 包管理器”,然后单击“ 包管理器控制台”。

  4. 包管理器控制台中,输入以下命令,然后按 Enter。 将创建基于现有模型的初始迁移。

    Enable-Migrations -ContextTypeName GeekQuiz.Models.TriviaContext
    

    启用迁移

    启用迁移

    注意

    此命令将 Migrations 文件夹添加到包含名为 Configuration.cs 的文件的 Geek Quiz 项目。 Configuration 类允许配置迁移针对上下文的行为方式。

  5. 启用迁移后,需要更新 Configuration 类,以使用 Geek Quiz 所需的初始数据填充数据库。 在 “迁移”下,将 Configuration.cs 文件替换为位于此实验室的 Source\Assets 文件夹中的文件。

    注意

    由于 迁移 将在每次更新数据库时调用 Seed 方法,因此需要确保数据库中的记录不会重复。 AddOrUpdate 方法有助于防止重复数据。

  6. 若要添加初始迁移,请输入以下命令,然后按 Enter

    注意

    确保 LocalDB 实例中没有名为“GeekQuizProd”的数据库。

    Add-Migration InitialSchema
    

    添加基本架构迁移

    添加基本架构迁移

    注意

    Add-Migration 将基于自上次创建迁移以来对模型所做的更改,为下一次迁移搭建基架。 在这种情况下,由于这是项目的第一次迁移,因此它将添加脚本以创建 TriviaContext 类中定义的所有表。

  7. 通过运行以下命令执行迁移以更新数据库。 对于此命令,你将指定 详细 标志以查看应用于目标数据库的 SQL 语句。

    Update-Database -Verbose
    

    创建初始数据库

    创建初始数据库

    注意

    Update-Database 会将任何挂起的迁移应用到数据库。 在这种情况下,它将使用 web.config 文件中定义的连接字符串创建数据库。

  8. 转到“视图”菜单并打开SQL Server 对象资源管理器

    在 SQL Server 对象资源管理器

    在 SQL Server 对象资源管理器中打开

  9. “SQL Server 对象资源管理器”窗口中,右键单击SQL Server节点并选择“添加SQL Server...”选项,连接到 LocalDB 实例。

    添加SQL Server实例

    将 SQL Server 实例添加到 SQL Server 对象资源管理器

  10. 服务器名称 设置为 (localdb) \v11.0 ,并将 Windows 身份验证 保留为身份验证模式。 单击“ 连接 ”以继续。

    连接到 LocalDB

    连接到 LocalDB

  11. 打开 GeekQuizProd 数据库并展开 “表” 节点。 可以看到, Update-Database 命令生成了 TriviaContext 类中定义的所有表。 找到 dbo。TriviaQuestions 表并打开列节点。 在下一个任务中,你将向此表添加新列,并使用 迁移更新数据库。

    琐事问题列

    琐事问题栏

任务 2 - 使用迁移更新数据库架构

在此任务中,你将使用 Entity Framework Code First 迁移 检测模型中的更改,并生成更新数据库所需的代码。 你将通过向 TriviaQuestions 实体添加新属性来更新该实体。 然后,将运行命令以创建新的迁移,以在表中包括新列。

  1. 解决方案资源管理器中,双击 Models 文件夹内的TriviaQuestion.cs 文件。

  2. 添加名为 Hint 的新属性,如以下代码片段所示。

    public class TriviaQuestion
    {
         public int Id { get; set; }
    
         [Required]
         public string Title { get; set; }
    
         public virtual List<TriviaOption> Options { get; set; }
    
         public string Hint { get; set; }
    }
    
  3. 包管理器控制台中,输入以下命令,然后按 Enter。 将创建新的迁移,以反映模型中的更改。

    Add-Migration QuestionHint
    

    Add-Migration

    Add-Migration

    注意

    迁移文件由两种方法组成: UpDown

    • Up 方法将用于指定应用程序的当前版本需要应用于数据库的更改。
    • Down 用于撤消已添加到 Up 方法的更改。

    当数据库迁移更新数据库时,它将按时间戳顺序运行所有迁移,并且只有自上次更新以来未使用的迁移 (_MigrationHistory 表会跟踪) 应用了哪些迁移。 将调用所有迁移的 Up 方法,并将对数据库进行指定的更改。 如果我们决定返回到以前的迁移,将调用 Down 方法以反向顺序重做更改。

  4. 包管理器控制台中,输入以下命令,然后按 Enter

    Update-Database -Verbose
    
  5. Update-Database 命令的输出生成了 Alter Table SQL 语句,用于向 TriviaQuestions 表添加新列,如下图所示。

    添加生成的列 SQL 语句

    添加生成的列 SQL 语句

  6. SQL Server 对象资源管理器 中,刷新 dbo。TriviaQuestions 表和检查显示新的 Hint 列。

    显示新的提示列

    显示新的提示列

  7. 返回 TriviaQuestion.cs 编辑器,将 StringLength 约束添加到 Hint 属性,如以下代码片段所示。

    public class TriviaQuestion
    {
         public int Id { get; set; }
    
         [Required]
         public string Title { get; set; }
    
         public virtual List<TriviaOption> Options { get; set; }
    
         [StringLength(150)]
         public string Hint { get; set; }
    }
    
  8. 包管理器控制台中,输入以下命令,然后按 Enter

    Add-Migration QuestionHintLength
    
  9. 包管理器控制台中,输入以下命令,然后按 Enter

    Update-Database -Verbose
    
  10. Update-Database 命令的输出生成了 Alter Table SQL 语句来更新 TriviaQuestions 表的提示列类型,如下图所示。

    更改列 SQL 语句生成

    生成的更改列 SQL 语句

  11. SQL Server 对象资源管理器 中,刷新 dbo。TriviaQuestions 表和检查提示列类型为 nvarchar (150)

    显示新约束

    显示新约束

练习 2:将 Web 应用部署到过渡

Azure 应用服务 中的Web 应用使你能够执行分阶段发布。 分阶段发布为每个默认生产站点创建一个过渡站点槽,并使你能够在不停机的情况下交换这些槽。 这对于在向公众发布更改之前验证更改、以增量方式集成网站内容以及在更改未按预期工作时回滚非常有用。

在本练习中,你将使用 Git 源代码管理将 Geek Quiz 应用程序部署到 Web 应用的过渡环境。 为此,你将创建 Web 应用并在管理门户中预配所需的组件,配置 Git 存储库并将应用程序源代码从本地计算机推送到过渡槽。 还将使用在上一练习中创建Code First 迁移更新生产数据库。 然后,你将在此测试环境中执行应用程序以验证其操作。 一旦确信它按预期工作,即可将应用程序提升到生产环境。

注意

若要启用分阶段发布,Web 应用必须处于 标准模式。 请注意,如果将 Web 应用更改为标准模式,则会产生额外费用。 有关定价的详细信息,请参阅App 服务定价

任务 1 - 在 Azure 应用服务 中创建 Web 应用

在此任务中,你将从管理门户在 Azure 应用服务 中创建一个 Web 应用。 还将配置SQL 数据库以保留应用程序数据,并为源代码管理配置本地 Git 存储库。

  1. 转到 Azure 管理门户 ,并使用与订阅关联的 Microsoft 帐户登录。

    登录到 Azure 管理门户

    登录到 Azure 管理门户

  2. 在页面底部的命令栏中单击“ 新建 ”。

    创建新的 Web 应用

    创建新的 Web 应用

  3. 依次单击“ 计算”、“ 网站 ”、“ 自定义创建”。

    使用自定义创建新的 Web 应用 创建

    使用自定义创建创建新的 Web 应用

  4. “新建网站 - 自定义创建”对话框中,提供可用 URL (例如 geek-quiz) ,在“区域”下拉列表中选择一个位置,然后在“数据库”下拉列表中选择“创建新的 SQL 数据库”。 最后,选择“从源代码管理检查发布”框,然后单击“下一步”。

    自定义新的 Web 应用

    自定义新的 Web 应用

  5. 为数据库设置指定以下信息:

    • 在“ 名称” 文本框中,输入数据库名称 (例如 geekquiz_db)

    • 在“服务器 ”下拉列表中 ,选择“ 新建 SQL 数据库服务器”。 或者,可以选择现有服务器。

    • 在“ 数据库用户名” 和“ 数据库密码 ”框中,输入 SQL 数据库服务器的管理员用户名和密码。 如果选择已创建的服务器,系统会提示输入密码。

      指定数据库设置

      指定数据库设置

  6. 单击“下一步”以继续。

  7. 选择源代码管理要使用的 “本地 Git 存储库 ”,然后单击“ 下一步”。

    注意

    系统可能会提示你输入部署凭据 (用户名和密码) 。

    创建 Git 存储库

    创建 Git 存储库

  8. 等到创建新的 Web 应用。

    注意

    默认情况下,Azure 在 azurewebsites.net 提供域,但也使你能够使用 Azure 管理门户设置自定义域。 但是,如果使用的是某些Azure 应用服务模式,则只能管理自定义域。

    Azure 应用服务在免费版、共享版、基本版、标准版和高级版中提供。 在“免费”和“共享”模式下,所有 Web 应用都在多租户环境中运行,并具有 CPU、内存和网络使用情况配额。 免费应用的最大数量可能因你的计划而异。 在标准模式下,选择哪些应用在对应于标准 Azure 计算资源的专用虚拟机上运行。 可以在 Web 应用的“ 缩放 ”菜单中找到 Web 应用模式配置。

    Azure 应用服务模式

    如果使用的是 “共享 ”或 “标准 ”模式,则可以通过转到应用的 “配置 ”菜单并单击“域名”下的“ 管理域 ”来管理 Web 应用的自定义

    管理域

    管理自定义域

  9. 创建 Web 应用后,单击 URL 列下的链接,检查新的 Web 应用正在运行。

    浏览到新的 Web 应用

    浏览到新的 Web 应用

    正在运行的 Web 应用

    正在运行的 Web 应用

任务 2 - 创建生产SQL 数据库

在此任务中,你将使用 Entity Framework Code First 迁移创建面向在上一个任务中创建Azure SQL数据库实例的数据库。

  1. 在管理门户中,导航到在上一任务中创建的 Web 应用,并转到其 仪表板

  2. “仪表板”页中,单击“速览”部分下的“查看连接字符串”链接。

    查看连接字符串

    查看连接字符串

  3. 复制连接字符串值并关闭对话框。

    Azure 管理门户中的连接字符串

    Azure 管理门户中的连接字符串

  4. 单击“ SQL 数据库” 以查看 Azure 中的 SQL 数据库列表

    SQL 数据库菜单

    SQL 数据库菜单

  5. 找到在上一个任务中创建的数据库,然后单击“服务器”。

    SQL 数据库 服务器

    SQL 数据库服务器

  6. 在服务器的 “快速启动 ”页中,单击“ 配置”。

    “配置”菜单

    “配置”菜单

  7. “允许的 IP 地址”部分中,单击“添加到允许的 IP 地址”链接,使 IP 能够连接到SQL 数据库服务器。

    允许的 IP 地址

    允许的 IP 地址

  8. 单击页面底部的“保存” 以完成该步骤。

  9. 切换回 Visual Studio。

  10. 包管理器控制台中,执行以下命令,将 [YOUR-CONNECTION-STRING] 占位符替换为从 Azure 复制连接字符串

    Update-Database -Verbose -ConnectionString "[YOUR-CONNECTION-STRING]" -ConnectionProviderName "System.Data.SqlClient"
    

    更新面向 Windows 的数据库 Azure SQL 面向

    更新数据库目标Azure SQL数据库

任务 3 - 使用 Git 将 Geek 测验部署到过渡

在此任务中,你将在 Web 应用中启用分阶段发布。 然后,你将使用 Git 直接从本地计算机将 Geek Quiz 应用程序发布到 Web 应用的过渡环境。

  1. 返回门户,单击“名称”列下的 Web 应用名称以显示管理页。

    打开 Web 应用管理页

    打开 Web 应用管理页

  2. 导航到“ 缩放 ”页。 在 “常规 ”部分下,选择“ 标准 ”进行配置,然后单击命令栏中的“ 保存 ”。

    注意

    若要在标准模式下运行当前区域和订阅中的所有 Web 应用,请在“选择站点”配置中保留选中“选检查框。 否则,请清除“全选检查框。

    将 Web 应用升级到标准模式

    将 Web 应用升级到标准模式

  3. 单击“ ”确认更改。

    确认更改为标准模式

    确认更改为标准模式

  4. 转到“仪表板”页,单击“速览”部分下的“启用暂存发布”。

    启用分阶段发布

    启用分阶段发布

  5. 单击“ ”以启用暂存发布。

    确认分阶段发布

    确认分阶段发布

  6. 在 Web 应用列表中,展开 Web 应用名称左侧的标记以显示过渡站点槽。 它具有 Web 应用的名称,后跟 (暂存) 。 单击过渡站点以转到管理页。

    导航到过渡 Web 应用

    导航到过渡应用

  7. 请注意,管理页看起来像任何其他 Web 应用的管理页。 导航到 “部署 ”页并复制 Git URL 值。 稍后将在本练习中使用它。

    复制 Git URL 值

    复制 Git URL 值

  8. 打开新的 Git Bash 控制台并执行以下命令。 将 [YOUR-APPLICATION-PATH] 占位符更新为 GeekQuiz 解决方案的路径,该路径位于此实验室的 Source\Ex1-DeployingWebSiteToStaging\Begin 文件夹中。

    cd "[YOUR-APPLICATION-PATH]"
    git init
    git config --global user.email "{username@example.com}"
    git config --global user.name "{your-user-name}"
    git add .
    git commit -m "Initial commit"
    

    Git 初始化和首次提交

    Git 初始化和首次提交

  9. 运行以下命令,将 Web 应用推送到远程 Git 存储库。 将 占位符替换为从管理门户获取的 URL。 系统将提示你输入部署密码。

    git remote add azure [GIT-CLONE-URL]
    git push azure master
    

    推送到 Windows Azure

    推送到 Azure

    注意

    将内容部署到 Web 应用的 FTP 主机或 GIT 存储库时,必须使用从 Web 应用的“快速启动”“仪表板”管理页创建的部署凭据进行身份验证。 如果不知道部署凭据,可以使用管理门户轻松重置凭据。 打开 Web 应用 仪表板 页,然后单击 “重置部署凭据” 链接。 提供新密码并单击“ 确定”。 部署凭据适用于与订阅关联的所有 Web 应用。

  10. 若要验证 Web 应用是否已成功推送到 Azure,请返回到管理门户并单击“ 网站”。

  11. 找到 Web 应用并展开条目以显示过渡站点槽。 单击其 名称 以转到管理页。

  12. 单击“ 部署 ”以查看 部署历史记录。 使用“初始提交”验证是否存在活动部署

    活动部署

    活动部署

  13. 最后,单击命令栏中的“ 浏览 ”转到 Web 应用。

    浏览 Web 应用

    浏览 Web 应用

  14. 如果成功部署应用程序,你将看到 Geek Quiz 登录页。

    注意

    已部署应用程序的地址 URL 包含 Web 应用的名称,后跟 -staging

    在过渡环境中运行的应用程序

    在过渡环境中运行的应用程序

  15. 如果要浏览应用程序,请单击“ 注册 ”以注册新用户。 输入用户名、电子邮件地址和密码,完成帐户详细信息。 接下来,应用程序显示测验的第一个问题。 请回答几个问题,确保它按预期工作。

    可供使用的应用程序

    可供使用的应用程序

任务 4 - 将 Web 应用提升到生产环境

现在,你已验证 Web 应用在过渡环境中正常运行,现在可以将其提升到生产环境。 在此任务中,你将交换过渡站点槽与生产站点槽。

  1. 返回管理门户并选择过渡站点槽。 单击命令栏中的“ 交换 ”。

    交换到生产环境

    交换到生产环境

  2. 在确认对话框中单击“ ”以继续执行交换操作。 Azure 将立即将生产站点的内容与过渡站点的内容交换。

    注意

    暂存版本中的某些设置将自动复制到生产版本 (例如连接字符串替代、处理程序映射等 ) 但其他设置不会更改 (例如 DNS 终结点、SSL 绑定等 ) 。

    确认交换操作

    确认交换操作

  3. 交换完成后,选择生产槽,并单击命令栏中的“ 浏览 ”以打开生产站点。 请注意地址栏中的 URL。

    注意

    可能需要刷新浏览器以清除缓存。 在 Internet Explorer 中,可以通过按 Ctrl+R 来执行此操作。

    在生产环境中运行的 Web 应用

  4. GitBash 控制台中,更新本地 Git 存储库的远程 URL,以面向生产槽位。 为此,请运行以下命令,将占位符替换为部署用户名和 Web 应用的名称。

    注意

    在以下练习中,你将将更改推送到生产站点,而不是为了简化实验室而暂存。 在实际方案中,建议在升级到生产环境之前验证过渡环境中的更改。

    git remote set-url azure https://<your-user>@<your-web-site>.scm.azurewebsites.net:443/<your-web-site>.git
    

练习 3:在生产环境中执行部署回滚

在某些情况下,你没有过渡槽来在过渡和生产之间执行热交换,例如,如果你使用的是 免费 模式或 共享 模式。 在这些情况下,应在部署到生产环境(本地或远程站点)中测试应用程序。 但是,生产站点中可能会出现在测试阶段未检测到的问题。 在这种情况下,必须有一种机制,以便尽快轻松切换到以前且更稳定的应用程序版本。

Azure 应用服务中,由于管理门户中提供了重新部署操作,源代码管理的持续部署使这一点成为可能。 Azure 会跟踪与推送到存储库的提交关联的部署,并随时提供一个选项来使用任何以前的部署重新部署应用程序。

在本练习中,你将对 Geek Quiz 应用程序中有意注入 bug 的代码进行更改。 你将应用程序部署到生产环境以查看错误,然后利用重新部署功能返回到以前的状态。

任务 1 - 更新 Geek Quiz 应用程序

在此任务中,你将重构 TriviaController 类的一小段代码,以将检索数据库中所选测验选项的部分逻辑提取到新方法中。

  1. 使用上一练习中的 GeekQuiz 解决方案切换到 Visual Studio 实例。

  2. 解决方案资源管理器中,打开 Controllers 文件夹内的 TriviaController.cs 文件。

  3. 找到 StoreAsync 方法并选择下图中突出显示的代码。

    选择代码

    选择代码

  4. 右键单击所选代码,展开 “重构 ”菜单,然后选择“ 提取方法...”

    将代码提取为新方法

    选择提取方法

  5. 在“ 提取方法 ”对话框中,将新方法命名为 MatchesOption ,然后单击“ 确定”。

    指定方法名称

    指定提取方法的名称

  6. 然后将所选代码提取到 MatchesOption 方法中。 生成的代码显示在以下代码片段中。

    private async Task<bool> StoreAsync(TriviaAnswer answer)
    {
        this.db.TriviaAnswers.Add(answer);
    
        await this.db.SaveChangesAsync();
        var selectedOption = await this.db.TriviaOptions.FirstOrDefaultAsync(o => MatchesOption(answer, o));
    
        return selectedOption.IsCorrect;
    }
    
    private static bool MatchesOption(TriviaAnswer answer, TriviaOption o)
    {
        return o.Id == answer.OptionId
                && o.QuestionId == answer.QuestionId;
    }
    
  7. Ctrl + S 保存更改。

任务 2 - 重新部署 Geek Quiz 应用程序

现在,你将在上一个任务中所做的更改推送到存储库,这会触发到生产环境的新部署。 然后,你将使用 Internet Explorer 提供的 F12 开发工具 解决问题,然后从 Azure 管理门户执行回退到以前的部署。

  1. 打开新的 Git Bash 控制台,将更新的应用程序部署到Azure 应用服务。

  2. 执行以下命令将更改推送到 Azure。 使用 GeekQuiz 解决方案的路径更新 [YOUR-APPLICATION-PATH] 占位符。 系统将提示你输入部署密码。

    cd "[YOUR-APPLICATION-PATH]"
    git add .
    git commit -m "Refactored answer check"
    git push azure master
    

    将重构的代码推送到 Azure

    将重构的代码推送到 Azure

  3. 打开 Internet Explorer 并导航到 Web 应用 (例如 http://<your-web-site>.azurewebsites.net) 。 使用以前创建的凭据登录。

  4. F12 启动开发工具,选择“ 网络 ”选项卡,然后单击“ 播放 ”按钮开始录制。

    屏幕截图显示了希腊测验 Web 应用,其中指针在部署回滚过程中选择了“启用网络流量捕获”。

    开始网络录制

  5. 选择测验的任意选项。 你会看到什么也没发生。

  6. F12 窗口中,对应于 POST HTTP 请求的条目显示 HTTP 500 结果。

    HTTP 500 错误

    HTTP 500 错误

  7. 选择“ 控制台 ”选项卡。错误记录了原因的详细信息。

    记录的错误

    记录的错误

  8. 找到错误的详细信息部分。 显然,此错误是由你在前面步骤中提交的代码重构引起的。

    Details: LINQ to Entities does not recognize the method 'Boolean MatchesOption ....

  9. 不要关闭浏览器。

  10. 在新的浏览器实例中,导航到 [Azure 管理门户] (/azure/azure-portal/azure-portal-overview,并使用与订阅关联的 Microsoft 帐户登录。

  11. 选择“ 网站 ”,然后单击在练习 2 中创建的 Web 应用。

  12. 导航到 “部署 ”页。 请注意,执行的所有提交都列在部署历史记录中。

    现有部署列表

    现有部署列表

  13. 选择上一个提交,并单击命令栏上的“ 重新部署 ”。

    重新部署上一个提交

    重新部署上一个提交

  14. 出现确认提示时,单击“是”

    确认重新部署

  15. 部署完成后,使用 Web 应用切换回浏览器实例,然后按 Ctrl + F5

  16. 单击任一选项。 现在将发生翻转动画,并显示结果 (正确/不正确的) 。

  17. (可选) 切换到 Git Bash 控制台并执行以下命令以还原上一个提交。

    注意

    这些命令将创建一个新提交,该提交将撤消 Git 存储库中在错误提交中所做的所有更改。 然后,Azure 将使用新提交重新部署应用程序。

    git revert HEAD --no-edit
    git push azure master
    

练习 4:使用 Azure 存储进行缩放

Blob 是存储大量非结构化文本或二进制数据(如视频、音频和图像)的最简单方法。 将应用程序的静态内容移动到存储中有助于通过将图像或文档直接提供到浏览器来缩放应用程序。

在本练习中,你将将应用程序的静态内容移动到 Blob 容器。 然后,将应用程序配置为在Web.config中添加 ASP.NET URL 重写规则 ,以 将内容重定向到 Blob 容器。

任务 1 - 创建 Azure 存储帐户

在此任务中,你将了解如何使用管理门户创建新的存储帐户。

  1. 导航到 Azure 管理门户 ,并使用与订阅关联的 Microsoft 帐户登录。

  2. 选择“ 新建|”数据服务 |存储 |快速创建 以开始创建新的存储帐户。 输入帐户的唯一名称,并从列表中选择一个 区域 。 单击“ 创建存储帐户” 以继续。

    创建新的存储帐户

    新建存储帐户

  3. 在“ 存储 ”部分中,等待新存储帐户的状态更改为 “联机 ”,以便继续执行以下步骤。

    存储帐户创建的

    创建的存储帐户

  4. 单击存储帐户名称,然后单击页面顶部的 “仪表板 ”链接。 “仪表板”页提供有关帐户状态的信息,以及可在应用程序中使用的服务终结点。

    显示存储帐户仪表板

    显示存储帐户仪表板

  5. 单击导航栏中的 “管理访问密钥” 按钮。

    “管理访问密钥”按钮

    “管理访问密钥”按钮

  6. “管理访问密钥 ”对话框中,复制 “存储帐户名称 ”和“ 主访问密钥 ”,因为需要在以下练习中使用它们。 然后,关闭对话框。

    “管理访问密钥”对话框

    “管理访问密钥”对话框

任务 2 - 将资产上传到Azure Blob 存储

在此任务中,将使用 Visual Studio 中的“服务器资源管理器”窗口连接到存储帐户。 然后,你将创建一个 Blob 容器,并将带有 Geek Quiz 徽标的文件上传到该容器。

  1. 使用上一练习中的 GeekQuiz 解决方案切换到 Visual Studio 实例。

  2. 在菜单栏中,选择“ 视图 ”,然后单击“ 服务器资源管理器”。

  3. 服务器资源管理器中,右键单击 Azure 节点,然后选择“ 连接到 Azure...”。使用与订阅关联的 Microsoft 帐户登录。

    连接到 Windows Azure

    连接到 Azure

  4. 展开 “Azure ”节点,右键单击“ 存储 ”,然后选择“ 附加外部存储...”

  5. “添加新存储帐户 ”对话框中,输入在上一任务中获取的“ 帐户名 ”和“ 帐户密钥 ”,然后单击“ 确定”。

    “添加新存储帐户”对话框

    “添加新存储帐户”对话框

  6. 存储帐户应显示在 “存储 ”节点下。 展开存储帐户,右键单击“ Blob ”,然后选择“ 创建 Blob 容器...”

    创建 Blob 容器

    创建 Blob 容器

  7. 在“ 创建 Blob 容器 ”对话框中,输入 Blob 容器的名称,然后单击“ 确定”。

    “创建 Blob 容器”对话框

    “创建 Blob 容器”对话框

  8. 应将新的 Blob 容器添加到 Blob 节点 。 更改容器中的访问权限,使容器成为公共容器。 为此,请右键单击 映像 容器,然后选择“ 属性”。

    images 容器属性

    Images 容器属性

  9. “属性” 窗口中,将 “公共读取访问权限 ”设置为 “容器”。

    更改公共读取访问属性

    更改公共读取访问属性

  10. 出现提示时,如果确定要更改公共访问属性,请单击“ ”。

    Microsoft Visual Studio 警告

    Microsoft Visual Studio 警告

  11. “服务器资源管理器”中,右键单击 映像 Blob 容器,然后选择“ 查看 Blob 容器”。

    查看 Blob 容器

    查看 Blob 容器

  12. 图像容器应在新窗口中打开,并且应显示没有条目的图例。 单击 上传 图标,将文件上传到 Blob 容器。

    没有条目的映像

    没有条目的映像容器

  13. “上传 Blob ”对话框中,导航到实验室的 “资产” 文件夹。 选择 logo-big.png 文件,然后单击“ 打开”。

  14. 等待文件上传。 上传完成后,文件应列在 images 容器中。 右键单击文件条目,然后选择“ 复制 URL”。

    复制 Blob URL

    复制 Blob URL

  15. 打开 Internet Explorer 并粘贴 URL。 浏览器中应显示下图。

     从 Windows Blob 存储logo-big.png 映像

    从Azure Blob 存储logo-big.png 映像

任务 3 - 更新解决方案以从 Azure Blob 存储使用静态内容

在此任务中,你将配置 GeekQuiz 解决方案,以便通过在web.config文件中添加 ASP.NET URL 重写规则,来使用上传到 Azure Blob 存储 (的图像,而不是 Web 应用中) 中的图像。

  1. 在 Visual Studio 中,打开 GeekQuiz 项目中的 Web.config 文件并找到 <system.webServer> 元素。

  2. 添加以下代码以添加 URL 重写规则,并使用存储帐户名称更新占位符。

    (代码片段 - WebSitesInProduction - Ex4 - UrlRewriteRule)

    <system.webServer>
        <rewrite>
            <rules>
                <rule name="redirect-images" stopProcessing="true">
                    <match url="img/(.*)"/>
                    <action type="Redirect" url="http://[YOUR-STORAGE-ACCOUNT].blob.core.windows.net/images/{R:1}"></action>
                </rule>
            </rules>
        </rewrite>
    

    注意

    URL 重写是截获传入 Web 请求并将请求重定向到其他资源的过程。 URL 重写规则告知重写引擎何时需要重定向请求,以及应将请求重定向到何处。 重写规则由两个字符串组成:通常在请求的 URL 中查找 (模式(使用) 正则表达式)和用于替换模式的字符串(如果找到)。 有关详细信息,请参阅 ASP.NET 中的 URL 重写

  3. Ctrl + S 保存更改。

  4. 打开新的 Git Bash 控制台,将更新的应用程序部署到Azure 应用服务。

  5. 执行以下命令将更改推送到 Azure。 使用 GeekQuiz 解决方案的路径更新 [YOUR-APPLICATION-PATH] 占位符。 系统将提示你输入部署密码。

    cd "[YOUR-APPLICATION-PATH]"
    git add .
    git commit -m "Added URL rewrite rule in web.config file"
    git push azure master
    

    将更新部署到 Azure

    将更新部署到 Azure

任务 4 – 验证

在此任务中,你将使用 Internet Explorer 浏览 Geek Quiz 应用程序,并检查图像的 URL 重写规则是否有效,并且你会重定向到托管在 Azure Blob 存储 上的图像。

  1. 打开 Internet Explorer 并导航到 Web 应用 (例如 http://<your-web-site>.azurewebsites.net) 。 使用以前创建的凭据登录。

    显示具有图像的 Geek Quiz Web 应用

    显示带有图像的 Geek Quiz Web 应用

  2. F12 启动开发工具,选择“ 网络 ”选项卡并开始录制。

    屏幕截图显示希腊测验 Web 应用,其中指针在验证缩放过程中选择了“启用网络流量捕获”。

    开始网络录制

  3. Ctrl + F5 刷新网页。

  4. 页面加载完成后,应会看到针对 /img/logo-big.png URL 的 HTTP 请求,其中包含 HTTP 301 结果 (重定向) ,以及另一个包含 HTTP 200 结果的 http://[YOUR-STORAGE-ACCOUNT].blob.core.windows.net/images/logo-big.png URL 请求。

    验证 URL 重定向

    验证 URL 重定向

练习 5:对Web 应用使用自动缩放

注意

此练习是可选的,因为它需要对仅适用于 Visual Studio 2013 Ultimate Edition 的 Web 负载 & 性能测试的支持。 有关特定Visual Studio 2013功能的详细信息,请在此处比较版本。

Azure 应用服务 Web 应用为在标准模式下运行的 Web 应用提供自动缩放功能。 自动缩放允许 Azure 根据负载自动缩放 Web 应用的实例计数。 启用自动缩放后,Azure 每五分钟检查一次 Web 应用的 CPU,并在该时间点根据需要添加实例。 如果 CPU 使用率较低,Azure 将每两小时删除一次实例,以确保 Web 应用的性能不会下降。

在本练习中,你将完成为 Geek Quiz Web 应用配置自动缩放功能所需的步骤。 你将通过运行 Visual Studio 负载测试来验证此功能,以在应用程序上生成足够的 CPU 负载来触发实例升级。

任务 1 - 根据 CPU 指标配置自动缩放

在此任务中,你将使用 Azure 管理门户为在练习 2 中创建的 Web 应用启用自动缩放功能。

  1. Azure 管理门户中,选择“ 网站 ”,并单击在练习 2 中创建的 Web 应用。

  2. 导航到“ 缩放 ”页。 在“容量”部分下,为“按指标缩放”配置选择“CPU”。

    注意

    按 CPU 缩放时,如果 CPU 使用率发生变化,Azure 会动态调整应用使用的实例数。

    按 CPU 选择缩放

    选择按 CPU 缩放

  3. 目标 CPU 配置更改为 20-40 %。

    注意

    此范围表示 Web 应用的平均 CPU 使用率。 Azure 将添加或删除实例,以使 Web 应用保持在此范围内。 用于缩放的最小和最大实例数在 实例计数 配置中指定。 Azure 永远不会超过或超过该限制。

    仅出于本实验室的目的修改了默认 目标 CPU 值。 通过将 CPU 范围配置为较小的值,可以增加在应用程序上施加中等负载时触发自动缩放的机会。

    将目标 CPU 更改为 20% 到 40%

    将目标 CPU 更改为 20% 到 40%

  4. 单击命令栏中的“ 保存 ”以保存更改。

任务 2 - 使用 Visual Studio 进行负载测试

配置 自动缩放 后,将在 Visual Studio 中创建 一个 Web 性能和负载测试项目 ,以在 Web 应用上生成一些 CPU 负载。

  1. 打开Visual Studio Ultimate 2013并选择“文件|新建 |项目。。。启动新解决方案。

    创建新项目

    创建新项目

  2. 在“新建项目”对话框中,选择 Visual C# 下的“Web 性能和负载测试项目” |“测试”选项卡。确保已选择 .NET Framework 4.5,将项目命名为 WebAndLoadTestProject,选择一个位置并单击“确定”。

    创建新的 Web 和负载测试项目

    创建新的 Web 和负载测试项目

  3. “WebTest1.webtest ”中右键单击“ WebTest1 ”节点,然后单击“ 添加请求”。

    将请求添加到 WebTest1

    更改 Url 属性

  4. “WebTest1.webtest ”窗口中,右键单击“ WebTest1 ”,然后单击“ 添加循环...”

    将循环添加到 WebTest1

    将循环添加到 WebTest1

  5. “添加条件规则和要循环的项 ”对话框中,选择 “For 循环 ”规则并修改以下属性。

    1. 终止值: 1000

    2. 上下文参数名称: 迭 代

    3. 增量值: 1

      选择 For 循环规则并更新属性

      选择 For 循环规则并更新属性

  6. 在“ 循环中的项 ”部分下,选择之前创建的请求,将其用作循环的第一个和最后一项。 单击 “确定” 继续。

    选择循环的第一个和最后一个项目

    选择循环的第一个和最后一项

  7. “解决方案资源管理器”中,右键单击“WebAndLoadTestProject”项目,展开“添加”菜单,然后选择“负载测试...”

    将负载测试添加到 WebAndLoadTestProject 项目

    将负载测试添加到 WebAndLoadTestProject 项目

  8. “新建负载测试向导 ”对话框中,单击“ 下一步”。

    新建负载测试向导

    新建负载测试向导

  9. “方案 ”页中,选择“ 不使用思考时间 ”,然后单击“ 下一步”。

    选择不使用思考时间

    选择不使用思考时间

  10. “加载模式 ”页中,确保选中“ 恒定加载 ”选项。 将 “用户计数” 设置更改为 250 个用户,然后单击“ 下一步”。

    将用户计数更改为 250

    将用户计数更改为 250

  11. “测试组合模型 ”页中,选择“ 基于顺序测试顺序 ”,然后单击“ 下一步”。

    选择测试组合模型

    选择测试组合模型

  12. “测试组合模型 ”页中,单击“ 添加...” ,向组合添加测试。

    向测试组合添加测试

    向测试组合添加测试

  13. “添加测试 ”对话框中,双击“ WebTest1 ”,将测试添加到 “所选测试 ”列表。 单击 “确定” 继续。

    添加 WebTest1 测试

    添加 WebTest1 测试

  14. 返回“ 测试组合 ”页,单击“ 下一步”。

    正在完成“测试组合”页

    完成“测试组合”页

  15. “网络组合 ”页中,单击“ 下一步”。

    在“网络组合”页中

    在“网络组合”页中单击“下一步”

  16. “浏览器组合 ”页中,选择 “Internet Explorer 10.0 ”作为浏览器类型,然后单击“ 下一步”。

    选择浏览器类型

    选择浏览器类型

  17. “计数器集” 页中,单击“ 下一步”。

    在“计数器集”页中

    在“计数器集”页中单击“下一步”

  18. “运行设置” 页中,将 “负载测试持续时间 ”设置为 5 分钟 ,然后单击“ 完成”。

    将负载测试持续时间设置为 5 分钟

    将负载测试持续时间设置为 5 分钟

  19. 解决方案资源管理器中,双击 Local.settings 文件以浏览测试设置。 默认情况下,Visual Studio 使用本地计算机来运行测试。

    注意

    或者,可以将测试项目配置为使用 Azure Test Plans 在云中运行负载测试。 Azure Test Plans提供基于云的负载测试服务,该服务模拟更真实的负载,避免本地环境限制,如 CPU 容量、可用内存和网络带宽。 有关使用 Azure Test Plans 运行负载测试的详细信息,请参阅负载测试方案

    测试设置

任务 3 - 自动缩放验证

现在,你将执行在上一任务中创建的负载测试,并查看 Web 应用在负载下的行为。

  1. “解决方案资源管理器”中,双击“LoadTest1.loadtest”以打开负载测试。

    打开 LoadTest1.loadtest

    打开 LoadTest1.loadtest

  2. LoadTest1.loadtest 窗口中,单击工具箱中的第一个按钮以运行负载测试。

    运行负载测试

    运行负载测试

  3. 等待负载测试完成。

    注意

    负载测试模拟同时向 Web 应用发送请求的多个用户。 运行测试时,可以监视可用的计数器,以检测与负载测试运行相关的任何错误、警告或其他信息。

    负载测试正在运行

    正在运行的负载测试

  4. 测试完成后,返回到管理门户并导航到 Web 应用的 “缩放 ”页。 在 “容量 ”部分下,应在图中看到自动部署了新实例。

    自动部署的新实例

    自动部署的新实例

    注意

    更改可能需要几分钟时间才能显示在图表中, (按 Ctrl + F5 定期刷新页面) 。 如果未看到任何更改,可以尝试以下操作:

    • 将负载测试的持续时间 (增加 为 10 分钟)
    • 在 Web 应用的自动缩放配置中减少 目标 CPU 范围的最大值和最小值
    • 使用 Azure Test Plans 在云中运行负载测试。 详细信息请参见此处

总结

在本动手实验室中,你已了解如何在 Azure 中设置应用程序并将其部署到生产 Web 应用。 首先使用 Entity Framework Code First 迁移 检测和更新数据库,然后使用 Git 部署新版本的站点,并回退到站点的最新稳定版本。 此外,你还了解了如何使用存储缩放应用,以将静态内容移动到 Blob 容器。