本示例介绍如何编写使用 AppFabric 缓存的简单 ASP.NET 应用程序。在开始之前,建议阅读下面关于AppFabric的文章,准备好AppFabric的开发环境。
Windows Server AppFabric 安装和配置
Windows Server AppFabric在工作组(Workgroup)环境下的配置
1. 使用Visual studio 2010 创建ASP.NET Web Application,命名为 AppFabricTest。在项目中,添加对AppFabric程序集的引用:
Microsoft.ApplicationServer.Caching.Client.dll
Microsoft.ApplicationServer.Caching.Core.dll
如下图所示:
Microsoft.ApplicationServer.Caching.Core.dll 是Cache基类库,Cache客户端和服务端都引用该DLL,包含配置库和基类缓存类型。
Microsoft.ApplicationServer.Caching.Client.dll 包含Cache客户端类库,如连接到Cache cluster存储和检索数据的API接口等等。
2. 打开 Global.asax 文件,添加命名空间的引用。
using Microsoft.ApplicationServer.Caching;
在Global 类中,添加public static string变量 – CacheFactoryName,并设置其值为 CacheFactory。通过使用静态字符串,应用程序代码中使用该Key检索CacheFactory对象。
public static string CacheFactoryName = “CacheFactory”;
在Application_Start 方法中,添加如下代码:
var dcf = new DataCacheFactory();
Application[CacheFactoryName] = dcf;
创建一个共享的DataCacheFactory对象实例,并存放在Application 对象,Key值为 CacheFactory。在实际的开发应用中,多数情况下,需要创建类似的共享DataCacheFactory对象。
3. 修改web.config文件,添加AppFabric 缓存配置。
在web.config 文件的<configuration> 元素下,添加如下内容:
1
2
3
4
5
6
7
8
9
10
11
|
<
configSections
>
<
section
name
=
"dataCacheClient"
type="Microsoft.ApplicationServer.Caching.DataCacheClientSection,
Microsoft.ApplicationServer.Caching.Core,
Version
=
1
.0.0.0,
Culture
=
neutral
,
PublicKeyToken
=
31bf3856ad364e35
" />
</
configSections
>
<
dataCacheClient
>
<
hosts
>
<
host
name=<YourMachineName> cachePort="22233" />
</
hosts
>
</
dataCacheClient
>
|
其中<YourMachineName> 需要更改为实际的主机名称。
4. 打开Site.Master 代码文件,添加对AppFabric 命名空间的引用,同时添加读写Cache的代码。
using Microsoft.ApplicationServer.Caching;
在SiteMaster 文件中,添加一个新方法 –GetCachedName(),演示Cache的读写方法(GetCache / Put)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
public
string
GetCachedName()
{
string
name =
null
;
string
key =
"ApplicationName"
;
var dcf = Application[Global.CacheFactoryName]
as
DataCacheFactory;
if
(dcf !=
null
)
{
var cache = dcf.GetCache(
"Lab1Cache"
);
name = cache.Get(key)
as
string
;
if
(name ==
null
)
{
name =
"Windows Server App Fabric Cache Lab"
;
cache.Put(key, name);
}
else
{
name +=
" From Cache!"
;
}
}
return
name;
}
|
打开 Site.Master 页面文件,将其中的文本 My ASP.NET Application 更改为 <%= GetCachedName() %>,调用代码文件中新添加的方法,测试Cache的使用。
5. 运行范例程序,测试Cache的使用
第一次运行范例程序,界面如下,表示Cache中没有值。
按 F5 刷新或者Refresh按钮,运行界面如下所示,表示从Cache中获取值。
下面是在powershell窗口中,运行get-cache 命令显示的信息,第一次Lab1Cache 缓存中没有信息;第二次运行时Lab1Cache 缓存中有内容了。
下面是Powershell窗口中,Get-CacheStatistics 命令显示缓存的统计信息。
在PowerShell 窗口,可通过 Remove-Cache Lab1Cache 删除缓存信息。
赠送一段AppFabric Cache的程序代码,和本范例程序没有关系,可了解如何针对AppFabric Cache编程。
1. 从PowerShell 启动和管理AppFabric 内存集群
使用管理员帐号运行PowerShello命令,输入
Get-Command *cache*
查看cache management的所有不同命令。
Start-CacheCluster – 启动Cache 服务;
可以看到一台机器已经在Cache集群中,可以添加多台这样的机器,并且在其中某台机器当机的情况下,Cache系统仍然能够保持数据的高可靠性。
2. 在ASP.NET 应用程序中使用AppFabric Cache
在AppFabric Cache 设置好了之后,可以在ASP.NET代码中调用Cache API 接口方法,如Add / Get / Put 等等,读写Cache。
具体实现细节,可参考《使用 Windows Server AppFabric 缓存编写 ASP.NET 应用程序》。
3. 检查Cache的状态
在Cache中读写操作之后,可以在PowerShell窗口查看Cache状态。
Get-Cache
Get-CacheStatistics [CACHE NAME]
还可以使用性能监控器,它提供了许多不同类别的计数器。
在重启Web server之后,AppFabric Cache依然存在。
4. 使用AppFabric替换ASP.NET Session的存储
在ASP.NET 4中通过web.config用AppFabric替换默认的Session State存储方法也是件很容易的事情。
AppFabric 提供了定制的Session Provider,仅仅只需要对配置文件进行更改,就可将Session信息存放到AppFabric 缓存群集。如在配置过程中有任何问题或异常,可参考《Configuring ASP.NET Session State to use AppFabric Caching》。按照AppFabric缓存的基本特性,存入Session中的对象实例必须是可序列化的(Serializable)。
为了让ASP.NET 应用程序使用AppFabric session state provider,必须在web.config文件中添加如下元素。
configSessions – configuration节点中的第一个元素,在configuration 标签下,引入 AppFabric Caching 程序集。
dataCacheClient – 这是configuration元素的一个子元素,用来配置Cache客户端和Cache主机。
sessionState – system.web 元素的子元素,指定 Web 应用程序使用AppFabric 来管理session状态,cacheName属性指定命名的缓存(Named Cache)。如果将session数据存放在cache region,则使用regionName属性指向region的名称。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
<?
xml
version
=
"1.0"
encoding
=
"utf-8"
?>
<
configuration
>
<!--configSections must be the FIRST element -->
<
configSections
>
<!-- required to read the <dataCacheClient> element -->
<
section
name
=
"dataCacheClient"
type="Microsoft.ApplicationServer.Caching.DataCacheClientSection,
Microsoft.ApplicationServer.Caching.Core,
Version
=
1
.0.0.0,
Culture
=
neutral
,
PublicKeyToken
=
31bf3856ad364e35
"
allowLocation
=
"true"
allowDefinition
=
"Everywhere"
/>
</
configSections
>
<!-- cache client -->
<
dataCacheClient
>
<!-- cache host(s) -->
<
hosts
>
<
host
name
=
"CacheServer1"
cachePort
=
"22233"
/>
</
hosts
>
</
dataCacheClient
>
<
system.web
>
<
sessionState
mode
=
"Custom"
customProvider
=
"AppFabricCacheSessionStoreProvider"
>
<
providers
>
<!-- specify the named cache for session data -->
<
add
name
=
"AppFabricCacheSessionStoreProvider"
type
=
"Microsoft.ApplicationServer.Caching.DataCacheSessionStoreProvider"
cacheName
=
"NamedCache1"
sharedId
=
"SharedApp"
/>
</
providers
>
</
sessionState
>
</
system.web
>
</
configuration
>
|
关于上述配置节点或元素的更详细信息,可参考Configuring an ASP.NET Session State Provider (Windows Server AppFabric Caching)。
通过 AppFabric Caching 可以轻易的将多台服务器的内存融合成一个超大内存缓存(Cache Cluster),通过单一 API 即可读写这些内存缓存,当内存不够时只要增加服务器即可轻易扩充完成,不仅有效降低管理成本,还可轻易的达到 3H ( High Scalability, High Availability, High Performance ) 系统架构。
5. 部署拓扑(Deployment Topology)
AppFabric Cache 通过Windows Service的方法提供服务,客户端应用程序可在同一台机器上,或者在不同的机器上通过.NET Client API访问缓存。客户端应用通过TCP/IP和本机或远程服务器的服务通信。
如上图是两种常见的 AppFabric 部署模式:
(1) Embedded – 将缓存宿主(Cache Host) 跟 IIS 主机安装在一起,并联合多台宿主组成缓存群集;
(2) Cache Service – 使用 专属主机 提供 缓存宿主(Cache Host),提供一个宿主的缓存层(Caching Tier);
6. 性能测试(Performance Testing)
下面创建了一个测试应用程序,测试AppFabric缓存性能。应用程序模拟了在许多分布式客户计算机上的大量用户。每一个用户线程执行Get / Put / Remove 20K负载的操作,记录随着负载逐步增加和新服务器添加时的吞吐量。
下图清楚显示了缓存的作用。吞吐量(throughput)随着负载(load)的增长而增长,直到达到饱和和稳定。此时,如果我们增加另外一台Server,吞吐量会再次增加,同时响应时间也会下降。
还有一些关于缓存配置的文章值得大家参考:
http://msdn.microsoft.com/zh-cn/magazine/gg650661.aspx
http://www.cnblogs.com/shanyou/archive/2010/07/24/1784173.html
http://weblogs.asp.net/shijuvarghese/archive/2011/05/04/using-windows-azure-appfabric-caching.aspx