导出 (0) 打印
全部展开

在 Azure 中构建在云服务中运行的应用程序

更新时间: 2014年10月

设计作为 Windows Azure 中的云服务的应用程序包含不同的计算资源,这些资源共同处理信息,彼此之间交互并与外部环境交互。Windows Azure 中的云服务最多可包含以下五个角色定义:

  • Web 角色 – 一个为 Internet Information Services (IIS) 7 和 ASP.NET 所支持的 Web 应用程序编程而自定义的服务组件。Web 角色旨在用作云服务的前端。

  • 辅助角色 - 一个服务组件,它对通用开发非常有用,并可以为 Web 角色执行后台处理。辅助角色经常用于长时间运行的非交互任务,但你可以承载任何类型的工作负荷。

你可通过以下信息来了解应用程序中的角色的使用:

在 Microsoft Azure 中,Web 角色包含 Internet Information Services (IIS) 所支持的网站或其他代码。通常,这是一个 ASPX 页或 Web 服务,但你可以使用其他 Web 开发工具(如超文本预处理器 (PHP))来提供服务。Windows Azure 中的 ASP.NET Web 角色与 ASP.NET Web 应用程序的相似之处在于,它是用 .aspx 文件和源代码生成的,但它还包括允许它在 Windows Azure 环境中运行的其他工具。有关 ASP.NET Web 项目的更多信息,请参见 ASP.NET Web 项目

Web 角色还可以通过 basicHttpBinding 架构来托管使用 HTTP 协议的大多数其他应用程序,如 WCF 服务。有关更多信息,请参见 basicHttpBinding。Windows Azure Tools for Microsoft Visual Studio 提供的模板可用于简化适合这些方案的应用程序的创建过程。若要下载这些工具,请参阅 Windows Azure 下载

Web 角色和辅助角色之间的主要差异是对 IIS 的支持。Web 角色被配置为通过 IIS 托管网站和 Web 应用程序呈现界面。相反,辅助角色相当灵活且是开放式的。大多数类型的应用程序可在辅助角色中托管,包括那些使用非 .NET 语言或运行非托管代码的应用程序。

下面是两种角色之间的一些差异:

  • Web 角色为通过 IIS 呈现面向用户的前端提供支持。虽然可使用辅助角色编写代码来呈现用户界面,但使用 Web 角色可更轻松地创建此类应用程序。

  • 在 Web 角色中,IIS 控制线程处理的效率。在辅助角色中,你必须自行处理线程问题。

  • 你必须提供一种启动处理时要调用的运行方法。

  • Web 角色和辅助角色的安全边界是不同的。在 Web 角色中,默认情况下会将证书的访问控制列表 (ACL) 设置为支持 IIS 和网络服务。在使用辅助角色时,你必须将 ACL 设置为支持你的应用程序所需的权限。

辅助角色通常使用的任务类型包括:

  • 无需用户等待的长时间运行的异步任务。

  • 承载不需要用户界面的应用程序服务。

  • 侦听队列的后台服务。

  • 正在运行的基于 TCP 的服务。

  • 涉及大量计算的作业。

在 Windows Azure SDK 中,Web 角色可以访问 IIS 的完整功能。当你为 Windows Azure 创建某个应用程序时,该应用程序会配置为使用 IIS 的完整功能。有关 Web 角色和 IIS 的其他信息,请参见配置 Web 服务器以提供内容服务 (IIS 7.0)

Web 角色包括:

  • 支持单个 Web 角色实例中的多个网站和应用程序。有关配置 Web 角色以托管多个站点的更多信息,请参见为多个网站配置 Web 角色

  • 可以为启动配置任务编写脚本。有关启动任务的更多信息,请参见在 Azure 中配置 IIS 组件

  • 直接在 IIS 中运行网站和应用程序。

  • 以标准 IIS 方式使用应用程序域。

可以按照以下信息管理角色,以决定其在 Windows Azure 中启动、运行或停止时的具体响应:

RoleEntryPoint 类包含由 Windows Azure 在启动、运行或停止 Web 角色或辅助角色时调用的方法。你可以选择重写这些方法来管理角色初始化、角色关闭序列或角色执行线程。辅助角色必须扩展 RoleEntryPoint 类。对于 Web 角色,扩展 RoleEntryPoint 操作是可选的。

