【.NET Core项目实战-统一认证平台】第五章 网关篇-自定义缓存Redis
上篇文章【.NET Core項(xiàng)目實(shí)戰(zhàn)-統(tǒng)一認(rèn)證平臺(tái)】第四章 網(wǎng)關(guān)篇-數(shù)據(jù)庫存儲(chǔ)配置(2)我們介紹了2種網(wǎng)關(guān)配置信息更新的方法和擴(kuò)展Mysql存儲(chǔ),本篇我們將介紹如何使用Redis來實(shí)現(xiàn)網(wǎng)關(guān)的所有緩存功能,用到的文檔及源碼將會(huì)在GitHub上開源,每篇的源代碼我將用分支的方式管理,本篇使用的分支為course3。
附文檔及源碼下載地址:[https://github.com/jinyancao/CtrAuthPlatform/tree/course3]
一、緩存介紹及選型
網(wǎng)關(guān)的一個(gè)重要的功能就是緩存,可以對(duì)一些不常更新的數(shù)據(jù)進(jìn)行緩存,減少后端服務(wù)開銷,默認(rèn)Ocelot實(shí)現(xiàn)的緩存為本地文件進(jìn)行緩存,無法達(dá)到生產(chǎn)環(huán)境大型應(yīng)用的需求,而且不支持分布式環(huán)境部署,所以我們需要一個(gè)滿足大型應(yīng)用和分布式環(huán)境部署的緩存方案。Redis應(yīng)該是當(dāng)前應(yīng)用最廣泛的緩存數(shù)據(jù)庫,支持5種存儲(chǔ)類型,滿足不同應(yīng)用的實(shí)現(xiàn),且支持分布式部署等特性,所以緩存我們決定使用Redis作為緩存實(shí)現(xiàn)。
本文將介紹使用CSRedisCore來實(shí)現(xiàn)Redis相關(guān)操作,至于為什么選擇CSRedisCore,可參考文章[.NET Core開發(fā)者的福音之玩轉(zhuǎn)Redis的又一傻瓜式神器推薦],里面詳細(xì)的介紹了各種Redis組件比較及高級(jí)應(yīng)用,并列出了不同組件的壓力測(cè)試對(duì)比,另外也附CSRedisCore作者交流QQ群:8578575,使用中有什么問題可以直接咨詢作者本人。
二、緩存擴(kuò)展實(shí)現(xiàn)
首先本地安裝Redis和管理工具Redis Desktop Manager,本文不介紹安裝過程,然后NuGet安裝?CSRedisCore,現(xiàn)在開始我們重寫IOcelotCache<T>的實(shí)現(xiàn),新建InRedisCache.cs文件。
實(shí)現(xiàn)所有緩存相關(guān)接口,是不是很優(yōu)雅呢?實(shí)現(xiàn)好緩存后,我們需要把我們現(xiàn)實(shí)的注入到網(wǎng)關(guān)里,在ServiceCollectionExtensions類中,修改注入方法。
奈斯,我們使用Redis實(shí)現(xiàn)緩存已經(jīng)全部完成,現(xiàn)在開始我們?cè)诰W(wǎng)關(guān)配置信息增加緩存來測(cè)試下,看緩存是否生效,并查看是否存儲(chǔ)在Redis里。
為了驗(yàn)證緩存是否生效,修改測(cè)試服務(wù)api/values/{id}代碼,增加服務(wù)器時(shí)間輸出。
增加新的測(cè)試路由腳本,然后增加緩存策略,緩存60秒,緩存分類test_ahphocelot。
現(xiàn)在我們測(cè)試訪問網(wǎng)關(guān)地址http://localhost:7777/api/values/1,過幾十秒后繼續(xù)訪問,結(jié)果如下。
可以看出來,緩存已經(jīng)生效,1分鐘內(nèi)請(qǐng)求都不會(huì)路由到服務(wù)端,再查詢下redis緩存數(shù)據(jù),發(fā)現(xiàn)緩存信息已經(jīng)存在,然后使用Redis Desktop Manager查看Redis緩存信息是否存在,奈斯,已經(jīng)存在,說明已經(jīng)達(dá)到我們預(yù)期目的。
三、解決網(wǎng)關(guān)集群配置信息變更問題
前面幾篇已經(jīng)介紹了網(wǎng)關(guān)的數(shù)據(jù)庫存儲(chǔ),并介紹了網(wǎng)關(guān)的2種更新方式,但是如果網(wǎng)關(guān)集群部署時(shí),采用接口更新方式,無法直接更新所有集群端配置數(shù)據(jù),那如何實(shí)現(xiàn)集群配置信息一致呢?前面介紹了redis緩存,可以解決當(dāng)前遇到的問題,我們需要重寫內(nèi)部配置文件提取倉儲(chǔ)類,使用redis存儲(chǔ)。
我們首先使用redis實(shí)現(xiàn)IInternalConfigurationRepository接口,每次請(qǐng)求配置信息時(shí)直接從redis存儲(chǔ),避免單機(jī)緩存出現(xiàn)數(shù)據(jù)無法更新的情況。RedisInternalConfigurationRepository代碼如下。
redis實(shí)現(xiàn)后,然后在ServiceCollectionExtensions里增加接口實(shí)現(xiàn)注入。
builder.Services.AddSingleton<IInternalConfigurationRepository, RedisInternalConfigurationRepository>();然后啟動(dòng)網(wǎng)關(guān)測(cè)試,可以發(fā)現(xiàn)網(wǎng)關(guān)配置信息已經(jīng)使用redis緩存了,可以解決集群部署后無法同步更新問題。
四、如何清除緩存記錄
實(shí)際項(xiàng)目使用過程中,可能會(huì)遇到需要立即清除緩存數(shù)據(jù),那如何實(shí)現(xiàn)從網(wǎng)關(guān)清除緩存數(shù)據(jù)呢?在上篇中我們介紹了接口更新網(wǎng)關(guān)配置的說明,緩存的更新也是使用接口的方式進(jìn)行刪除,詳細(xì)代碼如下。
我們可以先拉去授權(quán),獲取授權(quán)方式請(qǐng)參考上一篇,然后使用HTTP DELETE方式,請(qǐng)求刪除地址,比如刪除前面的測(cè)試緩存接口,可以請(qǐng)求http://localhost:7777/CtrOcelot/outputcache/test_ahphocelot地址進(jìn)行刪除,可以使用PostMan進(jìn)行測(cè)試,測(cè)試結(jié)果如下。
執(zhí)行成功后可以刪除指定的緩存記錄,且立即生效,完美的解決了我們問題。
五、總結(jié)及預(yù)告
本篇我們介紹了使用redis緩存來重寫網(wǎng)關(guān)的所有緩存模塊,并把網(wǎng)關(guān)配置信息也存儲(chǔ)到redis里,來解決集群部署的問題,如果想清理緩存數(shù)據(jù),通過網(wǎng)關(guān)指定的授權(quán)接口即可完成,完全具備了網(wǎng)關(guān)的緩存的相關(guān)模塊的需求。
下一篇開始我們開始介紹針對(duì)不同客戶端設(shè)置不同的權(quán)限來實(shí)現(xiàn)自定義認(rèn)證,敬請(qǐng)期待,后面的課程會(huì)越來越精彩,也希望大家多多支持。
相關(guān)文章:
AspNetCore中使用Ocelot之 IdentityServer4
Ocelot-基于.NET Core的開源網(wǎng)關(guān)實(shí)現(xiàn)
.NET Core微服務(wù)之基于Ocelot+IdentityServer實(shí)現(xiàn)統(tǒng)一驗(yàn)證與授權(quán)
Swagger如何訪問Ocelot中帶權(quán)限驗(yàn)證的API
Ocelot.JwtAuthorize:一個(gè)基于網(wǎng)關(guān)的Jwt驗(yàn)證包
.NET Core微服務(wù)之基于Ocelot實(shí)現(xiàn)API網(wǎng)關(guān)服務(wù)
.NET Core微服務(wù)之基于Ocelot實(shí)現(xiàn)API網(wǎng)關(guān)服務(wù)(續(xù))
.NET微服務(wù)體系結(jié)構(gòu)中為什么使用Ocelot實(shí)現(xiàn)API網(wǎng)關(guān)
Ocelot簡易教程(一)之Ocelot是什么
Ocelot簡易教程(二)之快速開始1
Ocelot簡易教程(二)之快速開始2
Ocelot簡易教程(三)之主要特性及路由詳解
Ocelot簡易教程(四)之請(qǐng)求聚合以及服務(wù)發(fā)現(xiàn)
Ocelot簡易教程(五)之集成IdentityServer認(rèn)證以及授權(quán)
Ocelot簡易教程(六)之重寫配置文件存儲(chǔ)方式并優(yōu)化響應(yīng)數(shù)據(jù)
Ocelot簡易教程(七)之配置文件數(shù)據(jù)庫存儲(chǔ)插件源碼解析
ASP.NET Core中Ocelot的使用:API網(wǎng)關(guān)的應(yīng)用
ASP.NET Core中Ocelot的使用:基于Spring Cloud Netflix Eureka的動(dòng)態(tài)路由
ASP.NET Core中Ocelot的使用:基于服務(wù)發(fā)現(xiàn)的負(fù)載均衡
【.NET Core項(xiàng)目實(shí)戰(zhàn)-統(tǒng)一認(rèn)證平臺(tái)】第一章 功能及架構(gòu)分析
定制Ocelot來滿足需求
【.NET Core項(xiàng)目實(shí)戰(zhàn)-統(tǒng)一認(rèn)證平臺(tái)】第三章 網(wǎng)關(guān)篇-數(shù)據(jù)庫存儲(chǔ)配置(1)
【.NET Core項(xiàng)目實(shí)戰(zhàn)-統(tǒng)一認(rèn)證平臺(tái)】第四章 網(wǎng)關(guān)篇-數(shù)據(jù)庫存儲(chǔ)配置(2)
原文地址: https://www.cnblogs.com/jackcao/p/9960788.html
.NET社區(qū)新聞,深度好文,歡迎訪問公眾號(hào)文章匯總 http://www.csharpkit.com
總結(jié)
以上是生活随笔為你收集整理的【.NET Core项目实战-统一认证平台】第五章 网关篇-自定义缓存Redis的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: EF Core 实现多租户
- 下一篇: 一份来自28岁.NET老程序员的自白