surging受到不少.net同学的青睐,也提了不少问题,提的最多的是什么时候集成API 网关,在这里回答大家最近已经开始着手研发,应该在1,2个月内会有个初版API网关,其它像Token身份验证,限流降级等功能完成时间会往后推
最近也更新了surging新的版本
更新内容:
1. Cache中间件基于Redis 所依赖的第三方库已将servicestack.redis转成stackexchange
2. 增加缓存降级
3. 增加拦截缓存降级的例子
开源地址:https://github.com/dotnetcore/surging
IDE:Visual Studio 2017 15.3 Preview ,vscode
框架:.NET core 2.0
vscode 技术支持:
周松柏(zsbfre)
在剥析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
{
"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的缓存调用
1
cacheProvider = CacheContainer.GetInstances<ICacheProvider>(“ddlCache.Redis”);
基于MemoryCache的缓存调用
CacheContainer.GetInstances
对于服务所返回的数据,有些是不需要经常修改,可以通过缓存返回数据,比如商品应用,商品分类,商品列表、用户信息,订单信息,购物车等,通过以上需求我们就要对于proxy进行拦截,返回缓存或者删除缓存。
对于缓存会有以下疑问
缓存降级
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))
测试环境
CPU:Intel Core i7-4710MQ
内存:16G
硬盘:1T SSD+512G HDD
网络:局域网
开启redis测试结果如下:
停用Redis测试结果如下:
已经开始研发API网关,近期更新只会修复BUG和提交单元测试。如感兴趣请多关注或者加入QQ群:615562965
手机扫一扫
移动阅读更方便
你可能感兴趣的文章