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

释放双眼,带上耳机,听听看~!

1**、前言**

surging受到不少.net同学的青睐,也提了不少问题,提的最多的是什么时候集成API 网关,在这里回答大家最近已经开始着手研发,应该在1,2个月内会有个初版API网关,其它像Token身份验证,限流降级等功能完成时间会往后推

最近也更新了surging新的版本

更新内容:

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

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

2.软件环境

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

vscode 技术支持:

周松柏(
zsbfre)

**3、**Cache中间件的使用

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

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

1.创建
配置文件

cacheSettings.json


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
38
39
40
41
42
43
44
45
46
47
48
49
1{
2    "CachingSettings": [
3      {
4        "Id": "ddlCache",
5        "Class": "Surging.Core.Caching.RedisCache.RedisContext,Surging.Core.Caching",
6        "Properties": [
7          {
8            "Name": "appRuleFile",
9            "Ref": "rule"
10          },
11          {
12            "Name": "dataContextPool",
13            "Ref": "ddls_sample",
14            "Maps": [
15              {
16                "Name": "Redis",
17                "Properties": [
18                  {
19                    "value": "127.0.0.1:6379::1"
20                  }
21                ]
22              },
23              {
24                "Name": "MemoryCache"
25              }
26            ]
27          },
28          {
29            "Name": "defaultExpireTime",
30            "value": "120"
31          },
32          {
33            "Name": "connectTimeout",
34            "Value": "120"
35          },
36          {
37            "Name": "minSize",
38            "Value": "1"
39          },
40          {
41            "Name": "maxSize",
42            "Value": "10"
43          }
44        ]
45      }
46    ]
47}
48
49

可以支持多个实例配置通过配置id来标识唯一,并且通过配置Maps,来初始化服务节点列表,通过哈希一致性来选择服务节点

配置参数列表

CachingSettings
包含多个实例的父级配置节
Id
唯一标识
Class
对于Context的适配
Properties
Cache 相关配置节
Maps
配置服务节列表
minSize
对象池最小数
maxSize
objectpool最大数

2.代码配置

 


1
2
3
4
5
6
7
8
9
1        /// <summary>
2        /// 配置缓存服务
3        /// </summary>
4        public static void ConfigureCache(IConfigurationBuilder build)
5        {
6            build
7              .AddCacheFile("cacheSettings.json", optional: false);
8        }  
9

以上我们就完成了缓存中间件配置,接下来就可以通过以下代码进行调用

基于redis的缓存调用


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

 基于MemoryCache的缓存调用


1
2
1CacheContainer.GetInstances<ICacheProvider>("MemoryCache")
2

**4、**缓存降级

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

对于缓存会有以下疑问

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

缓存降级

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

 在数据进行update,delete的时候就需要针对于依赖的缓存进行删除,可以通过proxy进行拦截的方式把缓存进行删除

 缓存降级有以下优点

1.高性能:可以减少响应时间和提高吞吐量

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

以下通过示例来介绍如何使用

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


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

拦截获取缓存


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

拦截删除缓存


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

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


1
2
3
4
5
6
7
8
9
10
11
1    public class UserModel
2    {
3
4        [CacheKey(1)]
5        public int UserId { get; set; }
6
7        public string Name { get; set; }
8
9        public int Age { get; set; }
10    }
11

配置拦截器


1
2
1.AddClientIntercepted(typeof(CacheProviderInterceptor))
2

5.测试

测试环境

CPU:Intel Core i7-4710MQ

内存:16G

硬盘:1T SSD+512G HDD

网络:局域网

开启redis测试结果如下:

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

停用Redis测试结果如下:

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

 

6、总结

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

 

转载于:https://www.cnblogs.com/fanliang11/p/7256069.html

给TA打赏
共{{data.count}}人
人已打赏
安全网络

CDN安全市场到2022年价值76.3亿美元

2018-2-1 18:02:50

安全技术

Spring简介

2022-1-12 12:36:11

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索