基于surging跨網(wǎng)關(guān)跨語言進(jìn)行緩存降級的問題小結(jié)
概述
surging是一款開源的微服務(wù)引擎,包含了rpc服務(wù)治理,中間件,以及多種外部協(xié)議來解決各個(gè)行業(yè)的業(yè)務(wù)問題,在日益發(fā)展的今天,業(yè)務(wù)的需求也更加復(fù)雜,單一語言也未必能抗下所有,所以在多語言行業(yè)解決方案優(yōu)勢情況下,那么就需要多語言的協(xié)同研發(fā),而對于協(xié)同研發(fā)環(huán)境下,統(tǒng)一配置的網(wǎng)關(guān),多語言訪問調(diào)用必然會涉及到需要數(shù)據(jù)緩存的問題,那么怎么做到跨網(wǎng)關(guān)跨語言緩存降級呢?那么將在此篇文章中進(jìn)行講解。
如何創(chuàng)建攔截器
繼承IInterceptor ,創(chuàng)建攔截,如下代碼所示
public class LogProviderInterceptor : IInterceptor { public async Task Intercept(IInvocation invocation) { await invocation.Proceed(); var result = invocation.ReturnValue; } }
服務(wù)引擎針對于IInterceptor 擴(kuò)展了CacheInterceptor用來做緩存攔截,如以下代碼所示
public class CacheProviderInterceptor : CacheInterceptor { public override async Task Intercept(ICacheInvocation invocation) { } }
如何使用緩存攔截器
通過設(shè)置特性Metadatas.ServiceCacheIntercept配置緩存攔截,如以下代碼所示
[Metadatas.ServiceCacheIntercept(Metadatas.CachingMethod.Get, Key = "GetUser_{0}_{1}", L2Key = "GetUser_{0}_{1}",EnableL2Cache =true, CacheSectionType = "ddlCache", Mode = Metadatas.CacheTargetType.Redis, Time = 480)]
在處理業(yè)務(wù)的修改,刪除方法時(shí)候,需要移除依賴的緩存,那么可以設(shè)置CorrespondingKeys,如以下代碼所示
[Metadatas.ServiceCacheIntercept(CachingMethod.Remove, "GetUser_id_{0}", "GetUserName_name_{0}", CacheSectionType = SectionType.ddlCache, Mode = CacheTargetType.Redis)]
如何設(shè)置緩存Key
1.比如緩存設(shè)置為GetUserById_{0}, 傳遞的參數(shù)是int 類型,值為2199 ,那么產(chǎn)生的key就是GetUserById_2199.
2.比如緩存設(shè)置為GetUser_{0}_{1},傳遞的參數(shù)是UserModel類型,傳遞為new UserModel{ UserId=2199,Name="Fanly" }值,那么產(chǎn)生的Key就是GetUser_fanly_2199. 標(biāo)識CacheKeyAttribute特性以生成緩存key, 并且設(shè)置SortIndex排序依次生成。
public class UserModel { [CacheKey(1)] public int UserId { get; set; } [CacheKey(2)] public string Name { get; set; } public int Age { get; set; } }
創(chuàng)建攔截模塊
通過以下代碼,把攔截器注入到服務(wù)引擎中
public class IntercepteModule : SystemModule { public override void Initialize(CPlatformContainer serviceProvider) { base.Initialize(serviceProvider); } /// <summary> /// Inject dependent third-party components /// </summary> /// <param name="builder"></param> protected override void RegisterBuilder(ContainerBuilderWrapper builder) { base.RegisterBuilder(builder); builder.AddClientIntercepted(typeof(CacheProviderInterceptor),typeof(LogProviderInterceptor)); } }
如何跨語言調(diào)用中開啟緩存攔截降級
在surging 是調(diào)用分為二種
1.基于接口創(chuàng)建代理調(diào)用,可以作為同一語言的互相調(diào)用,性能上比第二種基于routepath要快,但是具有高耦合性
var userProxy = ServiceLocator.GetService<IServiceProxyFactory>().CreateProxy<IUserService>("User");
2.基于routepath調(diào)用,可以作為跨語言調(diào)用,性能上比第一種基于接口創(chuàng)建代理要慢,但是具有低耦合性
Dictionary<string, object> model = new Dictionary<string, object>(); model.Add("name", name); string path = "api/hello/say"; string result =await _serviceProxyProvider.Invoke<object>(model, path, null);
而在服務(wù)調(diào)用下,因?yàn)闃I(yè)務(wù)模型參數(shù)在基于routepath調(diào)用情況,做不到模型參數(shù)解析,只能支持單一參數(shù)和無參數(shù)的緩存攔截調(diào)用,而基于接口創(chuàng)建代理調(diào)用是可以支持業(yè)務(wù)模型緩存調(diào)用的,在以下特征情況下就需要在Metadatas.ServiceCacheIntercept特性下開啟EnableStageCache,代碼如下
[Metadatas.ServiceCacheIntercept(Metadatas.CachingMethod.Get, Key = "GetDictionary", L2Key = "GetDictionary", EnableL2Cache = true, CacheSectionType = "ddlCache", Mode = Metadatas.CacheTargetType.Redis, Time = 480, EnableStageCache = true)]
通過以上的代碼,運(yùn)行后,在注冊中心注冊的服務(wù)路由下可以看到攔截器元數(shù)據(jù),這樣在其它語言通過元數(shù)據(jù)可以構(gòu)造服務(wù)消費(fèi)者的緩存攔截降級。
以下是基于二種調(diào)用的緩存結(jié)果存儲redis中
如何處理緩存K/V 中Value 過大
緩存中間件Redis是一種高性能的內(nèi)存數(shù)據(jù)庫,用于存儲鍵值對的數(shù)據(jù)結(jié)構(gòu)。當(dāng)value的大小超過一定限制時(shí),一般超過10K就會影響查詢的性能。這時(shí)候使用一二級緩存來解決,一級緩存用redis 存儲標(biāo)記,標(biāo)記緩存是否失效,二級緩存用本地緩存存儲,當(dāng)標(biāo)記失效不存在后,會遠(yuǎn)程調(diào)用服務(wù),返回結(jié)果添加一級緩存標(biāo)記,返回結(jié)果添加到二級緩存。
提示:大家可以按照自己的業(yè)務(wù)需求,研發(fā)緩存攔截,不一定非要使用CacheProviderInterceptor,按照CacheProviderInterceptor一二級緩存進(jìn)行構(gòu)建研發(fā)
總結(jié)
社區(qū)版:https://github.com/fanliang11/surging,如果需要其它版本,請聯(lián)系作者。
到此這篇關(guān)于如何基于surging跨網(wǎng)關(guān)跨語言進(jìn)行緩存降級的文章就介紹到這了,更多相關(guān)如何基于surging跨網(wǎng)關(guān)跨語言進(jìn)行緩存降級內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
一文徹底弄懂spring?boot自動(dòng)配置的過程(推薦)
SpringBoot的自動(dòng)配置機(jī)制通過@SpringBootApplication注解作為起點(diǎn),結(jié)合@EnableAutoConfiguration和spring.factories文件,實(shí)現(xiàn)了基于類路徑依賴、環(huán)境配置和自定義代碼的智能化配置,感興趣的朋友跟隨小編一起看看吧2024-10-10Mybatis(ParameterType)傳遞多個(gè)不同類型的參數(shù)方式
這篇文章主要介紹了Mybatis(ParameterType)傳遞多個(gè)不同類型的參數(shù)方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04Springboot配置文件內(nèi)容加密代碼實(shí)例
這篇文章主要介紹了Springboot配置文件內(nèi)容加密代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11Spring cloud 查詢返回廣告創(chuàng)意實(shí)例代碼
在本篇文章里小編給大家整理的是關(guān)于Spring cloud 查詢返回廣告創(chuàng)意實(shí)例代碼,需要的朋友們可以跟著學(xué)習(xí)下。2019-08-08java中timer的schedule和scheduleAtFixedRate方法區(qū)別詳解
這篇文章主要為大家詳細(xì)介紹了java中timer的schedule和scheduleAtFixedRate方法區(qū)別,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12springboot項(xiàng)目實(shí)現(xiàn)多數(shù)據(jù)源配置使用dynamic-datasource-spring-boot-starter
這篇文章主要介紹了springboot項(xiàng)目實(shí)現(xiàn)多數(shù)據(jù)源配置使用dynamic-datasource-spring-boot-starter,本文分步驟結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-06-06