云计算设计模式(二十二)——静态内容托管模式
云计算设计模式(二十二)——静态内容托管模式部署静态内容到一个基于云的存储服务,能够直接向客户提供这些。这个模式能够降低潜在的昂贵的计算实例的需求。
景和问题
Web应用程序通常包括静态内容的一些元素。
此静态内容能够包括HTML页面和诸如图像和可用到client的文件的其它资源,不管是作为一个HTML页的一部分(如嵌入式图像,样式表和clientJavaScript文件)或作为单独的下载(如PDF文档)。
虽然Webserver以及调整通过有效的动态执行页代码和输出缓存优化的要求,他们仍然必须处理请求下载静态内容。
这样的吸收,能够常常得到更好的利用处理周期。
解决方式
在大多数云托管环境中,它能够最小化用于计算实例的要求(比如,使用较小的实例或更少的情况下),通过定位部分的应用程序的资源和静态网页中的存储服务。
费用为云托管的存储通常比计算实例少得多。
何时主机在一个存储服务的应用的某些部分,主要考虑的是与应用程序的部署以及确保其不旨在提供给匿名用户的资源。
问题和注意事项
在决定怎样实现这个模式时,请考虑下面几点:
·托管存储服务必须公开,用户能够訪问下载静态资源的HTTP端点。一些存储服务还支持HTTPS,这意味着它能够承载须要使用SSL在存储业务资源。
·为了获得最高的性能和可用性。能够考虑使用内容分发网络(假设有的话)来缓存在世界各地的多个数据中心的存储容器中的内容。
可是。这将产生额外费用的使用内容交付网络。
·存储账户往往GEO-复制默认情况下。提供弹性对可能影响数据中心的事件。
这意味着它们的IP地址可能会改变,但该URL将保持不变。
·当一些内容位于一个存储账户等内容的托管计算实例变得更具挑战性来部署应用程序并对其进行更新。这可能是必要的。以便当所述静态内容包括脚本文件或用户界面组件来管理它更easy,尤其是分别执行的部署,以及版本号的应用程序和内容。然而。假设仅仅静态资源要更新他们能够简单地被上传到存储帐户,而无需又一次部署应用程序包。
·存储服务可能不支持使用自己定义域名。在这样的情况下,有必要在链接指定的资源的完整URL。由于它们将在从含有链接动态地生成的内容不同的域。
·存储容器必须为公共读取权限进行配置,但它是至关重要的,以确保它们没有被配置为市民写訪问权限,以防止用户能够上传内容。请考虑使用代客钥匙或令牌控制对资源的訪问不应该用匿名,看到代客主要模式的很多其它信息。
何时使用这个模式
这样的模式很适合于:
·最小化的站点。并包括一些静态资源应用的托管费用。
·最小化的站点仅仅包括静态内容和资源的托管费用。
依据不同的托管服务提供商的存储系统的功能。有可能承载全静态网页的所有内容存储帐户内。
·暴露的静态资源和其它宿主环境或本地server上执行的应用程序的内容。
·通过使用缓存的存储账户中的内容在世界各地的多个数据中心的内容分发网络定位在多个地理区域中的内容。
·监測成本和带宽的使用。
使用一段静态内容的部分或所有单独的存储帐户同意的成本更easy分辨从承载和执行成本。
这样的模式可能不适合于下列情况:
·应用程序须要将它传递给client之前对静态内容进行一些处理。比如,它可能是必要的时间戳加入到文档中。
·静态内容的数量是很小的。检索从单独的存储该内容的开销可能会超过它的计算资源中分离出来的成本效益。
注意:
它有时是能够存储一个完整的站点仅仅包括静态内容,如HTML页面。图片,样式表,clientJavaScript文件,下载的文件,如在云中托管的存储PDF文件。欲了解很多其它信息,请參阅在Infosys的博客部署静态站点在微软Azure的有效途径。
样例
位于Azure的Blob存储静态内容。可直接通过Web浏览器进行訪问。 Azure提供一个基于HTTP的接口上的存储,能够公开暴露给客户。比如,在一个天青Blob存储容器内容使用形式的URL被公开:
HTTP:// [存储帐户名称].blob.core.windows.net/[容器名称]/[文件名称]
何时上载该应用程序的内容,必须创建一个或多个斑点的容器来保存文件和文档。
请注意,对于一个新的容器的默认权限是私有的,你必须改变这样的公共同意client訪问的内容。
假设有必要,以防止匿名訪问的内容,您能够实现代客主要模式,因此用户必须按顺序下载资源出示有效的令牌。
注意:
在Azure站点上的页面Blob服务的概念包括了Blob存储信息。而且您能够訪问它。并用它的方式。
在每一个页面中的链接将指定的资源的URL。client将直接从存储服务訪问该资源。图1示出了这样的方法。
图1 - 从存储服务交付的应用程序的静态部分,直接
在传送到client的页面的链接必须指定的blob容器和资源的完整URL。
比如。包括在一个公共容器的链接的图像的页面可能包括下面内容。
注意:
假设该资源是通过使用代客密钥进行保护。如天青共享訪问签名(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" />
本文翻译自MSDN:http://msdn.microsoft.com/en-us/library/dn589776.aspx
页:
[1]