基于.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中间件的使用

在剥析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<ICacheProvider>("MemoryCache")
4、缓存降级
对于服务所返回的数据,有些是不需要经常修改,可以通过缓存返回数据,比如商品应用,商品分类,商品列表、用户信息,订单信息,购物车等,通过以上需求我们就要对于proxy进行拦截,返回缓存或者删除缓存。
对于缓存会有以下疑问
- 数据一致性:对于服务是分布式部署在各台服务器上, 缓存存储读取也应该支持分布式,所以应该选择支持分布式的缓存框架,如:redis,couchbase,membercache
- 缓存命中率:在无命中的情况下,无法直接通过缓存获取到想要的数据,而直接通过调用远程服务获取数据,这样就会增加响应时间和影响吞吐量,所以我们必须引用工具进行监控
缓存降级
surging的缓存降级就是针对于proxy进行拦截,如果有缓存数据,则返回缓存数据,否则调用Proceed方法调用远程服务。
在数据进行update,delete的时候就需要针对于依赖的缓存进行删除,可以通过proxy进行拦截的方式把缓存进行删除
缓存降级有以下优点
1.高性能:可以减少响应时间和提高吞吐量
2.高效:针对于业务逻辑的设计,无需考虑缓存,做到了无缝集成
以下通过示例来介绍如何使用
在业务接口方法上添加如下特性
[Command(Strategy= StrategyType.Failover,FailoverCluster =,RequestCacheEnabled =true)] //RequestCacheEnabled =true 就是启用缓存
拦截获取缓存
[InterceptMethod(CachingMethod.Get, Key = "GetUser_id_{0}", Mode = CacheTargetType.Redis, Time = )]
拦截删除缓存
[InterceptMethod(CachingMethod.Remove, "GetUser_id_{0}", "GetUserName_name_{0}", Mode = CacheTargetType.Redis)]
应用[CacheKey]来标识缓存Key,如
public class UserModel
{ [CacheKey()]
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
网络:局域网


6、总结
已经开始研发API网关,近期更新只会修复BUG和提交单元测试。如感兴趣请多关注或者加入QQ群:615562965
基于.NET CORE微服务框架 -谈谈Cache中间件和缓存降级的更多相关文章
- 基于.NET CORE微服务框架 -谈谈surging API网关
1.前言 对于最近surging更新的API 网关大家也有所关注,也收到了不少反馈提出是否能介绍下Api网关,那么我们将在此篇文章中剥析下surging的Api 网关 开源地址:https://git ...
- 基于.NET CORE微服务框架 -谈谈surging的服务容错降级
一.前言 对于不久开源的surging受到不少.net同学的青睐,也受到.net core学习小组的关注,邀请加入.NET China Foundation以方便国内.net core开源项目的推广, ...
- 基于.NET CORE微服务框架 -谈谈surging 的messagepack、protobuffer、json.net 序列化
1.前言 surging内部使用的是高性能RPC远程服务调用,如果用json.net序列化肯定性能上达不到最优,所以后面扩展了protobuf,messagepack序列化组件,以支持RPC二进制传输 ...
- 基于.NET CORE微服务框架 -surging的介绍和简单示例 (开源)
一.前言 至今为止编程开发已经11个年头,从 VB6.0,ASP时代到ASP.NET再到MVC, 从中见证了.NET技术发展,从无畏无知的懵懂少年,到现在的中年大叔,从中的酸甜苦辣也只有本人自知.随着 ...
- 基于.NET CORE微服务框架 -浅析如何使用surging
1.前言 surging受到大家这么强烈的关注,我感到非常意外,比如有同僚在公司的分享会上分享surging, 还有在博客拿其它的RPC框架,微服务做对比等等,这些举动都让我感觉压力很大,毕竟作为个人 ...
- 基于.NET CORE微服务框架 -Api网关服务管理
1.前言 经过10多天的努力,surging 网关已经有了大致的雏形,后面还会持续更新完善,请大家持续关注研发的动态 最近也更新了surging新的版本 更新内容: 1. 扩展Zookeeper封装2 ...
- 基于.NET CORE微服务框架 -surging 基于messagepack、protobuffer、json.net 性能对比
1.前言 surging内部使用的是高性能RPC远程服务调用,如果用json.net序列化肯定性能上达不到最优,所以后面扩展了protobuf,messagepack序列化组件,以支持RPC二进制传输 ...
- 基于thrift的微服务框架
前一阵开源过一个基于spring-boot的rest微服务框架,今天再来一篇基于thrift的微服务加框,thrift是啥就不多了,大家自行百度或参考我之前介绍thrift的文章, thrift不仅支 ...
- 基于Spring-Cloud的微服务框架设计
基于Spring-Cloud的微服务框架设计 先进行大的整体的框架整理,然后在针对每一项进行具体的详细介绍
随机推荐
- 利用angular控制元素的显示和隐藏
<!DOCTYPE html> <html lang="en" ng-app="myapp"> <head> <met ...
- Webstorm 激活破解
2017-06-15更新 之前都是使用2017.2.27的方法,版本是2017.1.1,还没提示过期,但是根据评论说这个链接已经失效了,评论也给出了个新地址:http://idea.iteblog.c ...
- Java IO学习笔记五
管道流 管道流的主要作用是可以进行两个线程间的通讯,分为管道输出流(PipedOutputStream).管道输入流(PipedInputStream),如果想要进行管道输出,则必须要把输出流连在输入 ...
- ReactiveCocoa源码解析(三) Signal代码的基本实现
上篇博客我们详细的聊了ReactiveSwift源码中的Bag容器,详情请参见<ReactiveSwift源码解析之Bag容器>.本篇博客我们就来聊一下信号量,也就是Signal的的几种状 ...
- java 抛出异常
这种方式serviceImpl 方法不用throws异常,比较方便 if(count>0){ //或者 IllegalArgumentException java的 throw new Ille ...
- 修改linux的系统时间
可以使用date命令.date用于打印或设置系统日期和时间.设置系统时间需要root权限.用法示例:设置系统日期成2015年08月13日,这样会把具体时间设置清空成00:00:00$ sudo dat ...
- 【原】无脑操作:eclipse + maven搭建SSM框架
网上看到一些Spring + Spring MVC + MyBatis框架的搭建教程,不是很详细或是时间久远了,自己动手整一个简单无脑的! 0.系统环境 1)Windows 10 企业版 2)JDK ...
- 12.引入依赖项目的时候,如果找不到jar
原因是bin没有生成,先clean依赖包,再clean原工程包,就可以了
- 经验之谈——gulp使用教程
gulp的最实用教程 使用gulp编译less.sass.压缩js等常用功能讲解 gulp是前端开发过程中对代码进行构建的工具,是自动化项目的构建利器:她不仅能对网站资源进行优化,而且在开发过程中很多 ...
- 最近学习java时的记录
1.java 的变量一共分为三种,类变量,局部变量,成员变量 类变量就是 加static修饰符的变量 2.java 的修饰符可分为两大类,一 可访问修饰符 protected private publ ...