設計應用程式,使得它可以在不需要重新部署或者重新啟動應用程式重新配置。這有助于保持可用性并減少停機時間。
一個主要目的為重要的應用,如商業和企業網站是盡量減少停機時間以及由此引發的中斷給客戶和使用者。但是,有時有必要重新配置應用程式改變特定行為或設定,而在部署和使用。是以,它是用于該應用程式被設計成這樣一種方式,以允許在運作時要應用這些配置的變化,并為應用程式,以檢測所述變化并且盡快地應用它們的部件的優點。
該種要應用可能被調整記錄,以協助與應用程式調試問題,交換使用不同資料存儲的連接配接字元串,或者打開或關閉特定的部分或應用程式的功能的粒度配置變化的例子。
為實施這一模式的解決方案依賴于應用程式托管環境中可用的功能。典型地,應用程式代碼将響應于由檢測到的變化對應用程式配置時,主機基礎設施提出的一個或多個事件。這通常是上載新的配置檔案,或響應于改變通過管理門戶的配置或者通過通路的API的結果。
碼處理的配置變化事件可以檢查變化,并将其應用到該應用程式的元件。有必要對這些部件進行檢測和反應的變化,是以它們的值通常會被公開為可寫的屬性或方法,在事件處理程式的代碼可以設定為新值,或執行。從這一點來說,該部件應使用新的值,以便在需要改變應用程式的行為發生。
如果這是不可能的部件,以應用更改在運作時,這将是必要的,重新啟動該應用程式,進而當應用程式啟動時再次這些更改應用。在一些托管環境中它可能會檢測到這些類型的變化,并指出對環境的應用程式必須重新啟動。在其他情況下,可能有必要執行該分析的設定更改,并強制必要的應用程式重新啟動時的代碼。
圖1示出了本模式的概述。

