(二十二)——靜態(tài)內(nèi)容托管模式

2018-02-24 15:44 更新

云計(jì)算設(shè)計(jì)模式(二十二)——靜態(tài)內(nèi)容托管模式

部署靜態(tài)內(nèi)容到一個(gè)基于云的存儲(chǔ)服務(wù),可以直接向客戶提供這些。這個(gè)模式可以減少潛在的昂貴的計(jì)算實(shí)例的需求。

背景和問題

Web應(yīng)用程序通常包括靜態(tài)內(nèi)容的一些元素。此靜態(tài)內(nèi)容可以包括HTML頁(yè)面和諸如圖像和可用到客戶端的文件的其他資源,無(wú)論是作為一個(gè) HTML 頁(yè)的一部分(如嵌入式圖像,樣式表和客戶端 JavaScript 文件)或作為單獨(dú)的下載(如PDF文檔)。

盡管Web服務(wù)器以及調(diào)整通過有效的動(dòng)態(tài)執(zhí)行頁(yè)代碼和輸出緩存優(yōu)化的要求,他們?nèi)匀槐仨毺幚碚?qǐng)求下載靜態(tài)內(nèi)容。這種吸收,可以經(jīng)常得到更好的利用處理周期。

解決方案

在大多數(shù)云托管環(huán)境中,它可以最小化用于計(jì)算實(shí)例的要求(例如,使用較小的實(shí)例或更少的情況下),通過定位部分的應(yīng)用程序的資源和靜態(tài)網(wǎng)頁(yè)中的存儲(chǔ)服務(wù)。費(fèi)用為云托管的存儲(chǔ)通常比計(jì)算實(shí)例少得多。

何時(shí)主機(jī)在一個(gè)存儲(chǔ)服務(wù)的應(yīng)用的某些部分,主要考慮的是與應(yīng)用程序的部署以及確保其不旨在提供給匿名用戶的資源。

問題和注意事項(xiàng)

在決定如何實(shí)現(xiàn)這個(gè)模式時(shí),請(qǐng)考慮以下幾點(diǎn):

  • 托管存儲(chǔ)服務(wù)必須公開,用戶可以訪問下載靜態(tài)資源的 HTTP 端點(diǎn)。一些存儲(chǔ)服務(wù)還支持 HTTPS,這意味著它能夠承載需要使用SSL在存儲(chǔ)業(yè)務(wù)資源。
  • 為了獲得最高的性能和可用性,可以考慮使用內(nèi)容分發(fā)網(wǎng)絡(luò)(如果有的話)來緩存在世界各地的多個(gè)數(shù)據(jù)中心的存儲(chǔ)容器中的內(nèi)容。但是,這將產(chǎn)生額外費(fèi)用的使用內(nèi)容交付網(wǎng)絡(luò)。
  • 存儲(chǔ)賬戶往往 GEO-復(fù)制默認(rèn)情況下,提供彈性對(duì)可能影響數(shù)據(jù)中心的事件。這意味著它們的 IP 地址可能會(huì)改變,但該URL將保持不變。
  • 當(dāng)一些內(nèi)容位于一個(gè)存儲(chǔ)賬戶等內(nèi)容的托管計(jì)算實(shí)例變得更具挑戰(zhàn)性來部署應(yīng)用程序并對(duì)其進(jìn)行更新。這可能是必要的,以便當(dāng)所述靜態(tài)內(nèi)容包括腳本文件或用戶界面組件來管理它更容易,尤其是分別執(zhí)行的部署,以及版本的應(yīng)用程序和內(nèi)容。然而,如果僅僅靜態(tài)資源要更新他們可以簡(jiǎn)單地被上傳到存儲(chǔ)帳戶,而無(wú)需重新部署應(yīng)用程序包。
  • 存儲(chǔ)服務(wù)可能不支持使用自定義域名。在這種情況下,有必要在鏈接指定的資源的完整 URL,因?yàn)樗鼈儗⒃趶暮墟溄觿?dòng)態(tài)地生成的內(nèi)容不同的域。
  • 存儲(chǔ)容器必須為公共讀取權(quán)限進(jìn)行配置,但它是至關(guān)重要的,以確保它們沒有被配置為市民寫訪問權(quán)限,以防止用戶能夠上傳內(nèi)容。請(qǐng)考慮使用代客鑰匙或令牌控制對(duì)資源的訪問不應(yīng)該用匿名,看到代客主要模式的更多信息。

何時(shí)使用這個(gè)模式

