zoukankan      html  css  js  c++  java
  • 浅谈Windows Server APPFABRIC

        hi,everyone !真的是好久好久没有update blog了,因为最近忙着备考,没有时间对《数据结构与算法》进行研究学习了。所以,blog一直未更新。today is Friday,心里比较轻松,(哈哈,上班族懂我的感受),有时间写篇技术文章了。正好,最近研究了一些新技术,这篇文章权当对技术的梳理归纳吧。子曰:”温故而知新,可以为师也.”对于knowledge,我们一定要时常复习、thought、归纳、practice.只有这样,我们才能真正的掌握它。Einstein曾经说过:if you can’t explain it simply, you don’t understand  it as well enough .判断我们掌握knowledge的程度的方法是,将knowledge简单清楚的讲给别人听。这也是,写blog的好处,一定要掌握扎实,能自己思考,自己可以讲的明白。好了,废话不多说了,Let’s Go!

       最近在研究公司项目中的缓存模块,在研究缓存模块的过程中,学到了很多之前没有接触到的东西。之前,自己没有接触过缓存。在学习过公司的缓存模块后,现在对缓存的理解是这样的:

    缓存就是将我们在项目中经常使用的数据,或是经常访问的页面存起来。第一次,会去访问数据库读取数据,在读取数据后,会把数据存入内存中。第二次再访问,直接去内存中读取,而不再访问数据库。缓存的优点就是可以提高访问效率,优化项目。Note:自己的理解,不一定正确。

    .net,本身有一套自己的缓存机制,它是把缓存存入内存中的。但是,今天我们不研究.net的缓存。今天,我们来一起认识一个New Friend, she name is Fabric. APPFABRIC 是Microsoft推出东西。Windows Server AppFabric 扩展了 Windows Server .为 Web 应用程序和中间层服务提供增强的托管、管理和缓存功能。今天我们只讲她的缓存功能,感兴趣的朋友可以Go http://msdn.microsoft.com/zh-cn/library/ee677312.aspx 研究一下。

    大家思考一个场景,五个客户端访问项目,就会生成5份缓存。这些缓存都存在了内存中,这就造成了浪费。那么Fabric 的分布式缓存就是为了解决这个问题出现的。

    fabric的缓存功能是这样工作的,把多个服务器组成一个缓存群集,这些个服务器存放缓存,程序统一访问这些缓存群集,服务器的缓存是以window server 方式运行的。

    大家看下图:

    QQ Photo20140718164636

    上图就是Fabric的组件,我给大家一一来介绍一下他们。

    缓存主机:就是安装了Fabric服务的存放缓存用来供程序访问的服务器。

    缓存群集:多个缓存主机构成了缓存群集.Note:同个缓存群集内的缓存主机是共享的。For Example:程序创建了一个缓存,放在了缓存主机A中,那么程序将来访问缓存主机B,也是可以得到缓存的。更新也是一样。

    缓存服务器:就是用来承载缓存主机的服务器.

    群集配置存储位置:一个缓存群集需要配置,需要配置文件。

    PowerShell:Fabric是基于PowerShell来管理缓存服务的。

    缓存客户端:就是我们的项目,就是需要访问缓存的项目。

    GO http://www.microsoft.com/zh-cn/download/details.aspx?id=15848 下载Fabric software.

    安装很简单的,但是,她要求你的本机必须安装有.net 3.5。这里,重点讲一下她的配置.

    安装成功后,我们可以通过她自带的配置工具,来配置我们的Fabric。

    image

    image

    image

    这个页面是用来配置Fabric的托管、监控功能的。我们Ignore了,继续下一步.

    image

    上图中的Set Caching Service configuration单选框要勾上,这是fabric缓存配置。

    Caching Service account,我们需要指定windows用户来管理缓存服务。这个账户需要有管理员权限

    Caching Service configuration provider:

    是选择配置方式,image.sdk说,缓存服务器如果是在工作组中,那么就要选择XML。Note:本人也是刚接触,不是特别了解。

    image

    File share:需要你在缓存服务器上,创建一个共享文件夹。这个文件夹必须能够另其他缓存服务器访问到。因为,它存放的是我们缓存群集的XML配置文件。如果是第一次配置缓存群集,就选择New Cluster.将来为其他缓存集成员配置时,就可以选择Join Cluster.

    Cluster Size:image.它是Limit cache Cluster 的个数的,我们可以控制缓存集中的缓存主机个数。

    配置这些,我们通过Power shell ,来查看一下我们的配置。

    以管理员身份运行Power shell.输入search command,来看一下缓存服务。Get-CacheHost  得到下图:

    image

    从图中,可以看到 Service Status is DOWN, 我们需要将服务开启。

    开始服务命令,需要参数。我们需要设置参数

    $myhost=Get-Cache

    Start-CacheHost myhost.HostNamemyhost.HostNamemyhost.portNO

    执行完之后,服务已经开启了。我们查看看一下:

    Get-CacheHost

    执行后如下图:

    image

    Service Status已经是UP状态了。说明服务已经开启了。

    但是,此时在客户端使用service之前,管理员应当给客户端分配windows账户的访问权。Note:这个地方不是太懂,自己测试时,只是给本机的windows账户分配访问权限。就是说,本机是缓存服务器又是客户端服务器。

    Get-cacheallowedclientaccounts 命令,查看允许访问Service的客户端账户有哪些.

    image

    我们是第一次配置,所以当我们输入命令查看被允许访问的客户端账户时,会出现警告语。此时,我们输入分配权限命令:Grant-CacheAllowedClientAccount(env:UserDomain++env:UserDomain+””+env:UserName)

    此时,客户端就可以访问我们的Service了。

    接下来,我们来通过项目调用Service。首先,我们需要在缓存服务器上建立一个缓存。New-Cache Default 输入创建缓存的命令 其中Default是缓存名称。客户端通过这个Default来获取缓存信息。

    我们来看一下客户端的代码:

    首先我们需要在web.config中配置一下:

    复制代码
    <?xml version="1.0" encoding="utf-8"?>
    
    <!--
      有关如何配置 ASP.NET 应用程序的详细信息,请访问
      http://go.microsoft.com/fwlink/?LinkId=169433
      -->
    
    <configuration>
        <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>
    
       
    <dataCacheClient requestTimeout="15000" channelOpenTimeout="3000" maxConnectionsToServer="1"> <localCache isEnabled="true" sync="TimeoutBased" ttlValue="300" objectCount="10000"/> <clientNotification pollInterval="300" maxQueueLength="10000"/> <hosts> <!--<host name="10.30.1.145" cachePort="22233"/>--> <host name="192.168.200.1" cachePort="22233"/> </hosts> <securityProperties mode="Transport" protectionLevel="EncryptAndSign" /> <transportProperties connectionBufferSize="131072" maxBufferPoolSize="268435456"
                                 maxBufferSize
    ="8388608" maxOutputDelay="2" channelInitializationTimeout="60000"
                                 receiveTimeout
    ="600000"/> </dataCacheClient>
        
        
        <system.web>
          <compilation debug="true" targetFramework="4.0" />
        </system.web>
    
    </configuration>
    复制代码

    代码块中高亮部分,就是我们需要的配置信息。配置完这些信息,我们还需要引用四个类库。这四个类库是安装完Fabric,就会有的。他们位于AppFabric 1.1 for Windows Server这个文件夹中:

    Microsoft.ApplicationServer.Caching.Core.dll     Microsoft.ApplicationServer.Caching.Client.dll   Microsoft.WindowsFabric.Data.dll   Microsoft.WindowsFabric.Common.dll

    我们的客户端的程序,是这样来测试Fabric缓存的。我们通过Update、Get、Delete 、Create页面,来创建、修改、获取、删除我们的缓存信息。缓存中存放的是我们通过Create的页面创建的Order实体信息。

    我们会用到以下几个类:

    ICacheController.cs:

    复制代码
    namespace SampleWebApp{
    ///<summary>
    ///缓存类的公共接口,包括了对缓存的增删改查的方法。
    ///</summary>
    public interface ICacheController
    {
    ///<summary>
    ///判断该键值的数据在缓存中是否存在
    ///</summary>
    ///<param name="key">键值</param>
    ///<returns>存在返回True,不存在返回False</returns>
       bool HasTheKey(String key);
    
    ///<summary>
    ///将数据插入缓存中,数据会在插入缓存中配置时间之后,自动删除
    ///</summary>
    ///<param name="key">数据在缓存中的键值</param>
    ///<param name="value">数据</param>
    ///<param name="timespan">删除数据的时间间隔</param>
    ///<returns>插入成功,返回True,否则返回False</returns>
    bool AddDataWithAbsExpire(string key,object value,TimeSpan timespan);
    
    ///<summary>
    ///从缓存中获取数据
    ///</summary>
    ///<param name="key">数据在缓存中的键值</param>
    ///<returns>有返回要获取的在缓存中的数据,没有则返回NULL</returns>
    object GetData(string key);
    
    ///<summary>
    ///把内存中键值为key的数据进行更行
    ///</summary>
    ///<param name="key">数据在缓存中的键值</param>
    ///<param name="value">要更新的数据</param>
    ///<returns>更新成功返回True,否则返回False</returns>
      bool UpdateData(string key,object value);
    
    ///<summary>
    ///把内存中键值为key的数据进行删除
    ///</summary>
    ///<param name="key">数据在缓存中的键值</param>
    ///<returns>删除成功返回True,否则返回False</returns>
      bool RemoveData(string key);
    }
    }
    复制代码

    CacheUtil.cs:

    复制代码
    public static  class CacheUtil
    {
    //缓存工厂变量,获取缓存实例。
    private static DataCacheFactory _factory=null;
    //缓存实例变量
    private static DataCache _cache=null;
    public static DataCache GetCache()
    {
    if(_cache!=null)
    return _cache;
    //定义缓存服务器列表
    //List<DataCacheServerEndpoint> servers=new List<DataCacheServerEndpoint>;
    //web.config文件中已经配置了,这里不需要配置了。客户端配置缓存功能,可以编程配置(实例化配置对象),也可以XML配置.(web.config)
    //servers.Add(new DataCacheServerEndpoint("10.30.1.145",22233));
    //servers.Add(new DataCacheServerEndpoint("10.30.1.146",22233));
    //创建缓存配置对象
    DataCacheFactoryConfiguration configuration=new DataFactoryConfiguration();
    //设置缓存配置的缓存服务器列表
    //configuration.servers=servers;
    //为本地缓存设置默认属性(本地缓存禁用)
    configuration.LocalCacheProperties=new DataCacheLocalCacheProperies();
    //禁用跟踪,以避免信息/web页面的详细信息
    DataCacheClientLogManager.changelogLevel(System.Diagnostics.TraceLevel.off);
    _factory=new DataCacheFacotry(configuration);
    //获得默认命名缓存
    _cache=_factory.GetCache("default");
    return _cache;
    }
    }
    复制代码
    CacheFactory.cs
    复制代码
    namespace SampleWebApp
    {
    //返回ICacheController实例
    public class CacheFactory
    {
         pubic static ICacheController GetInstance()
    {
               ICacheController cacheInterface=new CacheControllerF();
    return cacheInterface;
    }
    }
    }
    复制代码

    CacheControllerF.cs

    复制代码
    namespace SampleWebApp
    {
    //实现ICacheController接口
    public class CacheControllerF:ICacheController
    {
          private  DataCache cache;
          //构造函数
        public CacheControllerF()
    {
               cache=CacheUtil.GetCache();
               
    }
    
          public bool HasTheKey(string key)
    {
                 if(cache.Get(key)!=null)
                  return true;
                  return false;
    }
         public bool AddDataWithAbsExpire(string key,object value,TimeSpan timeout)
    {
            if(!HasTheKey(key))
    {
             cache.Add(key,value,timeout);
    }else
    {
           return false;
    }
    }
         public object GetData(string key)
    {
             object object=cache.Get(key);
            return object;
    }
    
         public bool updateData(string key,object value)
    {
             cahche.put(key,value);
             return true;
    }
    
         public bool RemoveData(string key)
    {
              return cache.Remove(key);
            
    }
    }
    }
    复制代码

    以上就是我对APPFABRIC的学习认识。只是一点点皮毛,还需继续研究。

  • 相关阅读:
    Why Choose Jetty?
    Jetty 的工作原理以及与 Tomcat 的比较
    Tomcat设计模式
    Servlet 工作原理解析
    Tomcat 系统架构
    spring boot 打包方式 spring boot 整合mybaits REST services
    wireshark udp 序列号 User Datagram Protocol UDP
    Maven 的聚合(多模块)和 Parent 继承
    缓存策略 半自动化就是mybaitis只支持数据库查出的数据映射到pojo类上,而实体到数据库的映射需要自己编写sql语句实现,相较于hibernate这种完全自动化的框架我更喜欢mybatis
    Mybatis解决sql中like通配符模糊匹配 构造方法覆盖 mybits 增删改
  • 原文地址:https://www.cnblogs.com/lhxsoft/p/15031786.html
Copyright © 2011-2022 走看看