基于.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>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 =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,如
?? ? ? ?[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跨平臺或掃描二維碼關注
總結
以上是生活随笔為你收集整理的基于.NET CORE微服务框架 -谈谈Cache中间件和缓存降级的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 浅谈 EF CORE 迁移和实例化的几种
- 下一篇: Microsoft使用.NET Core