# 云計算設計模式(二十二)——靜態內容托管模式
部署靜態內容到一個基于云的存儲服務,可以直接向客戶提供這些。這個模式可以減少潛在的昂貴的計算實例的需求。
## 背景和問題
Web應用程序通常包括靜態內容的一些元素。此靜態內容可以包括HTML頁面和諸如圖像和可用到客戶端的文件的其他資源,無論是作為一個 HTML 頁的一部分(如嵌入式圖像,樣式表和客戶端 JavaScript 文件)或作為單獨的下載(如PDF文檔)。
盡管Web服務器以及調整通過有效的動態執行頁代碼和輸出緩存優化的要求,他們仍然必須處理請求下載靜態內容。這種吸收,可以經常得到更好的利用處理周期。
## 解決方案
在大多數云托管環境中,它可以最小化用于計算實例的要求(例如,使用較小的實例或更少的情況下),通過定位部分的應用程序的資源和靜態網頁中的存儲服務。費用為云托管的存儲通常比計算實例少得多。
何時主機在一個存儲服務的應用的某些部分,主要考慮的是與應用程序的部署以及確保其不旨在提供給匿名用戶的資源。
## 問題和注意事項
在決定如何實現這個模式時,請考慮以下幾點:
- 托管存儲服務必須公開,用戶可以訪問下載靜態資源的 HTTP 端點。一些存儲服務還支持 HTTPS,這意味著它能夠承載需要使用SSL在存儲業務資源。
- 為了獲得最高的性能和可用性,可以考慮使用內容分發網絡(如果有的話)來緩存在世界各地的多個數據中心的存儲容器中的內容。但是,這將產生額外費用的使用內容交付網絡。
- 存儲賬戶往往 GEO-復制默認情況下,提供彈性對可能影響數據中心的事件。這意味著它們的 IP 地址可能會改變,但該URL將保持不變。
- 當一些內容位于一個存儲賬戶等內容的托管計算實例變得更具挑戰性來部署應用程序并對其進行更新。這可能是必要的,以便當所述靜態內容包括腳本文件或用戶界面組件來管理它更容易,尤其是分別執行的部署,以及版本的應用程序和內容。然而,如果僅僅靜態資源要更新他們可以簡單地被上傳到存儲帳戶,而無需重新部署應用程序包。
- 存儲服務可能不支持使用自定義域名。在這種情況下,有必要在鏈接指定的資源的完整 URL,因為它們將在從含有鏈接動態地生成的內容不同的域。
- 存儲容器必須為公共讀取權限進行配置,但它是至關重要的,以確保它們沒有被配置為市民寫訪問權限,以防止用戶能夠上傳內容。請考慮使用代客鑰匙或令牌控制對資源的訪問不應該用匿名,看到代客主要模式的更多信息。
## 何時使用這個模式
這種模式非常適合于:
- 最小化的網站,并包含一些靜態資源應用的托管費用。
- 最小化的網站只包含靜態內容和資源的托管費用。根據不同的托管服務提供商的存儲系統的功能,有可能承載全靜態網頁的全部內容存儲帳戶內。
- 暴露的靜態資源和其他宿主環境或本地服務器上運行的應用程序的內容。
- 通過使用緩存的存儲賬戶中的內容在世界各地的多個數據中心的內容分發網絡定位在多個地理區域中的內容。
- 監測成本和帶寬的使用。使用一段靜態內容的部分或全部單獨的存儲帳戶允許的成本更容易分辨從承載和運行成本。
這種模式可能不適合于下列情況:
- 應用程序需要將它傳遞給客戶端之前對靜態內容進行一些處理。例如,它可能是必要的時間戳添加到文檔中。
- 靜態內容的數量是非常小的。檢索從單獨的存儲該內容的開銷可能會超過它的計算資源中分離出來的成本效益。
注意:它有時是可以存儲一個完整的網站只包含靜態內容,如 HTML 頁面,圖片,樣式表,客戶端 JavaScript 文件,下載的文件,如在云中托管的存儲 PDF 文件。欲了解更多信息,請參閱在 Infosys 的博客部署靜態網站在微軟 Azure 的有效途徑。
## 例子
位于 Azure 的 Blob 存儲靜態內容,可直接通過 Web 瀏覽器進行訪問。 Azure 提供一個基于 HTTP 的接口上的存儲,可以公開暴露給客戶。例如,在一個天青 Blob 存儲容器內容使用形式的 URL 被公開:
~~~
HTTP:// [存儲帳戶名稱].blob.core.windows.net/[容器名稱]/[文件名]
~~~
何時上載該應用程序的內容,必須創建一個或多個斑點的容器來保存文件和文檔。請注意,對于一個新的容器的默認權限是私有的,你必須改變這種公共允許客戶端訪問的內容。如果有必要,以防止匿名訪問的內容,您可以實現代客主要模式,因此用戶必須按順序下載資源出示有效的令牌。
注意:在 Azure 網站上的頁面 Blob 服務的概念包含了 Blob 存儲信息,并且您可以訪問它,并用它的方式。
在每個頁面中的鏈接將指定的資源的 URL,客戶端將直接從存儲服務訪問該資源。圖1示出了這種方法。

