最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于surging跨網(wǎng)關(guān)跨語(yǔ)言進(jìn)行緩存降級(jí)的問(wèn)題小結(jié)

 更新時(shí)間:2024年05月06日 09:02:27   作者:fanly11  
surging是一款開(kāi)源的微服務(wù)引擎,包含了rpc服務(wù)治理,中間件,以及多種外部協(xié)議來(lái)解決各個(gè)行業(yè)的業(yè)務(wù)問(wèn)題,這篇文章主要介紹了如何基于surging跨網(wǎng)關(guān)跨語(yǔ)言進(jìn)行緩存降級(jí),需要的朋友可以參考下

概述

surging是一款開(kāi)源的微服務(wù)引擎,包含了rpc服務(wù)治理,中間件,以及多種外部協(xié)議來(lái)解決各個(gè)行業(yè)的業(yè)務(wù)問(wèn)題,在日益發(fā)展的今天,業(yè)務(wù)的需求也更加復(fù)雜,單一語(yǔ)言也未必能抗下所有,所以在多語(yǔ)言行業(yè)解決方案優(yōu)勢(shì)情況下,那么就需要多語(yǔ)言的協(xié)同研發(fā),而對(duì)于協(xié)同研發(fā)環(huán)境下,統(tǒng)一配置的網(wǎng)關(guān),多語(yǔ)言訪問(wèn)調(diào)用必然會(huì)涉及到需要數(shù)據(jù)緩存的問(wèn)題,那么怎么做到跨網(wǎng)關(guān)跨語(yǔ)言緩存降級(jí)呢?那么將在此篇文章中進(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ù)引擎針對(duì)于IInterceptor 擴(kuò)展了CacheInterceptor用來(lái)做緩存攔截,如以下代碼所示

public class CacheProviderInterceptor : CacheInterceptor
    {
        public override async Task Intercept(ICacheInvocation invocation)
        { 
        }
}

如何使用緩存攔截器

通過(guò)設(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)識(shí)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)建攔截模塊

通過(guò)以下代碼,把攔截器注入到服務(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));
       }
   }

如何跨語(yǔ)言調(diào)用中開(kāi)啟緩存攔截降級(jí)

在surging 是調(diào)用分為二種

1.基于接口創(chuàng)建代理調(diào)用,可以作為同一語(yǔ)言的互相調(diào)用,性能上比第二種基于routepath要快,但是具有高耦合性

var userProxy = ServiceLocator.GetService<IServiceProxyFactory>().CreateProxy<IUserService>("User");

2.基于routepath調(diào)用,可以作為跨語(yǔ)言調(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ù)和無(wú)參數(shù)的緩存攔截調(diào)用,而基于接口創(chuàng)建代理調(diào)用是可以支持業(yè)務(wù)模型緩存調(diào)用的,在以下特征情況下就需要在Metadatas.ServiceCacheIntercept特性下開(kāi)啟EnableStageCache,代碼如下

[Metadatas.ServiceCacheIntercept(Metadatas.CachingMethod.Get, Key = "GetDictionary", L2Key = "GetDictionary", EnableL2Cache = true, CacheSectionType = "ddlCache", Mode = Metadatas.CacheTargetType.Redis, Time = 480, EnableStageCache = true)]

通過(guò)以上的代碼,運(yùn)行后,在注冊(cè)中心注冊(cè)的服務(wù)路由下可以看到攔截器元數(shù)據(jù),這樣在其它語(yǔ)言通過(guò)元數(shù)據(jù)可以構(gòu)造服務(wù)消費(fèi)者的緩存攔截降級(jí)。

以下是基于二種調(diào)用的緩存結(jié)果存儲(chǔ)redis中

如何處理緩存K/V 中Value 過(guò)大

緩存中間件Redis是一種高性能的內(nèi)存數(shù)據(jù)庫(kù),用于存儲(chǔ)鍵值對(duì)的數(shù)據(jù)結(jié)構(gòu)。當(dāng)value的大小超過(guò)一定限制時(shí),一般超過(guò)10K就會(huì)影響查詢的性能。這時(shí)候使用一二級(jí)緩存來(lái)解決,一級(jí)緩存用redis 存儲(chǔ)標(biāo)記,標(biāo)記緩存是否失效,二級(jí)緩存用本地緩存存儲(chǔ),當(dāng)標(biāo)記失效不存在后,會(huì)遠(yuǎn)程調(diào)用服務(wù),返回結(jié)果添加一級(jí)緩存標(biāo)記,返回結(jié)果添加到二級(jí)緩存。

提示:大家可以按照自己的業(yè)務(wù)需求,研發(fā)緩存攔截,不一定非要使用CacheProviderInterceptor,按照CacheProviderInterceptor一二級(jí)緩存進(jìn)行構(gòu)建研發(fā)

總結(jié)

社區(qū)版:https://github.com/fanliang11/surging,如果需要其它版本,請(qǐng)聯(lián)系作者。

