surging 受到不少. net 同学的青睐,也提了不少问题,提的最多的是什么时候集成 API 网关,在这里回答大家最近已经开始着手研发,应该在 1,2 个月内会有个初版 API 网关,其它像 Token 身份验证,限流降级等功能完成时间会往后推
最近也更新了 surging 新的版本
更新内容:
1. Cache 中间件基于 Redis 所依赖的第三方库已将 servicestack.redis 转成 stackexchange
2. 增加缓存降级
3. 增加拦截缓存降级的例子
开源地址:https://github.com/dotnetcore/surging
在剥析 surging 的架构思想这篇文章中大致提了下 Cache 中间件,大家也对 Cache 中间件有了初步印象,这一节我们将谈谈怎么使用 Cache 中间件
1. 创建配置文件
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("MemoryCache")
对于服务所返回的数据,有些是不需要经常修改,可以通过缓存返回数据,比如商品应用,商品分类,商品列表、用户信息,订单信息,购物车等,通过以上需求我们就要对于 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
网络:局域网
已经开始研发 API 网关,近期更新只会修复 BUG 和提交单元测试。如感兴趣请多关注或者加入 QQ 群:615562965
来源: http://www.cnblogs.com/fanliang11/p/7256069.html