這種模式非常適合于:

  • 最小化的網(wǎng)站,并包含一些靜態(tài)資源應(yīng)用的托管費(fèi)用。
  • 最小化的網(wǎng)站只包含靜態(tài)內(nèi)容和資源的托管費(fèi)用。根據(jù)不同的托管服務(wù)提供商的存儲(chǔ)系統(tǒng)的功能,有可能承載全靜態(tài)網(wǎng)頁(yè)的全部?jī)?nèi)容存儲(chǔ)帳戶內(nèi)。
  • 暴露的靜態(tài)資源和其他宿主環(huán)境或本地服務(wù)器上運(yùn)行的應(yīng)用程序的內(nèi)容。
  • 通過使用緩存的存儲(chǔ)賬戶中的內(nèi)容在世界各地的多個(gè)數(shù)據(jù)中心的內(nèi)容分發(fā)網(wǎng)絡(luò)定位在多個(gè)地理區(qū)域中的內(nèi)容。
  • 監(jiān)測(cè)成本和帶寬的使用。使用一段靜態(tài)內(nèi)容的部分或全部單獨(dú)的存儲(chǔ)帳戶允許的成本更容易分辨從承載和運(yùn)行成本。

這種模式可能不適合于下列情況:

  • 應(yīng)用程序需要將它傳遞給客戶端之前對(duì)靜態(tài)內(nèi)容進(jìn)行一些處理。例如,它可能是必要的時(shí)間戳添加到文檔中。
  • 靜態(tài)內(nèi)容的數(shù)量是非常小的。檢索從單獨(dú)的存儲(chǔ)該內(nèi)容的開銷可能會(huì)超過它的計(jì)算資源中分離出來的成本效益。

注意:它有時(shí)是可以存儲(chǔ)一個(gè)完整的網(wǎng)站只包含靜態(tài)內(nèi)容,如 HTML 頁(yè)面,圖片,樣式表,客戶端 JavaScript 文件,下載的文件,如在云中托管的存儲(chǔ) PDF 文件。欲了解更多信息,請(qǐng)參閱在 Infosys 的博客部署靜態(tài)網(wǎng)站在微軟 Azure 的有效途徑。

例子

位于 Azure 的 Blob 存儲(chǔ)靜態(tài)內(nèi)容,可直接通過 Web 瀏覽器進(jìn)行訪問。 Azure 提供一個(gè)基于 HTTP 的接口上的存儲(chǔ),可以公開暴露給客戶。例如,在一個(gè)天青 Blob 存儲(chǔ)容器內(nèi)容使用形式的 URL 被公開:

HTTP:// [存儲(chǔ)帳戶名稱].blob.core.windows.net/[容器名稱]/[文件名]

何時(shí)上載該應(yīng)用程序的內(nèi)容,必須創(chuàng)建一個(gè)或多個(gè)斑點(diǎn)的容器來保存文件和文檔。請(qǐng)注意,對(duì)于一個(gè)新的容器的默認(rèn)權(quán)限是私有的,你必須改變這種公共允許客戶端訪問的內(nèi)容。如果有必要,以防止匿名訪問的內(nèi)容,您可以實(shí)現(xiàn)代客主要模式,因此用戶必須按順序下載資源出示有效的令牌。

注意:在 Azure 網(wǎng)站上的頁(yè)面 Blob 服務(wù)的概念包含了 Blob 存儲(chǔ)信息,并且您可以訪問它,并用它的方式。

在每個(gè)頁(yè)面中的鏈接將指定的資源的 URL,客戶端將直接從存儲(chǔ)服務(wù)訪問該資源。圖1示出了這種方法。

圖1 - 從存儲(chǔ)服務(wù)交付的應(yīng)用程序的靜態(tài)部分,直接

在傳送到客戶端的頁(yè)面的鏈接必須指定的 blob 容器和資源的完整 URL。例如,包含在一個(gè)公共容器的鏈接的圖像的頁(yè)面可能包含以下內(nèi)容。

<img src="https://atts.w3cschool.cn/attachments/image/cimg/image1.png"  
     alt="My image" />

注意:

如果該資源是通過使用代客密鑰進(jìn)行保護(hù),如天青共享訪問簽名(SAS),該簽名必須被包含在鏈接的 URL。

適用于本指南中的示例包含一個(gè)名為 StaticContentHosting,演示了使用外部存儲(chǔ)靜態(tài)資源的解決方案。該 StaticContentHosting.Cloud 項(xiàng)目包含指定保存靜態(tài)內(nèi)容的存儲(chǔ)帳戶和容器的配置文件。

<Setting name="StaticContent.StorageConnectionString"   
         value="UseDevelopmentStorage=true" />  
<Setting name="StaticContent.Container" value="static-content" />

在 StaticContentHosting.Web 項(xiàng)目的文件 Settings.cs Settings(設(shè)置)類包含的方法來提取這些值,并建立一個(gè)字符串值,包含云存儲(chǔ)帳戶的容器的 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根路徑字符(?)開始生成包含路徑的云存儲(chǔ)帳戶的 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 方法創(chuàng)建的 URL,它的 src 屬性的圖像元素。

<img src="https://atts.w3cschool.cn/attachments/image/cimg/orderedList1.png")" alt="Test Image" />
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)