原文 在 Visual Studio 2010 中开发和部署 Windows Azure 应用程序
将应用程序或服务部署到 Microsoft 云服务平台 Windows Azure 的原因有很多。例如,只为使用的内容付费从而可降低操作和硬件成本、构建几乎能无限缩放的应用程序、巨大的存储容量、地理位置等等,不胜枚举。
只有当开发人员实际使用平台时,平台才会引起业界的广泛关注。开发人员是任何平台版本的核心和灵魂 – 一版平台真正的成功就是有大量开发人员在该平台上部署应用程序和服务。Microsoft 始终致力于通过 Visual Studio 为各种各样的平台(无论是旧有的还是新兴的)提供最佳的开发体验,而对于云计算,也会一如既往。Microsoft 在 Visual Studio 2010 和 Visual Web Developer 2010 Express 中新增了直接生成 Windows Azure 应用程序的支持。
本文将引导您在整个 Windows Azure 应用程序开发生命周期中使用 Visual Studio 2010。请注意,即使您目前不是 Visual Studio 用户,也能够通过 Visual Web Developer 2010 Express 中的 Windows Azure 支持免费评估 Windows Azure 开发情况。
启动 Visual Studio 2010,单击“文件”菜单,选择“新建”|“项目”,打开“新建项目”对话框。在“已安装的模板”|“Visual C#”(或“Visual Basic”)下,选择“云”节点。这将显示“启用 Windows Azure Tools”项目模板,单击该模板后,将显示一个页面,其中包含用于安装 Windows Azure Tools for Visual Studio 的按钮。
安装 Windows Azure Tools 之前,确保在您的计算机上安装 IIS。云的本地开发模拟使用 IIS。安装 IIS 的最简单方式是使用 microsoft.com/web 上提供的 Web 平台安装程序。选择“平台”选项卡,并单击以在 Web 服务器中包括推荐的产品。
下载并安装 Windows Azure Tools,并重新启动 Visual Studio。您将看到,“启用 Windows Azure Tools”项目模板会替换为“Windows Azure 云服务”项目模板。选择此模板,打开图 1 中显示的“新建云服务项目”对话框。利用此对话框可以向云服务中添加角色。
图 1 向新建云服务项目中添加角色
Windows Azure 角色是指在云中运行的可单独缩放的组件,云中的每个角色实例都分别对应于一个虚拟机 (VM) 实例。
有两种类型的角色:
举一个实例,我的云服务中可能有一个 Web 角色,该角色实现我的用户可通过 URL(例如 http://[somename].cloudapp.net)访问的网站。我还可能有一个工作线程角色,它处理该 Web 角色使用的一组数据。
我可以单独设置每个角色的实例数,例如三个 Web 角色实例和两个工作线程角色实例,相应地,在运行 Web 角色的云中有三个 VM,以及在运行工作线程角色的云中有两个 VM。
可以使用“新建云服务项目”对话框来创建具有任意数量 Web 角色和工作线程角色的云服务,并为每个角色使用不同的模板。可以选择创建各个角色时要使用的模板。例如,可以使用“ASP.NET Web 角色”模板、“WCF 服务角色”模板或“ASP.NET MVC 角色”模板来创建 Web 角色。
将角色添加到云服务并单击“确定”后,Visual Studio 将创建一个解决方案,该解决方案中包括云服务项目以及与所添加的每个角色相对应的项目。图 2 显示了一个示例云服务,其中包含两个 Web 角色和一个工作线程角色。
图 2 为云服务中的角色创建的项目
Web 角色就是 ASP.NET Web 应用程序项目,两者只有几点不同。 WebRole1 包含对以下程序集的引用,这些程序集不能由标准的 ASP.NET Web 应用程序引用:
WebRole.cs 文件包含用于设置日志记录和诊断的代码,而且在 web.config/app.config 中包含一个跟踪侦听器,这样就能支持您使用标准的 .NET 日志记录 API。
云服务项目充当部署项目,列出云服务中包含的角色,以及定义和配置文件。它会提供 Windows Azure 特有的运行、调试和发布功能。
项目创建完成之后,可以轻松地在云服务中添加或删除角色。若要向此云服务中添加其他角色,请右键单击云服务中的“角色”节点,并选择“添加”|“新建 Web 角色项目”或“添加”|“新建工作线程角色项目”。选择其中任一选项将打开“添加新角色”对话框,您可在其中选择添加角色时使用哪个项目模板。
通过右键单击“角色”节点,在解决方案中选择“添加”|“Web 角色项目”,并选择要作为 Web 角色关联的项目,您可以向解决方案中添加任何 ASP.NET Web 角色项目。
若要删除,只需选择要删除的角色并按 Delete 键即可。随后便会删除项目。
您也可以右键单击“角色”节点下的角色,并选择“属性”打开该角色的“配置”选项卡(请参见图 3)。利用“配置”选项卡可以轻松地在 ServiceConfiguration.cscfg 和 ServiceDefinition.csdef 文件中添加或修改值。
图 3 配置角色
在针对 Windows Azure 开发时,解决方案中的云服务项目必须是启动项目才能成功完成调试。当某个项目在解决方案资源管理器中显示为粗体时,该项目即为启动项目。若要设置活动项目,请右键单击相应项目,并选择“设为启动项目”。
既然针对 Windows Azure 设置了解决方案,您就可以利用 ASP.NET 技能来开发应用程序。
在进行编码时,您将需要使用能让应用程序实现可缩放的 Windows Azure 模型。若要处理进入应用程序的额外流量,可以增加每个角色的实例数。这意味着请求将在角色之间实现负载平衡,并且将影响您设计和实现应用程序的方式。
特别是,它控制您访问和存储数据的方式。许多熟悉的数据存储和检索方法都不可缩放,因此不适合于云。例如,不应在云中使用将数据存储在本地文件系统上的方法,因为这种方法不能缩放。
若要利用云的缩放特性,您需要了解新的存储服务。Windows Azure Storage 提供了可缩放的 Blob、队列和表存储服务,Microsoft SQL Azure 提供了基于云的关系数据库服务(基于 SQL Server 技术构建)。Blob 用于命名文件以及元数据的存储。队列服务提供了可靠的存储和消息传送。表服务为您提供了结构化存储,该存储中的表是一组实体,其中每个实体均包含一组属性。
为了帮助开发人员使用这些服务,Windows Azure SDK 附带了一个 Development Storage 服务,该服务模拟这些存储服务在云中的运行方式。也就是说,开发人员可使用与针对云存储服务相同的 API 来编写其针对 Development Storage 服务的应用程序。
为了以本地方式在 Windows Azure 上演示运行和调试,让我们使用 code.msdn.microsoft.com/windowsazuresamples 中的示例之一。此 MSDN 代码库页包含许多代码示例,可帮助您开始生成运行于 Windows Azure 上的可缩放 Web 应用程序和服务。下载用于 Visual Studio 2010 的示例,然后将所有文件提取到一个可访问位置,例如您的 Documents 文件夹。
Development Fabric 需要在提权模式下运行,因此请以管理员身份启动 Visual Studio 2010。然后,导航到您提取了示例的位置,并打开 Thumbnails 解决方案,该解决方案是一个示例服务,演示 Web 角色和工作线程角色的使用,并演示使用 StorageClient 库与队列和 Blob 服务交互。
打开该解决方案时,您将看到三个不同的项目。Thumbnails 是关联两个角色(Thumbnails_WebRole 和 Thumbnails_WorkerRole)的云服务。Thumbnails_WebRole 是 Web 角色项目,该项目向用户提供用于上载照片和向队列中添加工作项的前端应用程序。Thumbnails_WorkerRole 是工作线程角色项目,该项目从队列中提取工作项,并在指定的目录中创建缩略图。
在 Default.aspx.cs 文件中,向 submitButton_Click 方法中添加一个断点。此断点将在用户选择图像并单击页面上的“提交”时命中。
protected void submitButton_Click( object sender, EventArgs e) { if (upload.HasFile) { var name = string.Format("{0:10}", DateTime.Now.Ticks, Guid.NewGuid()); GetPhotoGalleryContainer().GetBlockBlob(name).UploadFromStream(upload.FileContent);
现在向工作线程文件 WorkerRole.cs 的 Run 方法中添加断点,放在紧靠用于从队列中检索消息并检查消息是否实际存在的代码后面的位置。此断点将在 Web 角色将消息置于由工作线程检索的队列中时命中。
while (true) { try { CloudQueueMessage msg = queue.GetMessage(); if (msg != null) { string path = msg.AsString
若要调试应用程序,请转到“调试”菜单并选择“启动调试”。Visual Studio 将生成项目,启动 Development Fabric,初始化 Development Storage(如果第一次运行),封装部署,附加到所有角色实例,然后启动指向 Web 角色的浏览器(请参见图 4)。
图 4 运行 Thumbnails 示例
此时,您将看到浏览器指向 Web 角色,并且任务栏的通知区域显示 Development Fabric 已启动。Development Fabric 是一个模拟环境,它采用与在真实云中的运行方式非常类似的方式在您的计算机上运行角色实例。
右键单击任务栏中的 Windows Azure 通知图标,并单击“显示 Development Fabric UI”。这将启动 Development Fabric 应用程序本身,利用它可针对部署执行各种操作,例如查看日志,以及重新启动和删除部署(请参见图 5)。请注意,Development Fabric 包含一个新的部署,它承载一个 Web 角色实例和一个工作线程角色实例。
图 5 Development Fabric
请看 Visual Studio 所附加到的进程(“调试”/“Windows”/“进程”);您将注意到有三个进程:WaWebHost.exe、WaWorkerHost.exe 和 iexplore.exe。
WaWebHost(Windows Azure Web 实例宿主)和 WaWorkerHost(Windows Azure Worker 实例宿主)分别承载 Web 角色和工作线程角色实例。在云中,每个实例均承载于其自己的 VM 中,而在本地开发模拟上,每个角色实例均承载于单独的进程中,并且 Visual Studio 会附加到所有这些实例。
默认情况下,Visual Studio 使用托管调试器进行附加。如果要使用另一个调试器(比如本机调试器),请从对应角色项目的“属性”中选择该调试器。对于 Web 角色项目,调试器选项位于项目属性的“Web”选项卡下。对于工作线程角色项目,该选项位于项目属性的“调试”选项卡下。
默认情况下,Visual Studio 使用脚本引擎附加到 Internet Explorer。若要调试 Silverlight 应用程序,您需要从 Web 角色项目的“属性”中启用 Silverlight 调试器。
浏览到希望上载的图像,并单击“提交”。Visual Studio 将在 submitButton_Click 方法内所设置的断点处停止,同时为您提供期望从 Visual Studio 中使用的所有调试功能。按 F5 继续;submitButton_Click 方法将为文件生成唯一名称,将图像流上载到 Blob 存储,并在队列上添加包含文件名的消息。
现在,您将看到 Visual Studio 在工作线程角色中设置的断点处暂停,这意味着工作线程从队列中收到了消息,并准备处理图像。同样,您将拥有期望的所有调试功能。
按 F5 继续,工作线程将从消息队列中获取文件名,从 Blob 服务中检索图像流,创建缩略图图像,并将新的缩略图图像上载到 Blob 服务的缩略图目录,Web 角色将显示该目录。
既然已通过本地方式创建、编辑和调试了应用程序,您即已准备好将其部署到云。将应用程序部署到 Windows Azure 时,可遵循下面这个很好的过程:
在第一个阶段中,您可以使用 Development Fabric 和 Development Storage 作为 Windows Azure 云基础结构的替代项在本地计算机上进行所有开发。您甚至无需网络连接 – 您可以采用完全脱机的方式开发和调试 Windows Azure 应用程序或服务。您将可能在此第一阶段中进行 70% 的项目开发。
在第二个阶段中,您将本地存储替代项替换为真正的 Windows Azure Storage,但保留在本地 Development Fabric 中执行 Windows Azure 应用程序代码的调试和诊断优点。您可以在源代码中设置断点,逐行单步执行源代码,计算表达式,并在 Windows Azure 应用程序与云存储交互时检查调用堆栈。您将可能在此阶段中花费 20% 到 25% 的项目周期,同时细化代码并依据真实的异步操作进行测试。
到您进入第三个阶段时,您的 Windows Azure 应用程序应差不多已完成。功能和代码应已完成,但未修复缺陷。您在此阶段中的主要侧重点是测试和性能优化。当 Windows Azure 应用程序在云中执行时,您将没有足够的时间来进行源代码调试,因此将必须依靠诊断日志记录。
当您将全新的 Windows Azure 应用程序上载到 Windows Azure 云时,您可能不希望目标 URL 上的所有人都看到该应用程序。Windows Azure 托管服务具有在同一托管服务内包含多个部署的概念。每个 Windows Azure 托管服务都有一个专用暂存部署区域,您可以在该区域中不受干扰地在云中测试代码,并且有一个公共生产部署区域,您可在该区域中发布测试过的代码供客户使用。
只能通过前缀为系统所分配 GUID 的唯一 URL 来访问暂存部署。生产部署可以是自定义域名映射的目标,以便于访问。
既然 Thumbnails 服务正在本地计算机上的 Developer Fabric 中运行,那么让我们将其升级到依据云中的 Windows Azure Storage 帐户工作。这涉及到获取存储帐户,并更改配置以依据您的存储帐户运行 Thumbnails 服务。通过以本地方式执行但为数据使用云存储,可以很好地确保您的代码在承载于 Windows Azure 之上时能够运行。
首先,导航到 Windows Azure 开发人员门户 (windows.azure.com),并使用您的 Live ID 登录。从该页上选择“新建服务”,并单击“存储帐户”。在“创建服务”页中(请参见图 6),填写存储帐户的友好名称(此名称不是服务/域名;将在下一页上提示您输入服务/域名)。(可选)输入项目描述。然后在下一页上填写服务/域名(请参见图 7)。此域名是全局的,因此您可能需要对其稍加改动,以得到尚未被其他服务使用的名称。确保单击“检查可用性”以测试唯一性。
图 6 配置存储服务
图 7 配置存储域
通过创建相关性组来确保您的存储和使用该存储的托管服务尽可能位于同一数据中心中,这是个好主意。相关性组也可以指定地理区域首选项,以便服务和存储尽可能靠近您的目标访问群体,从而最大程度地缩短网络传输时间。
单击“创建”,您将看到新存储帐户的摘要页。
现在,您需要指示 Thumbnails 服务使用新存储帐户来存储其缩略图和图像。在 Visual Studio 解决方案资源管理器中的“角色”下双击“Thumbnails_WebRole”节点,以打开其属性页。选择“设置”选项卡,选择“DataConnectionString”,并单击位于网格行最右边的编辑按钮。这将打开“存储连接字符串”对话框,如图 8 中所示。
图 8 存储连接字符串属性
“使用开发存储”是新 Azure 项目的默认值。单击“输入存储凭据”,然后输入您的存储服务详细信息。在“帐户名”字段中,键入您在创建存储服务时输入的服务/域名。这是您的域的第一部分,示例中为 thumbnails1138(全部小写)。
在“帐户密钥”字段中,输入显示在存储服务摘要网页上的主访问密钥。可以在浏览器中选择并复制密钥文本,并将其粘贴到 AccountSharedKey 编辑框中。
请注意,次要访问密钥为存储帐户提供了与主访问密钥相同的访问权限,并生成作为主访问密钥万一泄漏时的备份。重新生成密钥将会使旧密钥失效,同时关闭仍然使用旧密钥的任何人的存储访问权限。
将连接终结点集保留为使用默认 HTTPS 终结点,并单击“确定”。
为“角色”下的“Thumbnails_WorkerRole”也重复这些步骤,以便 Web 角色和工作线程角色将与同一存储服务通信。如果有多个角色要更新,您可以将连接字符串值复制到剪贴板,然后只需将其粘贴到每个其他角色属性页的 DataConnectionString 值单元格中,从而可节省一点时间。
将 Web 角色和工作线程角色切换为使用 Windows Azure 存储之后,在 Visual Studio 中按 F5 调试云服务,并确保所有功能均正常工作。
您将看到所调试的网页 URL 仍然以本地方式承载,但缩略图的 URL(可在其“属性”对话框中看到)现在指向 Windows Azure Storage。
请注意,此开发阶段(带有云存储的本地服务)将最有可能在三个部署阶段中性能最差。阶段 1(本地/本地)将非常迅捷,因为一切都是在同一框架中进行的,并且全部访问群体只有一个(即您自己!)。阶段 3(云/云)将具有云规模硬件和数据中心相关性的优点。但是,阶段 2 (本地/云)将执行的代码会合理假设其存储在附近,但事实上数据可能距本地执行环境很多个网络跃点。
不要在本地/云配置中评估应用程序的性能。然而,您可以将该网络迟滞转变为您的优势:使用此阶段作为压力测试来查看您的代码如何处理来自其存储服务的过长响应时间。如果您使用实际上应为异步的同步调用处理了某些内容,您将可能注意到它非常快。
在本地/云配置中将一切准备就绪后,您即可将代码部署到 Windows Azure 托管服务。
若要创建完全托管的服务,请返回到 Windows Azure 开发人员门户并用您的 Live ID 登录。单击“新建服务”,然后单击“托管服务”。这将打开一个页面,您可以在其中指定开发人员门户使用的项目友好名称和描述。输入服务标签,并选择输入服务描述。单击“下一步”。现在,您可以输入托管服务项目的域名(请参见图 9)。设置相关性组以与之前使用存储服务创建的 Thumbnails 相关性组匹配。创建了项目之后,您将看到项目的摘要页。
图 9 配置托管服务
若要从 Visual Studio 中部署项目,请在解决方案资源管理器中右键单击 Thumbnails 项目节点,并选择“发布”。此命令将生成 Windows Azure 应用程序二进制文件及相关文件的程序包,打开 Windows 资源管理器以显示在其中生成该程序包的本地目录,并启动默认 Web 浏览器以浏览到开发人员门户。
从开发人员门户网页中,导航到 Thumbnails 托管服务的摘要页,从“暂存”下单击“部署”以打开“暂存部署”页(请参见图 10)。将在此页中指定要上载的程序包和配置文件。
图 10 选择要部署的程序包
您可以将路径从 Visual Studio 打开的 Windows 资源管理器窗口复制到“打开”对话框,从而可轻松地选择服务程序包 (.cspkg) 和服务配置文件。
门户随后会上载程序包并将您的云服务部署到暂存,从而将您的角色置于“已分配”状态。这意味着您的 Windows Azure 应用程序已配置了数据中心硬件,但尚未安排运行。
若要在暂存区域中测试云服务,您需要运行它。单击“运行”。这会将您的 Web 角色置于“正在初始化”状态。当该 Web 角色准备就绪后,状态将变为“已启动”。
请注意,已计划在未来的更新中使从 Visual Studio 直接部署到云更为轻松,但即使当这些功能准备就绪时,此过程将仍然保持有效。
启动了您的角色后,即可通过导航到暂存 URL(以 GUID 开头的 cloudapp.net URL)来进行测试。
在数据中心中设置应用程序的过程涉及到在后台进行的许多大幅提升。请至少为应用程序留出 10 分钟来从“正在初始化”过渡到“已启动”。现在,您是否很高兴在本地计算机上有 Developer Fabric?
对暂存上的云服务感到满意后,您可以通过单击图 11 中所示的按钮将该云服务提升到生产。
图 11 提升按钮
当您的部署的详细信息显示在页面的“生产”一侧时,服务将在其最终 URL 处启动并运行。
如果需要测试应用程序的修补程序,或只是需要采用与正在运行的生产部署并行的方式继续进行开发,则可以将新的程序包上载到暂存,并通过暂存 URL 对其进行测试。提升到生产的过程实际上是交换:暂存转移到生产,而生产中的内容则进入到暂存中。
尽管您能够直接上载到生产,但强烈建议始终首先部署到暂存并执行某种程度的验收测试,然后再将其推送到生产。
请注意,多个部署将默认使用同一存储服务 – 如果在生产和暂存之间需要数据隔离(举例来说,需要数据隔离以便暂存能够擦除其数据库而不影响生产数据),您将需要修改每个部署的存储绑定,然后再部署它们。这通常是在将暂存提升到生产之前通过使用两组存储并将生产数据迁移到暂存来实现的。
如果要启动预期会产生额外负载的服务的额外实例,或关闭未使用的实例,您可以通过实时修改部署配置来实现。您不必重新部署整个程序包,只需重新部署服务配置文件即可。在门户中,单击“配置”,通过上载 Visual Studio 创建的新服务配置文件或使用开发人员门户提供的编辑器来更新服务配置 (cscfg)。
现在让我们向 Thumbnails 应用程序中添加一个 HTTPS 终结点。此过程包含三个步骤。您需要配置终结点、配置证书并上载证书。
若要配置终结点,请通过在解决方案资源管理器中的“角色”节点下右键单击“Thumbnails_WebRole”节点并选择“属性”来打开 Web 角色的配置 UI。切换到“终结点”选项卡,并单击复选框以选择“HTTPS”。这将会添加 HTTPS 终结点,但不会指定证书。
切换到“配置”页,并取消选中“启动浏览器:HTTP 终结点”选项。通过取消选中此选项,在运行或调试云服务时将只会为 HTTPS 终结点启动默认浏览器。
在 Visual Studio 中,单击“调试”|“启动调试”以在本地开发模拟上打包和运行云服务。开发模拟始终使用颁发给 127.0.0.1(对应于本地主机)或由其颁发的自签名证书。由于证书不受信任,因此 Web 浏览器在启动时将出现证书错误。这是正常的。单击“继续浏览此网站(不推荐)”以浏览该网站。
若要使证书受信任并因此不会出现证书错误,您可以将该证书安装到“受信任的根证书颁发机构”证书存储。只有在您已适当了解了安全影响时才应这样做。
若要配置证书以在云中使用,您需要一个将上载到云的证书,并需要针对角色配置该证书。为了便于本文说明,我们将创建和使用一个自签名证书。通过打开 IIS 管理器,选择“服务器证书”,并在对话框最右边的“操作”标题下单击“创建自签名证书”,从而创建一个自签名证书。创建该证书后,单击“导出”以将该证书导出为 .pfx 文件。
导航到 Windows Azure 开发人员门户,并选择要部署到的托管服务组件。在“证书”标题下,选择“管理”。通过输入 .pfx 文件的名称以及您在导出步骤中输入的对应密码来上载证书。将证书安装到托管服务组件后,复制证书的指纹。
若要配置证书,请返回到 Visual Studio,打开 Thumbnails_WebRole 配置 UI,单击“证书”选项卡并单击“添加证书”。为证书指定一个名称(例如,sslCert),粘贴输入指纹,并保留存储位置和名称的默认值 LocalMachine 和 My。
利用证书配置页,可以为给定角色指定应将什么证书安装到该角色的 VM 实例,以及将这些证书安装在哪些存储中。换言之,可以为您希望放在云中的 VM 上的任何证书(而不仅仅是 SSL 证书)使用这个相同的过程。
最后,切换到“终结点”选项卡,并为 HTTPS 证书选择“sslCert”。
现在部署应用程序。您现在将能够通过 HTTP 和 HTTPS 访问您的网站。由于我们上载了自签名证书,因此在浏览到您的 HTTPS 终结点时浏览器将显示证书错误。使用真正签名的证书将可解决此问题。
利用 Windows Azure Tools 和 Visual Studio 2010 可以轻松地创建、编辑、配置、调试和部署运行于 Windows Azure 上的应用程序。它们允许您利用您的 ASP.NET 和 Visual Studio 现有技能。
Windows Azure Tools 外接程序设计为同时适用于 Visual Studio 2010 和 Visual Studio 2008。安装 Windows Azure Tools for Visual Studio 2008 的最简便方式是使用可在 microsoft.com/web 获得的 Web 平台安装程序。确保在选项中添加开发人员工具方案。
有关 Windows Azure 的最新消息和信息,请参见 windowsazure.com 和 blogs.msdn.com/jnak。
Hani Atassi 是 Windows Azure Tools 团队的软件工程师。在 Atassi 开发云工具之前,他曾经投身于 Windows Vista 和 Microsoft.com 的开发。
Danny Thorpe 是 Windows Azure Tools 团队的首席软件工程师。在过去的生涯中,他曾经是 Google 对 Google Gears 有突出贡献的创立者,并在 Borland 担任过 Delphi 编译器架构师。
Jim Nakashima 是 Windows Azure Tools 团队的项目经理,工作重点是为 Windows Azure 建立端到端开发人员体验。在对云的不可估量的可能性产生兴趣之前,Nakashima 曾经有多年从事于 Windows Presentation Foundation 和 Silverlight Designer 及工具的经验。
衷心感谢 以下技术专家,为本文提供审校意见:Anson Horton 和 Gus Perez