《Windows Azure Platform 系列文章目錄》
我們瀏覽Windows Azure項目。如下圖所示
可以看到Windows Azure的項目包含傳統的ASP.NET工程文件,如Default.aspx和Global.asax等。但是又多了一些東西:名為WeRole.cs的文件。其中定義了一個名為WebRole的類,它派生自RoleEntryPoint這個在Windows Azure SDK中定義的基類。
RoleEntryPoint這個類定義在Microsoft.WindowsAzure.ServiceRuntime命名空間中,位於Assebly Microsoft.WindowsAzure.ServiceRuntime.dll這個文件里面。它隨着Windows Azure SDK安裝到開發計算機中。
Microsoft.WindowsAzure.ServiceRuntime這個命名空間主要提供了對Windows Azure平台運行時的支持,開發人員可以通過它提供的一系列類來獲取或設置Windows Azure平台以及運行在其上的Role, Instance等相關屬性。其中RoleEntryPoint這個類主要負責Role的生命周期管理。
當一個Role被部署到Windows Azure平台的時候,Windows Azure底層的Fabric Controller會首先基於CSDEF文件分配指定類型的虛擬機,然后講部署包解壓縮到指定的目錄。如果是Web Role的話,Fabric Controller將會配置IIS中的網站;如果是Worker Role的話,Fabric Controller會啟動特殊的寄宿進程來運行Worker Role代碼。最后,Fabric Controller搜索Role里面派生自RoleEntryPoint的類,通過調用下面幾個方法對Role進行啟動和停止操作。
- OnStart方法: Role啟動的時候被調用。 OnStart方法中加入的代碼可以處理一些在Role啟動時的初始化工作。當返回True的時候表示啟動成功,否則表示啟動失敗。如果在調用過程中出現未捕獲的異常則會引發Role的重新啟動。
- Run方法:包含Role所執行的業務邏輯操作。Run方法在實現的時候必須是一個無限循環的邏輯,以保證部署之后Role始終處於運行狀態。和OnStart一樣,任何在Run方法中出現的未捕獲異常都會引發Role的重新啟動。
- OnStop方法:包含Role停止時的邏輯。OnStop中的代碼可供處理一些在Role停止的時候需要執行的收尾或回收工作,例如關閉數據庫連接、關閉文件等。需要注意的是,Fabric Controller會判斷Role關閉的時候是否超市(30秒)。因此在OnStop里面加入的業務邏輯需要在這個超時范圍之內完成,否則將會被視作異常。同樣的,任何在OnStop方法中拋出的異常也會引發Role的重新啟動。
在Visual Studio中打開WebRole.cs文件便可以看到Windows Azure模板創建的默認內容。可以在OnStart、Run和OnStop方法中加入一些調試信息來檢驗上述方法何時被調用,以及對應的狀態值。
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.WindowsAzure;
using Microsoft.WindowsAzure.Diagnostics;
using Microsoft.WindowsAzure.ServiceRuntime;
using System.Diagnostics;
namespace WebRole1
{
public class WebRole : RoleEntryPoint
{
public override bool OnStart()
{
// For information on handling configuration changes
// see the MSDN topic at http://go.microsoft.com/fwlink/?LinkId=166357.
Trace.WriteLine("Role Instance Start!");
return base.OnStart();
}
public override void Run()
{
Trace.WriteLine("Role Instance is Running!");
base.Run();
}
public override void OnStop()
{
Trace.WriteLine("Role Instance is Stop!");
base.OnStop();
}
}
}
在本地模擬器中運行此代碼,可以看到部署好項目之后Windows Azure模擬器自動打開瀏覽器展示這個網站。我們可以選擇Show Compute Emulator UI來查看運行結果。
對於Worker Role而言,Windows Azure項目也會自動生成一個名為WorkerRole.cs的文件,它定義了一個名為WorkerRole的類,同樣派生自RoleEntryPoint。而WorkerRole的內容和WebRole稍有不同,但是原理、調用次序和生命周期模型都是一樣的。
這里需要提示的是,對於一個Worker Role而言這個WorkerRole類是必不可少的。Fabric Controller需要這個類來確定如何調用並運行當前的Worker Role。但是對於Web Role而言,WebRole這個類是可選的。也就是說Windows Azure Web Role是可以在沒有派生自RoleEntryPoint的WebRole類的情況下在Windows Azure平台運行。在這種情況下,Fabric Controller會直接啟動ASP.NET的管道模型,從Global.asax文件的Application_Start方法啟動網站。但是如果應用程序需要Web Role在啟動網站之間完成一些操作,則必須創建這個WebRole類。
一般情況下,我們可以在WebRole.cs的OnStart()函數中,執行初始化的邏輯。
在WebRole.cs的Run()函數中,執行需要持久化運行的邏輯,比如后台運行的Windows Service等等。