基于.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的适配
PropertiesCache 相关配置节

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进行拦截,返回缓存或者删除缓存。

对于缓存会有以下疑问

  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测试结果如下:

 

6、总结

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

相关文章

  • 谷歌发布的首款基于HTTP/2和protobuf的RPC框架:GRPC

  • 拥抱.NET Core,跨平台的轻量级RPC:Rabbit.Rpc

  • 基于DotNet Core的RPC框架(一) DotBPE.RPC快速开始

  • 基于.NET CORE微服务框架 -surging的介绍和简单示例 (开源)

  • 剥析surging的架构思想

  • 基于.NET CORE微服务框架 -谈谈surging的服务容错降级

原文地址:http://www.cnblogs.com/fanliang11/p/7256069.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/324385.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1 分钟教会你用 Spring Boot 发邮件

转载自 1 分钟教会你用 Spring Boot 发邮件 Spring Boot 提供了一个发送邮件的简单抽象&#xff0c;使用的是下面这个接口。 org.springframework.mail.javamail.JavaMailSender Spring Boot 提供了一个 starter&#xff0c;并能自动配置&#xff0c;下面来做个小例子&#xf…

小二,先来两桂花豆沙包!

“包子嘞&#xff0c;卖包子嘞&#xff0c;新出锅的大包子&#xff0c;走过路过千万不要错过呦~包子嘞……”某年某月某下午&#xff0c;百万包子铺进来一人&#xff0c;进来便招呼&#xff1a;“小二&#xff0c;包子怎么卖&#xff1f;”小二&#xff1a;“客官&#xff0c;你…

ssl初一组周六模拟赛【2018.4.21】

前言 hzb大佬好强啊&#xff0c;hzb好强啊&#xff0c;大佬好强啊&#xff0c;好强啊&#xff0c;超级强的。 后面有惊喜 先说一下成绩&#xff1a; 姓名成绩zyc390hzb360lrz340xjq310xxy300(话说原本是350)wyc290hjq230lw200 正题 题目1&#xff1a;ssl2402 世界语【水题…

SQL Server 2017 RC1 现已实现 Linux 功能扩展

经过七个预览版本的迭代之后&#xff0c;Microsoft 宣告发布第一个 SQL Server 2017 候选版本。开发人员可以藉由该版本来探索一些扩展 SQL Server Linux 版能力的新改进。 在这些新改进中&#xff0c;首先是对 Linux 上SQL Server 的 Active Directory 身份验证的支持。使用 …

一百馒头一百僧,大僧三个更无争,小僧三人分一个大小和尚得几丁?

如题&#xff1a;一百馒头一百僧&#xff0c;大僧三个更无争&#xff0c;小僧三人分一个大小和尚得几丁&#xff1f; 要求使用java实现求得大僧小僧各有多少人&#xff1f; public class shdjshj {public static void main(String[] args) {for(int i 1;i<100;i){int j 1…

vijos1237-隐形的翅膀【离散化】

正题 题目链接&#xff1a;https://vijos.org/p/1237 大意 有n支长度不一翅膀&#xff0c;要求选择两只最接近黄金分割率的翅膀。 解题思路 暴力枚举O(n2)O(n2)是过不了的。 所有这就要用到离散了&#xff0c;给翅膀长度排序。 然后一个i和一个j&#xff0c;根据算出的比黄…

Microsoft使用.NET Core SDK遥测数据

Microsoft发布了采集自.NET Core SDK用户的遥测原始数据集。数据集的时间跨度是从2016年第三季度到2017年第二季度&#xff0c;为了解当前开发人员使用SDK的情况提供了一个视角。据Microsoft的Rich Lander介绍&#xff0c;今后Microsoft将每季度提供一次遥测数据集&#xff0c;…

你们好好的学,回头教教我~

辣椒酱中奖的已经安排发货了&#xff0c;不日即可达到&#xff0c;注意收货。雄雄辣椒酱&#xff0c;免费送~这一周&#xff0c;3班的孩子们都在培训双创的内容&#xff0c;因为这个培训是学校统一组织的&#xff0c;所以对培训的内容以及培训方式我是一无所知的。周二我值班&a…

你必须掌握的 21 个 Java 核心技术

转载自 你必须掌握的 21 个 Java 核心技术 写这篇文章的目的是想总结一下自己这么多年来使用java的一些心得体会&#xff0c;希望可以给大家一些经验&#xff0c;能让大家更好学习和使用Java。 这次介绍的主要内容是和J2SE相关的部分&#xff0c;另外&#xff0c;会在以后再…

CAP 介绍及使用【视频】

前言 很多同学可能对于CAP这个项目想有更一步的了解&#xff0c;包括她的工作原理以及适用的场景&#xff0c;所以博主就准备了一场直播给大家讲解了一下&#xff0c;这个视频是直播的一个录像。 由于我这次直播本来是没有打算对外的&#xff0c;所以也是没有怎么准备的&…

P1090-合并果子【离散化,队列,时间复杂度O(n)】

正题 洛谷题目链接&#xff1a; https://www.luogu.org/problemnew/show/P1090 洛谷博客链接&#xff1a; https://www.luogu.org/blog/user52918/solution-p1090 O(nlogn)O(nlogn)堆算法&#xff1a; https://blog.csdn.net/mr_wuyongcong/article/details/79223780 大意…

投资理财要趁早,基金风险是最小!

大家好&#xff0c;我是雄雄&#xff0c;前几天&#xff0c;有人私信我让我在公众号中推一篇关于理财的文章&#xff0c;说实在的&#xff0c;以我这二把刀的能力&#xff0c;没啥资历教大家理财&#xff0c;不过既然人家都这么说了&#xff0c;那我就来分享一下我自己对于目前…

Java中线程池,你真的会用吗

转载自 Java中线程池&#xff0c;你真的会用吗 在《深入源码分析Java线程池的实现原理》这篇文章中&#xff0c;我们介绍过了Java中线程池的常见用法以及基本原理。 在文中有这样一段描述&#xff1a; 可以通过Executors静态工厂构建线程池&#xff0c;但一般不建议这样使…

解决 CefSharp WPF控件不能使用输入法输入中文的问题(代码已提交到 github)

首先&#xff0c;本文所有 代码已经提交到github&#xff0c;需要的可以直接从github获取&#xff1a;https://github.com/starts2000/CefSharp&#xff0c;希望可以帮助到有需要的朋友们。 CEF 简介 CEF is a BSD-licensed open source project founded by Marshall Greenbl…

ssl1747-登山机器人【离散化,玄学,贪心】

正题 大意 有n个机器人&#xff0c;每个机器人带xi点能量&#xff0c;行走需要消耗yi点能量&#xff0c;求这个n个机器人不回头的接力最多能走多远&#xff08;一个走到就行了&#xff09;。 解题思路 好像不是很难&#xff0c;处理接力时油的交接就好了。 假设现在有两个机…

java中的泛型类型擦除

大家好&#xff0c;我是雄雄&#xff0c;今天给大家分享的是&#xff1a;java的泛型是类型擦除的。写在前面那么何为类型擦除&#xff1f;类型擦除就是在编译期明确去掉所编程序的类型系统。啥&#xff1f;还不明白&#xff1f;以java泛型为例&#xff0c;java的泛型在编译期有…