圖1 - 此模式的基本概述
大多數環境中暴露響應配置更改引發的事件。在那些不這樣做,定期檢查更改配置并應用這些變化将是必要的輪詢機制。它也可能有必要重新啟動應用程式,如果變化不能在運作時被應用。例如,有可能以比較在預設的時間間隔一個配置檔案的日期和時間,并運作代碼以應用更改時的較新版本中找到。另一種方法是,其中包含一個控制中的應用程式的管理使用者界面,或使一個安全端點可以從應用程式外部進行通路,其執行讀取,并應用更新的配置的代碼。
或者,該應用程式可以反應以在環境中的一些其他變化。例如,發生于特定的運作時錯誤可能會改變日志配置自動收集更多的資訊,或者代碼可以使用目前日期讀取和應用主題,反映了季節或特殊事件。
在決定如何實作這個模式時,請考慮以下幾點:
•配置設定必須存儲在部署的應用程式之外,使得它們可以在不需要整個包被重新部署更新。典型的設定被存儲在配置檔案中,或者在外部存儲庫中,如一個資料庫或網絡存儲。通路運作時配置機制,應嚴格控制,以及使用時的嚴格稽核。
•如果托管的基礎設施不會自動檢測配置更改的事件,揭露這些事件對應用程式代碼,您必須實作一種替代機制來檢測和應用更改。這可以是通過輪詢機制,或者通過暴露互動式控制或端點發起更新過程。
•如果您需要實作一個輪詢機制,考慮如何經常檢查更新的配置應該發生。長輪詢間隔将意味着變化可能不被應用了一段時間。短的間隔可能會産生不利影響,通過吸收現有的計算和I
/ O資源的操作。
•如果是應用程式的多個執行個體,附加的考慮因素,這取決于如何變化進行檢測。如果改變是通過由宿主基礎結構引發的事件自動檢測到,這些變化可能不被同時應用的所有執行個體進行檢測。這意味着,某些情況下,将要使用的原始配置為一個周期,而有些則使用新的設定。如果該更新是通過輪詢機制檢測到,這必須以保持一緻性通信改變到所有執行個體。
•一些配置的變化可能要求應用程式重新啟動,甚至要求托管伺服器重新啟動。您必須确定這些類型的配置設定和執行的每一個相應的操作。例如,要求應用程式重新啟動的變化可能會自動執行此操作,或者它可能是管理者負責發起重新啟動在适當的時間時,應用過大的負荷和應用程式可以處理的其他執行個體下是不的負載。
•更新并确認他們是成功的,而更新的應用程式執行個體正在執行正确,将更新應用到所有執行個體之前的分階段部署計劃。由此,能夠防止應發生錯誤的應用程式的總的中斷。凡更新需要重新啟動或應用程式的重新啟動,特别是在應用程式有一個顯著啟動或熱身的時候,用一個分階段部署的方式,以防止多個執行個體脫機在同一時間。
•考慮如何将復原造成的問題配置更改,或導緻申請失敗。例如,它應該能夠滾動的等待輪詢間隔,以檢測所述變化背部的變化立即代替。
•考慮如何配置設定的位置可能會影響應用程式的性能。例如,你應該處理将發生,如果您使用外部存儲不可用的錯誤,當應用程式啟動時,或配置更改将被應用,比如用一個預設的配置或通過本地緩存的設定在伺服器和重用這些值而重試通路遠端資料存儲。
•高速緩存可以幫助減少延遲,如果一個元件需要多次通路配置設定。然而,當配置改變時,應用程式代碼将需要無效緩存設定,該元件必須使用更新後的設定。
這種模式非常适合于:
•應用程式,而您必須避免一切不必要的停機時間,同時仍然能夠将更改應用到應用程式配置。
•環境,揭露事件自動提出的主要配置更改時。通常,這是當檢測到一個新的配置檔案,或者更改了現有的配置檔案。
•應用的地方,往往配置更改和變化可以應用于元件,而不要求應用程式重新啟動,或無需托管伺服器必須重新啟動。
這種模式可能不是合适的,如果運作時元件的設計使得它們隻能在初始化時被配置,并更新這些部件的努力不能相比,重新啟動應用程式和持久的一個短的停機時間是合理的。
微軟Azure雲服務的角色發現和揭露被提了兩個事件,當主機環境檢測變化的ServiceConfiguration.cscfg檔案:
•RoleEnvironment.Changing。引發此事件被檢測到的結構變化後,但在此之前它被施加到該應用程式。你可以處理查詢的變化,并取消運作時重新配置的活動。如果取消了變化,網頁或輔助角色将自動以使新配置被應用程式使用的重新啟動。
•RoleEnvironment.Changed。引發此事件後,應用程式的配置得到了應用。可以處理該事件來查詢所應用的改變。
當取消在RoleEnvironment.Changing事件改變要表示到Azure,一個新的設定不能被應用于該應用程式正在運作時,并且它必須以使用新的值被重新啟動。有效地,你會取消更改隻有在您的應用程式或元件無法反應在運作時改變,需要重新啟動才能使用新的值。
注意:
欲了解更多資訊,請參閱RoleEnvironment.Changing事件并使用RoleEnvironment.Changing事件MSDN上。
處理RoleEnvironment.Changing和RoleEnvironment.Changed事件,你通常會添加一個自定義處理該事件。例如,從你可以下載下傳本手冊的例子運作時重新配置的解決方案的Global.asax.cs類下面的代碼顯示了如何添加一個名為RoleEnvironment_Changed到事件處理鍊中的自定義函數。這是從實施例的的Global.asax.cs檔案。
這種模式的例子是,在RuntimeReconfiguration解決方案的RuntimeReconfiguration.Web項目。
在Web或工作的角色,你可以在處理RoleEnvironment.Changing事件的作用的OnStart事件處理程式中使用類似的代碼。這是從實施例的WebRole.cs檔案。
要注意的是,在網頁的角色的情況下,所述的OnStart事件處理程式中從Web應用程式本身的單獨程序中運作。這就是為什麼你通常會處理在Global.asax檔案中RoleEnvironment.Changed事件處理程式,讓您可以更新您的Web應用程式的運作時配置,而RoleEnvironment.Changing事件中的角色本身。在輔助角色的情況下,您可以訂閱雙方RoleEnvironment.Changing和RoleEnvironment.Changed的的OnStart事件處理程式中的事件。
可以在服務配置檔案中存儲自定義的配置設定,在自定義配置檔案,在資料庫中,如在虛拟機中的Azure
SQL資料庫或SQL Server,或者在天青blob和表存儲。您需要建立一個可以通路自定義配置設定和應用程式内設定元件的屬性,這些适用于應用程式通常代碼。
例如,下面的自定義函數讀取設定,其名稱作為參數傳遞,從Azure的服務配置檔案中的值,然後将它應用到一個名為SomeRuntimeComponent運作時元件的目前執行個體。這是從實施例的的Global.asax.cs檔案
一些配置設定,如那些用于Windows辨別架構,不能存儲在Azure服務配置檔案中,并且必須在App.config或Web.config檔案。
在Azure中,一些配置的變化檢測,并自動應用。這包括在Diagnostics.wadcfg檔案寡婦天青診斷系統,它指定的資訊類型來收集和如何保持日志檔案的結構。是以,它僅需要編寫處理添加到服務配置檔案的自定義設定的代碼。你的代碼應該:
•從更新的配置應用自定義設定您的應用程式在運作時的相應元件,使他們的行為展現了新的配置。
•取消改變,以訓示到Azure新的值不能在運作時應用,該應用程式必須按順序重新開始對要應用的變化。
例如,從你可以下載下傳本手冊的例子運作時重新配置的解決方案WebRole.cs類下面的代碼顯示了如何使用RoleEnvironment.Changing事件取消所有設定的更新,除了可應用于那些在運作時,不需要重新啟動。此示例允許在運作時應用無需重新啟動應用程式(使用此設定将能夠讀取新的值,并相應地在運作時改變其行為的組成部分)更改為“CustomSetting”的設定。任何其他更改的配置将自動使網頁或工作的角色重新啟動。
這種方法證明了好的做法,因為它確定了更改應用程式代碼不知道任何設定(是以不能確定它可以在運作時應用)将導緻重新啟動。如果更改任何一個被取消,該角色将被重新啟動。
然後可以檢測到并應用于應用程式的元件的新的配置後已被接受由Azure的架構更新未在RoleEnvironment.Changing事件處理程式取消。例如,在該示例解決方案的Global.asax檔案以下代碼處理RoleEnvironment.Changed事件。它檢查每個配置設定,并且當它找到名為“CustomSetting”的設定,調用一個函數(前面所示),該應用新的設定,以在應用程式中的适當元件。
需要注意的是,如果你不取消配置的變化,但不将新值應用到您的應用程式元件,那麼更改将不會生效的下一次重新啟動應用程式之前。這可能會導緻不可預測的行為,尤其是當所述宿主角色執行個體由Azure的自動重新開機在其日常維護操作,在該點的新的設定值将被應用的一部分。