基于.NET CORE微服务框架 -谈谈Cache中间件和缓存降级
1、前言
surging受到不少.net同學(xué)的青睞,也提了不少問(wèn)題,提的最多的是什么時(shí)候集成API 網(wǎng)關(guān),在這里回答大家最近已經(jīng)開(kāi)始著手研發(fā),應(yīng)該在1,2個(gè)月內(nèi)會(huì)有個(gè)初版API網(wǎng)關(guān),其它像Token身份驗(yàn)證,限流降級(jí)等功能完成時(shí)間會(huì)往后推
最近也更新了surging新的版本
更新內(nèi)容:
1. Cache中間件基于Redis 所依賴(lài)的第三方庫(kù)已將servicestack.redis轉(zhuǎn)成stackexchange?
2. 增加緩存降級(jí)
3. 增加攔截緩存降級(jí)的例子
開(kāi)源地址:https://github.com/dotnetcore/surging
2.軟件環(huán)境
IDE:Visual Studio 2017 15.3 Preview ,vscode
框架:.NET core 2.0
vscode 技術(shù)支持:
周松柏(zsbfre)
3、Cache中間件的使用
? 在剝析surging的架構(gòu)思想這篇文章中大致提了下Cache中間件,大家也對(duì)Cache中間件有了初步印象,這一節(jié)我們將談?wù)勗趺词褂?span id="ze8trgl8bvbq" class="postTitle2" style="line-height: 1.8;">Cache中間件
1.創(chuàng)建配置文件
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" ?????????? } ???????? ] ?????? } ???? ] } |
可以支持多個(gè)實(shí)例配置通過(guò)配置id來(lái)標(biāo)識(shí)唯一,并且通過(guò)配置Maps,來(lái)初始化服務(wù)節(jié)點(diǎn)列表,通過(guò)哈希一致性來(lái)選擇服務(wù)節(jié)點(diǎn)
配置參數(shù)列表
CachingSettings | 包含多個(gè)實(shí)例的父級(jí)配置節(jié) |
Id | 唯一標(biāo)識(shí) |
Class | 對(duì)于Context的適配 |
| Properties | Cache 相關(guān)配置節(jié) |
Maps | 配置服務(wù)節(jié)列表 |
minSize | 對(duì)象池最小數(shù) |
maxSize | objectpool最大數(shù) |
2.代碼配置
? ? ? ?/// </summary>public static void ConfigureCache(IConfigurationBuilder build){build.AddCacheFile("cacheSettings.json", optional: false);} ?
以上我們就完成了緩存中間件配置,接下來(lái)就可以通過(guò)以下代碼進(jìn)行調(diào)用
基于redis的緩存調(diào)用
| cacheProvider = CacheContainer.GetInstances<ICacheProvider>(“ddlCache.Redis”); |
?基于MemoryCache的緩存調(diào)用
CacheContainer.GetInstances<ICacheProvider>("MemoryCache")4、緩存降級(jí)
對(duì)于服務(wù)所返回的數(shù)據(jù),有些是不需要經(jīng)常修改,可以通過(guò)緩存返回?cái)?shù)據(jù),比如商品應(yīng)用,商品分類(lèi),商品列表、用戶(hù)信息,訂單信息,購(gòu)物車(chē)等,通過(guò)以上需求我們就要對(duì)于proxy進(jìn)行攔截,返回緩存或者刪除緩存。
對(duì)于緩存會(huì)有以下疑問(wèn)
數(shù)據(jù)一致性:對(duì)于服務(wù)是分布式部署在各臺(tái)服務(wù)器上, 緩存存儲(chǔ)讀取也應(yīng)該支持分布式,所以應(yīng)該選擇支持分布式的緩存框架,如:redis,couchbase,membercache
緩存命中率:在無(wú)命中的情況下,無(wú)法直接通過(guò)緩存獲取到想要的數(shù)據(jù),而直接通過(guò)調(diào)用遠(yuǎn)程服務(wù)獲取數(shù)據(jù),這樣就會(huì)增加響應(yīng)時(shí)間和影響吞吐量,所以我們必須引用工具進(jìn)行監(jiān)控
緩存降級(jí)
?surging的緩存降級(jí)就是針對(duì)于proxy進(jìn)行攔截,如果有緩存數(shù)據(jù),則返回緩存數(shù)據(jù),否則調(diào)用Proceed方法調(diào)用遠(yuǎn)程服務(wù)。
?在數(shù)據(jù)進(jìn)行update,delete的時(shí)候就需要針對(duì)于依賴(lài)的緩存進(jìn)行刪除,可以通過(guò)proxy進(jìn)行攔截的方式把緩存進(jìn)行刪除
?緩存降級(jí)有以下優(yōu)點(diǎn)
1.高性能:可以減少響應(yīng)時(shí)間和提高吞吐量
2.高效:針對(duì)于業(yè)務(wù)邏輯的設(shè)計(jì),無(wú)需考慮緩存,做到了無(wú)縫集成
以下通過(guò)示例來(lái)介紹如何使用
在業(yè)務(wù)接口方法上添加如下特性
[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)]應(yīng)用[CacheKey]來(lái)標(biāo)識(shí)緩存Key,如
?? ? ? ?[CacheKey(1)] ? ?
? ? ?public int UserId { get; set; } ?
? ? ?public string Name { get; set; } ?
? ? ?public int Age { get; set; }}
配置攔截器
.AddClientIntercepted(typeof(CacheProviderInterceptor))5.測(cè)試
測(cè)試環(huán)境
CPU:Intel Core i7-4710MQ
內(nèi)存:16G
硬盤(pán):1T SSD+512G HDD
網(wǎng)絡(luò):局域網(wǎng)
開(kāi)啟redis測(cè)試結(jié)果如下:
停用Redis測(cè)試結(jié)果如下:
?
6、總結(jié)
已經(jīng)開(kāi)始研發(fā)API網(wǎng)關(guān),近期更新只會(huì)修復(fù)BUG和提交單元測(cè)試。如感興趣請(qǐng)多關(guān)注或者加入QQ群:615562965
相關(guān)文章
谷歌發(fā)布的首款基于HTTP/2和protobuf的RPC框架:GRPC
擁抱.NET Core,跨平臺(tái)的輕量級(jí)RPC:Rabbit.Rpc
基于DotNet Core的RPC框架(一) DotBPE.RPC快速開(kāi)始
基于.NET CORE微服務(wù)框架 -surging的介紹和簡(jiǎn)單示例 (開(kāi)源)
剝析surging的架構(gòu)思想
基于.NET CORE微服務(wù)框架 -談?wù)剆urging的服務(wù)容錯(cuò)降級(jí)
原文地址:http://www.cnblogs.com/fanliang11/p/7256069.html
.NET社區(qū)新聞,深度好文,微信中搜索dotNET跨平臺(tái)或掃描二維碼關(guān)注
總結(jié)
以上是生活随笔為你收集整理的基于.NET CORE微服务框架 -谈谈Cache中间件和缓存降级的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 浅谈 EF CORE 迁移和实例化的几种
- 下一篇: SQL Server 2017 RC1