在扩展 RoleEntryPoint 时,应该了解方法的以下行为:

  • OnStartOnStop 方法返回布尔值,因此可以从这些方法返回 false

    如果你的代码返回 false,则该角色进程将突然终止,而不会运行可能拥有的任何关闭序列。一般来说,应该避免从 OnStart 方法返回 false

  • RoleEntryPoint 方法重载中未捕获的任何异常都被视为未处理的异常。

    如果某个生命周期方法中发生异常,则 Windows Azure 将引发 UnhandledException 事件,然后进程会终止。在角色脱机后,Windows Azure 将重新启动该角色。如果出现未处理的异常,则不会引发 Stopping 事件,并且不会调用 OnStop 方法。

如果角色未启动,或者在初始化、繁忙和停止状态之间循环,可能是因为每次角色重新启动生命周期事件时,你的代码都引发了未处理的异常。在这种情况下,请使用 UnhandledException 事件来确定异常的原因并采用适当的方法进行处理。角色也可能会从 Run 方法返回,从而促使角色重新启动。有关部署状态的更多信息,请参见导致角色回收的常见问题

note备注
如果你使用 Azure Tools for Microsoft Visual Studio 开发应用程序,则角色项目模板将自动在 WebRole.cs 和 WorkerRole.cs 文件中为你扩展 RoleEntryPoint 类。

可以使用 RoleEntryPoint 类的以下方法来影响角色的生命周期:

当角色实例通过 Windows Azure 联机时,就会调用 OnStart 方法。OnStart 代码执行时,角色实例被标记为“忙碌”,并且负载平衡器不会将外部通信引导到该角色。你可以重写此方法以执行初始化工作,例如实现事件处理程序和启动 Windows Azure 诊断。有关诊断的更多信息,请参见使用 Azure 诊断收集日志记录数据

如果 OnStart 返回 true,则该实例已成功初始化,并且 Windows Azure 已调用 RoleEntryPoint.Run 方法。如果 OnStart 返回 false,则角色将立即终止,而不执行任何计划中的关闭序列。

下面的代码示例演示如何重写 OnStart 方法。当角色实例启动并设置将日志记录数据传输到存储帐户时,此方法将配置并启动诊断监视器:


public override bool OnStart()
{
    var config = DiagnosticMonitor.GetDefaultInitialConfiguration();

    config.DiagnosticInfrastructureLogs.ScheduledTransferLogLevelFilter = LogLevel.Error;
    config.DiagnosticInfrastructureLogs.ScheduledTransferPeriod = TimeSpan.FromMinutes(5);

    DiagnosticMonitor.Start("DiagnosticsConnectionString", config);

    return base.OnStart();
}

OnStop 方法在 Windows Azure 使角色实例脱机之后并且在进程退出之前被调用。可以重写此方法来调用角色实例所需的代码,以便彻底关闭此角色实例。

Important重要提示
如果出于某些原因而不是用户启动的关闭而调用 OnStop 方法,则此方法中运行的代码必须在有限的时间内完成。这段时间过后,进程将被终止,因此你必须确保 OnStop 方法中的代码能够快速运行或者不必完全运行。引发 Stopping 事件后,会调用 OnStop 方法。

可以重写 Run 方法以便为角色实例实现长时间运行的线程。

重写 Run 方法不是必需的;默认实现可以启动一个永远休眠的线程。如果你重写 Run 方法,你的代码应会被无限期阻止。如果 Run 方法返回,角色将正常自动回收;也就是说,Windows Azure 将引发 Stopping 事件并调用 OnStop 方法,因此在角色脱机之前可能执行了你的关闭序列。

除了 RoleEntryPoint 类提供的方法以外,还可以使用 ASP.NET 生命周期方法来管理 Web 角色的初始化和关闭序列。如果要将现有的 ASP.NET 应用程序迁移到 Windows Azure,此方法可能有利于解决兼容性问题。ASP.NET 生命周期方法将从 RoleEntryPoint 方法中调用。Application_Start 方法将在 RoleEntryPoint.OnStart 方法结束后调用,而 Application_End 方法将在 RoleEntryPoint.OnStop 方法调用前调用。

Windows Azure 中最常用的应用程序模式之一是,Web 角色接收传入请求,然后使用 Windows Azure 队列将它们传递给辅助角色的实例以进行处理。辅助角色会定期查看队列中的消息,了解是否有工作要做。如果有,则其将执行任务。通常,Web 角色会从永久性存储中检索已完成的工作,如 Blob 或表。下图演示此典型设计模式。

角色通过队列进行通信

有关使用存储服务的更多信息,请参见 存储

显示:
© 2014 Microsoft