Window Azure 中的Web Role詳解

        Web Role主要是用來處理HTTP或HTTPS請求的,顯然這是最爲重要的一個角色。目前在Window Azure中的Web Role實例運行在一個包含IIS的虛擬機中。Web Role可以用來構建Web應用和Web服務。開發人員可以使用像ASP.NET、WCF等.NET技術,也可以使用像PHP這樣可以通過IIS的FastCGI功能模塊支持的非.NET技術來創建Web Role服務。雖然其它角色如worker Role 也可以通過設置來偵聽HTTP和HTTPS請求,但是Web Role是默認支持並且是專門設計來處理這些web請求的。如果一個服務包含多個Web Role,那麼它們需要採用不同的HTTP和HTTPS端口。

         理解Web Role

         從角色定位的角度來看,Web Role主要用來構建Web應用和基於WCF的Web服務。與Worker Role相比,Web Role主要是多了對IIS的支持。Windows Azure會維護和配置包括IIS在內的服務運行環境,開發人員只需要按照Web Role的編程要求構建應用,Windows Azure就能夠完成應用所有的自動化部署和配置。

         Web Role項目結構是怎樣的呢?對於熟悉傳統的基於IIS的Web應用編程的開發人員來說,構建Web Role服務將是一個相對簡單的工作,因爲Web Role服務實現的主要組成部分與傳統Web應用非常相似。如果使用Visual Studio的Web Role 模版創建項目,那麼這個項目中會自動包含三個與Windows Azure 相關的引用。

1、Microsoft.WindowsAzure.Diagnostics 主要包含診斷和日誌相關的類;

2、Microsoft.WindowsAzure,ServiceRuntime 主要包含與角色實例生命週期控制以及配置信息訪問相關的編程接口類;

3、Microsoft.WindowsAzure.StorageClient 主要包含使用REST 方式訪問 Windows Azure 存儲,包括 Blob、Table和Queue等的類。

        開發人員自然可以通過 Visual Studio 提供的Web Role 模版創建一個新的Web Role 應用,但如果用戶已有一個傳統的 Web應用,那麼能否把它轉換成一個Web Role 應用呢?答案是肯定的。從項目結構上看,這個轉換操作相對簡單,但是如果需要應用Windows Azure的一些特性,就需要根據它的編程接口進行調整。Windows Azure 角色在狀態保存、數據存儲等方面有一些特殊要求。 

        實際上,Windows Azure 項目上主要是包含了服務模型的信息以及項目之間的關聯信息,具體的服務邏輯都是由各個角色項目來實現的。從項目依賴關係來看,Windows Azure 項目需要依賴它所包含的那些角色項目。

       瞭解Web Role 運行環境

       大部分開發人員都是從Web Role 開始進行 Windows Azure 編程的,因此進一步瞭解 Web Role 的細節有助於理解 Windows Azure 的計算服務。接下來我們看一下 Web Role 實例具體的運行環境,它包括底層的虛擬機、IIS服務等。

        在Windows Azure剛發佈時, Web Role 的運行環境對外就像一個黑盒了。因爲內部運行環境的細節沒有對外公佈。Web Role 那時候只支持託管代碼,而且只能運行在部分信任模式下;開發人員也沒有一個簡單的方式來了解 Web Role 實例的具體運行環境的情況。但是微軟後來發佈了 Windows Azure 的一些新特性,比如代碼完全信任設置和管理模式中的遠程桌面等,都可以幫助開發人員瞭解不同角色實例(包括 Web Role)的運行環境。

       現在 Windows Azure 的角色可以設置運行在完全信任模式下,比如對於 Web Role,開發人員只需要在相應服務定義文件中進行如下設置即可。

<WebRole name="WebRole1" endableNativeCodeExecution\"true">

      完全信任模式下使幾種代碼訪問場景稱爲可能。

      1、調用非.NET代碼。除了託管代碼之外,許多開發人員已經寫了許多本地代碼,尤其在處理一些特殊任務時。完全信任設置使得服務角色可以通過創建新的進程或通過平臺調用服務方式調用本地代碼。

      2、使用一些需要完全信任的.NET庫。Windows Azure 原先不能調用那些需要完全信任權限的.NET庫,現在就沒有這個限制了。

      3、通過命名管道進行進程間通信。如果服務創建了不同的進程,現在則可以通過命名管道讓它們進行通信。

     實際上,讓角色可以創建本地進程是 Windows Azure 支持不同語言環境的一個重要前提,後面我們會發現在配置PHP支持時就需要設置完全信任訪問權限。另外,需要注意的是,雖然有了完全信任權限,但是角色服務在 Windows Azure 上並不是以管理員身份運行的,因此在有一些資源如註冊表等的修改上還是有一些限制的。這是從安全角度出發進行的必要限制。

     那如何瞭解 Web Role 實例運行環境的一些信息呢? 我們知道,在通常的 Windows 環境中可以通過命令行的方式執行一些命令來了解系統環境。完全信任模式可以讓開發人員在Web Role 角色中通過System.Diagnostics.Process類生成與一個 cmd.exe 進程,然後把需要執行的命令作爲參數傳遞給它並把命令執行結果返回給客戶端。另外,開發人員還可以通過System.Environnment 類和 Microsoft.Win32.Registry 類來得到環境的一些具體信息。

     Windows Azure 提供的遠程桌面使得開發人員有一個更爲直觀的方式來了解角色環境。在 Visual Studio 中爲服務角色配置遠程桌面訪問的步驟比較簡單,只需要在發佈應用時選擇配置遠程桌面連接如圖:



       然後在配置窗口中爲遠程桌面設置相應的用戶們和口令即可。在這個過程中 Visual Studio 會自動生成一個證書,並且自動修改相應的服務定義文件和服務配置文件。開發人員可以通過 Windows Azure 管理門戶網站把上面步驟中生成的證書上傳到對用服務的證書目錄中。

       在服務定義文件中主要是對<Imports>元素,它描述了需要爲角色運行環境增加的導入模塊。這是在 Windows Azure SDK 版本 1.3以後增加的一個新功能。 在 Web Role 中與遠程桌面連接相關的<Imports>設置主要是對 RemoteAcess模塊和RemoteForwarder模塊,如下所示。

<Imports>
<ImportmoduleName="Diagnostics"/>
<ImportmoduleName="RemoteAccess"/>
<ImportmoduleName="RemoteForwarder"/>
</Imports>

RemoteAcess表示當前角色支持遠程桌面訪問,RemoteForwarder表示當前 Web Role 支持RDP訪問的轉發,因爲用戶服務中的不同角色不能都對外直接開放RDP訪問端口。

遠程桌面訪問的具體配置信息如用戶登錄信息、證書的職位等被自動定義在服務配置文件中。如下所示。

<ConfigurationSettings>
<Setting name="Microsoft.WindowsAzure.Piugins.Diagnostics.ConnectionString" value="UseDevelopmentStorage=true"/>
<Setting name="Microsoft.WindowsAzure.Piugins.RemoteAccess.Enabled" value="true"/>

<Setting name="Microsoft.WindowsAzure.Piugins.RemoteAccess.AccountUsername" value="LoginName"/>
......

配置好遠程桌面連接之後,開發人員就可以在Windows Azure管理門戶網站中直接通過RDP連接相應的角色實例了。開發人員可以具有管理員權限,從而可以通過熟悉的 Windows Server 管理界面來詳細瞭解角色實例的運行環境。比如,可以在資源管理器中看到 Web Role 的目錄結構。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章