圖1 - 從存儲服務交付的應用程序的靜態部分,直接
在傳送到客戶端的頁面的鏈接必須指定的 blob 容器和資源的完整 URL。例如,包含在一個公共容器的鏈接的圖像的頁面可能包含以下內容。
~~~
<img src="http://mystorageaccount.blob.core.windows.net/myresources/image1.png"
alt="My image" />
~~~
注意:
如果該資源是通過使用代客密鑰進行保護,如天青共享訪問簽名(SAS),該簽名必須被包含在鏈接的 URL。
適用于本指南中的示例包含一個名為 StaticContentHosting,演示了使用外部存儲靜態資源的解決方案。該 StaticContentHosting.Cloud 項目包含指定保存靜態內容的存儲帳戶和容器的配置文件。
~~~
<Setting name="StaticContent.StorageConnectionString"
value="UseDevelopmentStorage=true" />
<Setting name="StaticContent.Container" value="static-content" />
~~~
在 StaticContentHosting.Web 項目的文件 Settings.cs Settings(設置)類包含的方法來提取這些值,并建立一個字符串值,包含云存儲帳戶的容器的 URL。
~~~
public class Settings
{
public static string StaticContentStorageConnectionString {
get
{
return RoleEnvironment.GetConfigurationSettingValue(
"StaticContent.StorageConnectionString");
}
}
?
public static string StaticContentContainer
{
get
{
return RoleEnvironment.GetConfigurationSettingValue("StaticContent.Container");
}
}
?
public static string StaticContentBaseUrl
{
get
{
var account = CloudStorageAccount.Parse(StaticContentStorageConnectionString);
?
return string.Format("{0}/{1}", account.BlobEndpoint.ToString().TrimEnd('/'),
StaticContentContainer.TrimStart('/'));
}
}
}
~~~
在文件 StaticContentUrlHtmlHelper.cs 的 StaticContentUrlHtmlHelper 類公開命名 StaticContentUrl,如果傳遞給它的URL與ASP.NET根路徑字符(?)開始生成包含路徑的云存儲帳戶的 URL 的方法。
~~~
public static class StaticContentUrlHtmlHelper
{
public static string StaticContentUrl(this HtmlHelper helper, string contentPath)
{
if (contentPath.StartsWith("~"))
{
contentPath = contentPath.Substring(1);
}
?
contentPath = string.Format("{0}/{1}", Settings.StaticContentBaseUrl.TrimEnd('/'),
contentPath.TrimStart('/'));
?
var url = new UrlHelper(helper.ViewContext.RequestContext);
?
return url.Content(contentPath);
}
}
~~~
在瀏覽文件 Index.cshtml\ Home 文件夾包含使用 StaticContentUrl 方法創建的 URL,它的 src 屬性的圖像元素。
~~~
<img src="@Html.StaticContentUrl("~/Images/orderedList1.png")" alt="Test Image" />
~~~
- 前言
- (一)—— 緩存預留模式
- (二)—— 斷路器模式
- (三)—— 補償交易模式
- (四)——消費者的競爭模式
- (五)——計算資源整合模式
- (六)——命令和查詢職責分離(CQRS)模式
- (七)——事件獲取模式
- (八)——外部配置存儲模式
- (九)—— 聯合身份模式
- (十)——守門員模式
- (十一)—— 健康端點監控模式
- (十二)—— 索引表模式
- (十三)——領導人選舉模式
- (十四)——實體化視圖模式
- (十五)—— 管道和過濾器模式
- (十六)——優先級隊列模式
- (十七)—— 基于隊列的負載均衡模式
- (十八)—— 重試模式
- (十九)——運行重構模式
- (二十)—— 調度程序代理管理者模式
- (二十一)——Sharding 分片模式
- (二十二)——靜態內容托管模式
- (二十三)——Throttling 節流模式
- (二十四)—— 仆人鍵模式