到此這篇關(guān)于如何基于surging跨網(wǎng)關(guān)跨語(yǔ)言進(jìn)行緩存降級(jí)的文章就介紹到這了,更多相關(guān)如何基于surging跨網(wǎng)關(guān)跨語(yǔ)言進(jìn)行緩存降級(jí)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • spring?jpa?審計(jì)功能自定義填充字段方式

    spring?jpa?審計(jì)功能自定義填充字段方式

    這篇文章主要介紹了spring?jpa審計(jì)功能自定義填充字段方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • 線程池運(yùn)用不當(dāng)引發(fā)的一次線上事故解決記錄分析

    線程池運(yùn)用不當(dāng)引發(fā)的一次線上事故解決記錄分析

    遇到了一個(gè)比較典型的線上問(wèn)題,剛好和線程池有關(guān),另外涉及到死鎖、jstack命令的使用、JDK不同線程池的適合場(chǎng)景等知識(shí)點(diǎn),同時(shí)整個(gè)調(diào)查思路可以借鑒,特此記錄和分享一下
    2024-01-01
  • Java實(shí)現(xiàn)將文件或者文件夾壓縮成zip的詳細(xì)代碼

    Java實(shí)現(xiàn)將文件或者文件夾壓縮成zip的詳細(xì)代碼

    這篇文章主要介紹了Java實(shí)現(xiàn)將文件或者文件夾壓縮成zip的詳細(xì)代碼,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-11-11
  • Mybatis?List列表In查詢實(shí)現(xiàn)的注意事項(xiàng)說(shuō)明

    Mybatis?List列表In查詢實(shí)現(xiàn)的注意事項(xiàng)說(shuō)明

    這篇文章主要介紹了Mybatis?List列表In查詢實(shí)現(xiàn)的注意事項(xiàng)說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • springmvc Rest風(fēng)格介紹及實(shí)現(xiàn)代碼示例

    springmvc Rest風(fēng)格介紹及實(shí)現(xiàn)代碼示例

    這篇文章主要介紹了springmvc Rest風(fēng)格介紹及實(shí)現(xiàn)代碼示例,rest風(fēng)格簡(jiǎn)潔,分享了HiddenHttpMethodFilter 的源碼,通過(guò)Spring4.0實(shí)現(xiàn)rest風(fēng)格源碼及簡(jiǎn)單錯(cuò)誤分析,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • ExecutorService Callable Future多線程返回結(jié)果原理解析

    ExecutorService Callable Future多線程返回結(jié)果原理解析

    這篇文章主要為大家介紹了ExecutorService Callable Future多線程返回結(jié)果,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • Mybatis使用collection映射一對(duì)多查詢分頁(yè)問(wèn)題詳解

    Mybatis使用collection映射一對(duì)多查詢分頁(yè)問(wèn)題詳解

    本文通過(guò)修改SQL查詢語(yǔ)句,解決了在分頁(yè)條件下關(guān)聯(lián)查詢多表時(shí),多的一端數(shù)據(jù)不正確的問(wèn)題,從而實(shí)現(xiàn)了正常的展示
    2025-12-12
  • SpringBoot 如何通過(guò)集成 Flink CDC 來(lái)實(shí)時(shí)追蹤 MySql 數(shù)據(jù)變動(dòng)

    SpringBoot 如何通過(guò)集成 Flink CDC 來(lái)實(shí)時(shí)追蹤 M

    本文介紹如何在SpringBoot項(xiàng)目中集成FlinkCDC,實(shí)現(xiàn)對(duì)MySQL數(shù)據(jù)庫(kù)實(shí)時(shí)變動(dòng)的捕獲與處理,包含環(huán)境準(zhǔn)備、依賴引入、作業(yè)配置及測(cè)試驗(yàn)證等步驟,幫助開(kāi)發(fā)者構(gòu)建高效的數(shù)據(jù)同步與分析應(yīng)用,感興趣的朋友一起看看吧
    2025-06-06
  • Java面試必問(wèn)之ThreadLocal終極篇分享

    Java面試必問(wèn)之ThreadLocal終極篇分享

    ThreadLocal是什么呢?其實(shí)ThreadLocal并非是一個(gè)線程的本地實(shí)現(xiàn)版本,它并不是一個(gè)Thread,而是thread local variable(線程局部變量),這篇文章主要給大家介紹了關(guān)于Java面試必問(wèn)之ThreadLocal終極篇的相關(guān)資料,需要的朋友可以參考下
    2021-10-10
  • Spring中的NamespaceHandler加載過(guò)程源碼詳解

    Spring中的NamespaceHandler加載過(guò)程源碼詳解

    這篇文章主要介紹了Spring中的NamespaceHandler加載過(guò)程源碼詳解,Spring提供的NamespaceHandler的處理機(jī)制,簡(jiǎn)單來(lái)說(shuō)就是命名空間處理器,Spring為了開(kāi)放性提供了NamespaceHandler機(jī)制,這樣我們就可以根據(jù)需求自己來(lái)處理我們?cè)O(shè)置的標(biāo)簽元素,需要的朋友可以參考下
    2024-02-02

最新評(píng)論

永川市| 怀集县| 缙云县| 尉犁县| 英德市| 曲周县| 张家界市| 阿图什市| 开封市| 汝阳县| 香格里拉县| 北川| 桃江县| 昆明市| 车致| 柯坪县| 互助| 荔波县| 怀安县| 大埔区| 临夏县| 安福县| 元氏县| 临颍县| 二连浩特市| 界首市| 扶绥县| 汪清县| 昭觉县| 远安县| 闽清县| 法库县| 衡阳县| 民和| 喀什市| 厦门市| 霍山县| 安国市| 乌兰县| 吉隆县| 安宁市|