基于.NET CORE微服务框架 -谈谈Cache中间件和缓存降级

1、前言

surging受到很多.net同窗的青睐,也提了很多问题,提的最多的是何时集成API 网关,在这里回答你们最近已经开始着手研发,应该在1,2个月内会有个第一版API网关,其它像Token身份验证,限流降级等功能完成时间会日后推html

最近也更新了surging新的版本git

更新内容:github

1. Cache中间件基于Redis 所依赖的第三方库已将servicestack.redis转成stackexchange
2. 增长缓存降级
3. 增长拦截缓存降级的例子redis

开源地址:https://github.com/dotnetcore/surgingjson

2.软件环境

IDE:Visual Studio 2017 15.3 Preview ,vscode
框架:.NET core 2.0缓存

vscode 技术支持:服务器

三、Cache中间件的使用

  在剥析surging的架构思想这篇文章中大体提了下Cache中间件,你们也对Cache中间件有了初步印象,这一节咱们将谈谈怎么使用Cache中间件架构

1.建立配置文件app

cacheSettings.json

{ 
    "CachingSettings": [
      {
        "Id": "ddlCache",
        "Class": "Surging.Core.Caching.RedisCache.RedisContext,Surging.Core.Caching",
        "Properties": [
          {
            "Name": "appRuleFile",
            "Ref": "rule"
          },
          {
            "Name": "dataContextPool",
            "Ref": "ddls_sample",
            "Maps": [
              {
                "Name": "Redis",
                "Properties": [
                  {
                    "value": "127.0.0.1:6379::1"
                  }
                ]
              },
              {
                "Name": "MemoryCache"
              }
            ]
          },
          {
            "Name": "defaultExpireTime",
            "value": "120"
          },
          {
            "Name": "connectTimeout",
            "Value": "120"
          },
          {
            "Name": "minSize",
            "Value": "1"
          },
          {
            "Name": "maxSize",
            "Value": "10"
          }
        ]
      }
    ]
}

能够支持多个实例配置经过配置id来标识惟一,而且经过配置Maps,来初始化服务节点列表,经过哈希一致性来选择服务节点

配置参数列表

参数
做用

CachingSettings

包含多个实例的父级配置节

Id

惟一标识

Class

对于Context的适配
Properties Cache 相关配置节

Maps

配置服务节列表

minSize

对象池最小数

maxSize

objectpool最大数

2.代码配置

 

        /// <summary>
        /// 配置缓存服务
        /// </summary>
        public static void ConfigureCache(IConfigurationBuilder build)
        {
            build
              .AddCacheFile("cacheSettings.json", optional: false);
        }   

以上咱们就完成了缓存中间件配置,接下来就能够经过如下代码进行调用

基于redis的缓存调用

  cacheProvider = CacheContainer.GetInstances<ICacheProvider>(“ddlCache.Redis”);

 基于MemoryCache的缓存调用

CacheContainer.GetInstances<ICacheProvider>("MemoryCache")

四、缓存降级

对于服务所返回的数据,有些是不须要常常修改,能够经过缓存返回数据,好比商品应用,商品分类,商品列表、用户信息,订单信息,购物车等,经过以上需求咱们就要对于proxy进行拦截,返回缓存或者删除缓存。

对于缓存会有如下疑问

  1. 数据一致性:对于服务是分布式部署在各台服务器上, 缓存存储读取也应该支持分布式,因此应该选择支持分布式的缓存框架,如:redis,couchbase,membercache
  2. 缓存命中率:在无命中的状况下,没法直接经过缓存获取到想要的数据,而直接经过调用远程服务获取数据,这样就会增长响应时间和影响吞吐量,因此咱们必须引用工具进行监控

缓存降级

 surging的缓存降级就是针对于proxy进行拦截,若是有缓存数据,则返回缓存数据,不然调用Proceed方法调用远程服务。

 在数据进行update,delete的时候就须要针对于依赖的缓存进行删除,能够经过proxy进行拦截的方式把缓存进行删除

 缓存降级有如下优势

1.高性能:能够减小响应时间和提升吞吐量

2.高效:针对于业务逻辑的设计,无需考虑缓存,作到了无缝集成

如下经过示例来介绍如何使用

在业务接口方法上添加以下特性

[Command(Strategy= StrategyType.Failover,FailoverCluster =3,RequestCacheEnabled =true)]  //RequestCacheEnabled =true 就是启用缓存

拦截获取缓存

 [InterceptMethod(CachingMethod.Get, Key = "GetUser_id_{0}", Mode = CacheTargetType.Redis, Time = 480)]

拦截删除缓存

[InterceptMethod(CachingMethod.Remove, "GetUser_id_{0}", "GetUserName_name_{0}", Mode = CacheTargetType.Redis)]

应用[CacheKey]来标识缓存Key,如

    public class UserModel
    {

        [CacheKey(1)]
        public int UserId { get; set; }

        public string Name { get; set; }

        public int Age { get; set; }
    }

配置拦截器

.AddClientIntercepted(typeof(CacheProviderInterceptor))

5.测试

测试环境

CPU:Intel Core i7-4710MQ

内存:16G

硬盘:1T SSD+512G HDD

网络:局域网

开启redis测试结果以下:
停用Redis测试结果以下:
 

六、总结

已经开始研发API网关,近期更新只会修复BUG和提交单元测试。如感兴趣请多关注或者加入QQ群:542283494

相关文章
相关标签/搜索