精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Dubbo 配置 Loadbalance 不生效?擼一把源碼

開(kāi)發(fā) 前端
很久之前我給業(yè)務(wù)方寫(xiě)了一個(gè) dubbo loadbalance 的擴(kuò)展(為了敘述方便,這個(gè) loadbalance 擴(kuò)展就叫它 XLB 吧),這兩天業(yè)務(wù)方反饋說(shuō) XLB 不生效了。

[[432923]]

文末本文轉(zhuǎn)載自微信公眾號(hào)「捉蟲(chóng)大師」,作者捉蟲(chóng)大師 。轉(zhuǎn)載本文請(qǐng)聯(lián)系捉蟲(chóng)大師公眾號(hào)。

背景

很久之前我給業(yè)務(wù)方寫(xiě)了一個(gè) dubbo loadbalance 的擴(kuò)展(為了敘述方便,這個(gè) loadbalance 擴(kuò)展就叫它 XLB 吧),這兩天業(yè)務(wù)方反饋說(shuō) XLB 不生效了

我心想,不可能啊,都用了大半年了~

排查

于是我登上不生效的 consumer 機(jī)器進(jìn)行排查,還好我留了一手,當(dāng) XLB 加載時(shí),會(huì)打印一行日志

看了下這個(gè)服務(wù),并沒(méi)有打印日志,說(shuō)明 XLB 并沒(méi)有加載成功

于是,我就去問(wèn)對(duì)應(yīng)的開(kāi)發(fā),有按照我的文檔配置 loadbalance 嗎?答復(fù):完全按照文檔配置

這下我就有點(diǎn)不相信了,但轉(zhuǎn)念一想,配置 loadbalance 如此簡(jiǎn)單,不應(yīng)該出錯(cuò)啊,我的文檔和他的應(yīng)用都在 xml 文件中配置了 consumer 的 loadbalance

  1. <dubbo:consumer loadbalance="xlb"/> 

抱著試一試的態(tài)度,拉取了他們項(xiàng)目的代碼,發(fā)現(xiàn)配置確實(shí)如上,但我發(fā)現(xiàn)他們的 application.properties 配置文件也配了一個(gè) consumer 的屬性

  1. dubbo.consumer.check=false 

以多年和 dubbo 打交道的經(jīng)驗(yàn)來(lái)說(shuō),這里有問(wèn)題,又確認(rèn)了代碼,確實(shí) xml 和 application.properties 都加載了

那這里可能就有問(wèn)題了,dubbo 從 xml 加載生成了一個(gè) consumer 配置,dubbo-springboot-starter 又從 application.properties 加載配置生成了一個(gè) consumer 配置,這不就沖突了?

別看只配置了 dubbo.consumer.check,它實(shí)際上會(huì)生成一個(gè)完整的 consumer 配置,只不過(guò) loadbalance 為默認(rèn)值

業(yè)務(wù)方為什么會(huì)這樣配置?大概率是因?yàn)槲业奈臋n里只給出了 xml 形式的配置,沒(méi)有給 spring-boot 配置,他們?cè)仁褂玫氖?spring-boot 的配置方式,然后看到我的文檔是 xml,結(jié)果就不會(huì)配置了,也寫(xiě)了個(gè) xml,和原先的配置沖突

驗(yàn)證

為了驗(yàn)證是這個(gè)問(wèn)題導(dǎo)致,我把他的 application.properties 的 dubbo.consumer.check 配置挪到了 xml 文件中,果然重啟后就加載到了 XLB

隨后我又在本地的測(cè)試應(yīng)用上做了這樣一個(gè)驗(yàn)證:

  1. <!-- case 1 --> 
  2. <dubbo:consumer /> 
  3. <dubbo:consumer loadbalance="xlb"/> 
  4.  
  5. <!-- case 2 --> 
  6. <dubbo:consumer loadbalance="xlb"/> 
  7. <dubbo:consumer /> 

兩組配置相同,但順序不同,測(cè)試結(jié)果為 case 1 可以加載到 XLB,case 2 不行

于是猜測(cè),dubbo consumer 配置以后加載的為準(zhǔn)

擼源碼

顯然猜測(cè)不符合我的風(fēng)格,下面開(kāi)擼源碼,不感興趣可以劃過(guò),最下面有總結(jié)

首先搞清楚,何時(shí)會(huì)加載 loadbalance,在 AbstractClusterInvoker 的 invoke 方法中,加載了 loadbalance

  1. @Override 
  2. public Result invoke(final Invocation invocation) throws RpcException { 
  3.     ... 
  4.     List<Invoker<T>> invokers = list(invocation); 
  5.     LoadBalance loadbalance = initLoadBalance(invokers, invocation); 
  6.     RpcUtils.attachInvocationIdIfAsync(getUrl(), invocation); 
  7.     return doInvoke(invocation, invokers, loadbalance); 

加載代碼如下

  1. protected LoadBalance initLoadBalance(List<Invoker<T>> invokers, Invocation invocation) { 
  2.     if (CollectionUtils.isNotEmpty(invokers)) { 
  3.         return ExtensionLoader.getExtensionLoader(LoadBalance.class).getExtension(invokers.get(0).getUrl() 
  4.                 .getMethodParameter(RpcUtils.getMethodName(invocation), LOADBALANCE_KEY, DEFAULT_LOADBALANCE)); 
  5.     } else { 
  6.         return ExtensionLoader.getExtensionLoader(LoadBalance.class).getExtension(DEFAULT_LOADBALANCE); 
  7.     } 

帶緩存的加載擴(kuò)展

  1. public T getExtension(String name) { 
  2.     if (StringUtils.isEmpty(name)) { 
  3.         throw new IllegalArgumentException("Extension name == null"); 
  4.     } 
  5.     if ("true".equals(name)) { 
  6.         return getDefaultExtension(); 
  7.     } 
  8.     final Holder<Object> holder = getOrCreateHolder(name); 
  9.     Object instance = holder.get(); 
  10.     if (instance == null) { 
  11.         synchronized (holder) { 
  12.             instance = holder.get(); 
  13.             if (instance == null) { 
  14.                 instance = createExtension(name); 
  15.                 holder.set(instance); 
  16.             } 
  17.         } 
  18.     } 
  19.     return (T) instance; 

可以看出

  • loadbalance 是發(fā)起 dubbo 調(diào)用時(shí),且當(dāng) invokers 非空時(shí)(即 providers 非空)會(huì)被初始化,后續(xù)都從緩存中取
  • loadbalance 是根據(jù)第一個(gè) invoker 的 loadbalance 參數(shù)決定使用哪個(gè) loadbalance 的

于是問(wèn)題轉(zhuǎn)移到 invoker 的 loadbalance 從哪來(lái)?provider 不會(huì)配置 loadbalance,所以這個(gè)參數(shù)一定是從 consumer 的配置上得到的

順藤摸瓜,在 RegistryDirectory 的 toInvokers 方法中調(diào)用了 mergeUrl,它是在注冊(cè)中心通知時(shí)被調(diào)用,也就是從注冊(cè)中心上拿到 provider url 時(shí),還得 merge 一下才能用,merge 了些什么內(nèi)容?

  1. private URL mergeUrl(URL providerUrl) { 
  2.     // 1. merge consumer 參數(shù) 
  3.     providerUrl = ClusterUtils.mergeUrl(providerUrl, queryMap);  
  4.     // 2. merge configurator 參數(shù) 
  5.     providerUrl = overrideWithConfigurator(providerUrl); 
  6.     ... 
  7.     return providerUrl; 

1中 merge 了queryMap 里的參數(shù),這個(gè)queryMap 其實(shí)就是 consumer 的參數(shù),它來(lái)自配置的 reference

再看 reference 配置,當(dāng) ReferenceConfig 初始化時(shí)

  1. public synchronized void init() { 
  2.     ... 
  3.     checkAndUpdateSubConfigs(); 
  4.     ... 
  5.     AbstractConfig.appendParameters(map, consumer); 
  6.     ... 
  7.  
  8. // 2 
  9. public void checkAndUpdateSubConfigs() { 
  10.     ... 
  11.     checkDefault(); 
  12.     ... 
  13.  
  14. // 3 
  15. public void checkDefault() throws IllegalStateException { 
  16.     if (consumer == null) { 
  17.         consumer = ApplicationModel.getConfigManager() 
  18.                 .getDefaultConsumer() 
  19.                 .orElse(new ConsumerConfig()); 
  20.     } 
  21.  
  22. // 4 
  23. public Optional<ConsumerConfig> getDefaultConsumer() { 
  24.     List<ConsumerConfig> consumerConfigs = getDefaultConfigs(getConfigsMap(getTagName(ConsumerConfig.class))); 
  25.     if (CollectionUtils.isNotEmpty(consumerConfigs)) { 
  26.         return Optional.of(consumerConfigs.get(0)); 
  27.     } 
  28.     return Optional.empty(); 

上面調(diào)用鏈從 1 到 4,4 中獲取了第1個(gè) consumer,這就是我們要找的根源

總結(jié)

每配置一個(gè) consumer ,無(wú)論是從 xml 文件,或是 spring-boot 配置,或是 api 直接創(chuàng)建,都會(huì)生成一個(gè) consumerConfig 對(duì)象

當(dāng)消費(fèi)接口,即配置 reference 時(shí),會(huì)將 consumer 的參數(shù) merge 過(guò)來(lái),如果存在多個(gè) consumer,會(huì)挑第一個(gè),當(dāng)然我們并不知道誰(shuí)先加載

當(dāng) reference 存在 consumer 的配置時(shí),注冊(cè)中心通知的 provider urls 會(huì)和 reference 的參數(shù)進(jìn)行合并,合并后生成可調(diào)用的 invoker

 

 

 

對(duì)于 loadbalance 來(lái)說(shuō),調(diào)用時(shí),如果 invokers 非空,則會(huì)嘗試通過(guò)第一個(gè) invoker 的 loadbalance 參數(shù)加載負(fù)載均衡算法,第一次調(diào)用進(jìn)行加載,后續(xù)調(diào)用則使用緩存

 

責(zé)任編輯:武曉燕 來(lái)源: 捉蟲(chóng)大師
相關(guān)推薦

2020-03-02 17:04:47

戴爾

2023-06-21 08:24:46

2024-01-04 14:16:05

騰訊紅黑樹(shù)Socket

2011-11-08 08:14:40

WLANWi-Fi

2011-05-04 17:11:12

打印機(jī)

2022-10-25 15:25:22

網(wǎng)關(guān)并行Flowable

2019-06-12 15:20:25

Redis高性能線程

2017-06-14 17:39:40

微服務(wù)架構(gòu)服務(wù)器

2010-10-28 08:43:07

App StoreSymbian

2024-02-22 17:08:03

騰訊架構(gòu)RocketMQ

2009-02-23 19:07:14

SaaS800APP八百客

2024-04-18 08:00:23

openInula?React響應(yīng)式 API

2018-03-23 08:26:44

Hadoop集群SQL

2021-08-18 23:10:56

setState代碼性能

2022-07-20 08:55:02

區(qū)塊鏈技術(shù)數(shù)據(jù)記錄

2011-04-08 15:28:48

2021-06-03 08:01:12

JVM性能優(yōu)化

2019-10-30 05:51:07

物聯(lián)網(wǎng)設(shè)備物聯(lián)網(wǎng)安全物聯(lián)網(wǎng)

2014-11-26 15:05:16

魅族MX4Pro

2011-04-08 15:15:34

策略路由
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

欧美日韩视频一区二区三区| 成人视屏在线观看| 99国产精品久久久久久久久久久| 91精品国产一区| 精品人妻无码一区二区三区 | 一级做a爱片久久毛片| 久久精品亚洲人成影院 | 在线观看视频你懂得| 国产精品25p| 国产欧美一区二区精品性色| 亚洲一区二区三区成人在线视频精品| 欧美精品亚洲精品日韩精品| 青青草综合网| 亚洲国产天堂久久综合网| 国产高潮免费视频| 动漫一区二区| 国产精品剧情在线亚洲| 国产一区二区三区四区hd| 中文字幕欧美色图| 一区二区三区福利| 久久久国产精彩视频美女艺术照福利| yy111111少妇影院日韩夜片| 国产三级av片| 午夜久久一区| 日韩在线视频观看| 最新中文字幕视频| 一本色道69色精品综合久久| 欧美亚一区二区| 日韩欧美一区二| 在线免费观看的av| 国产精品色呦呦| 蜜桃av噜噜一区二区三| 亚洲第一黄色片| 开心九九激情九九欧美日韩精美视频电影 | 欧美日韩激情在线一区二区三区| 精品成人一区二区三区| 91丝袜超薄交口足| 精品视频在线一区二区在线| 天天操天天综合网| 久艹在线免费观看| 中文字幕在线三区| 日韩理论在线观看| 亚洲欧美精品| 波多野结衣在线影院| 91免费看片在线观看| 成人动漫视频在线观看免费| 国产精品一级视频| 精品夜夜嗨av一区二区三区| 国产精品久久久av久久久| 日本黄色一级视频| 视频一区二区中文字幕| 日本免费久久高清视频| 西西44rtwww国产精品| 亚洲伦理一区| 2019中文在线观看| 特黄视频免费看| 久久电影一区| 国产v综合v亚洲欧美久久| 五月婷婷亚洲综合| 久久精品日韩欧美| 日本久久久久亚洲中字幕| jizz国产在线观看| 日韩va亚洲va欧美va久久| 国产精品高潮视频| 中文字幕二区三区| 韩国v欧美v日本v亚洲v| 川上优av一区二区线观看| 国产精品久久影视| 国产精品一二三在| 国产一区二区三区四区五区加勒比| 欧美77777| 一区二区三区精品视频在线观看| 久久久久久久久久国产| 国产精品美女毛片真酒店| 日韩亚洲在线| 国产成人亚洲综合91| 日韩精品在线一区二区三区| 婷婷综合亚洲| 久久国产精品影片| 亚洲国产精一区二区三区性色| 一本久道综合久久精品| 国产精品678| 国产农村妇女毛片精品| 成人午夜激情在线| 欧美日韩天天操| 尤物视频在线免费观看| 一区二区高清视频在线观看| 91精品国产91久久久久麻豆 主演| 欧美a级在线观看| 欧美亚洲综合色| 波多野结衣三级视频| 色婷婷av一区二区三区丝袜美腿| 一区二区三区www| 欧美成欧美va| 美女网站久久| 亚洲va久久久噜噜噜| 天堂av中文字幕| 国产精品视频九色porn| 欧美黄网在线观看| 播放一区二区| 精品久久久久久久久久久院品网| wwwwww日本| 国精品一区二区三区| 国产精品久久国产精品99gif| jizz中国少妇| 久久久精品黄色| 日本成人在线不卡| 视频精品导航| 日韩国产一区三区| 激情五月少妇a| 蜜桃精品视频在线| 久久亚洲高清| 久久久123| 欧美日韩成人综合| 免费观看av网站| 国内精品久久久久久久影视蜜臀| 国产精品久久久久国产a级| 蜜臀av午夜精品| 成人免费在线播放视频| 日本成人在线免费视频| 国产欧美一区二区三区米奇| 久久精品视频网站| 国产免费a视频| 91欧美一区二区| 精品人妻大屁股白浆无码| 啪啪av大全导航福利综合导航| 亚洲激情 国产| 免费中文字幕视频| 国产一区在线精品| 亚洲精品在线免费| 在线观看成人动漫| 欧美激情啪啪| 亚洲三级av在线| 黑人一级大毛片| 不卡免费追剧大全电视剧网站| 久久免费看毛片| 国产69精品久久久久9999人| 亚洲欧洲国产精品| 亚洲欧美自拍视频| 99久久久免费精品国产一区二区 | 国产精品麻豆久久| 国产精品老牛影院在线观看| 免费人成在线观看网站| 精品欧美一区二区三区| 91视频在线免费| 黑丝一区二区三区| 国产91亚洲精品一区二区三区| caopon在线免费视频| 制服丝袜亚洲精品中文字幕| 国产白丝一区二区三区| 蜜桃免费网站一区二区三区| 亚洲砖区区免费| 福利一区二区免费视频| 亚洲最大在线视频| 欧美另类高清videos的特点| 欧美国产在线观看| 亚洲这里只有精品| 国产精品成久久久久| 成人中文字幕+乱码+中文字幕| 欧美高清视频| 91精品国产免费| 麻豆亚洲av熟女国产一区二| 成人高清视频在线| 黄色www网站| 国产99久久久国产精品成人免费 | 国产精品一区无码| 国产色91在线| 中文av一区二区三区| 久久中文字幕二区| 18成人免费观看网站下载| 欧洲一区二区三区| 日韩成人久久久| 色婷婷久久综合中文久久蜜桃av| 国产精品久久久久天堂| 亚洲第一色av| 亚洲一区色图| 国产在线一区二区三区播放| 成人性生交大片免费观看网站| 国产亚洲精品久久久久久| 一级黄色片免费| 亚洲一区二区三区视频在线| 狠狠人妻久久久久久综合蜜桃| 麻豆精品91| 中文字幕黄色大片| 农村少妇一区二区三区四区五区| 国产成人精品电影久久久| 免费在线看a| 欧美精品一区男女天堂| 久久国产乱子伦精品| 亚洲欧美日韩电影| 精品无码在线视频| 国产一二精品视频| 国产熟女高潮视频| 欧美午夜在线| 色一情一乱一伦一区二区三欧美| 深夜福利一区| 国产99久久久欧美黑人| 色黄网站在线观看| 国产亚洲欧美一区| 懂色av成人一区二区三区| 91黄色免费版| 久久无码精品丰满人妻| 亚洲国产电影在线观看| 人妖粗暴刺激videos呻吟| 奇米色一区二区三区四区| 欧美大黑帍在线播放| 精品色999| 国偷自产av一区二区三区小尤奈| 成人av色网站| 欧美一区二区三区图| 在线视频观看国产| 在线观看日韩欧美| 免费av一级片| 5858s免费视频成人| 无码人妻av免费一区二区三区 | 亚洲色图综合网| 亚洲va欧美va| 欧美军同video69gay| 精品国产午夜福利| 亚洲第一福利一区| 一区二区成人免费视频| 中文字幕精品在线不卡| 成人精品在线观看视频| 成人一区在线看| 91视频福利网| 国产在线麻豆精品观看| 日本熟妇人妻中出| 亚洲欧美清纯在线制服| 精品国偷自产一区二区三区| 91精品国产自产在线观看永久∴ | 国产女人18毛片水18精品| 91久久国产综合久久91猫猫| 久久久久久久久网站| 中文字幕中文字幕在线十八区| 北条麻妃久久精品| 9色在线观看| 国产一区二区三区网站| 黄色毛片在线观看| 亚洲免费av网址| 亚洲色图狠狠干| 日韩大片免费观看视频播放| 性感美女福利视频| 日韩精品久久久久久久玫瑰园| 亚洲女人18毛片水真多| 精品日韩欧美在线| 亚洲美女福利视频| 精品国产一区a| 蜜臀久久精品久久久久| 亚洲精品福利免费在线观看| 人妻一区二区三区四区| 亚洲国产精品999| 特级丰满少妇一级aaaa爱毛片| 亚洲第一免费网站| 天堂av在线播放| 亚洲深夜福利网站| 成人高清免费观看mv| 在线观看日韩视频| 麻豆tv免费在线观看| 久久躁狠狠躁夜夜爽| 成人国产免费电影| 免费91在线视频| 国产精品69xx| 97成人在线视频| 老司机成人影院| 国产精品人成电影在线观看| 亚洲精品乱码日韩| 日韩黄色高清视频| 三级在线观看| 一区二区三区视频观看| 人人干在线视频| 久久99久国产精品黄毛片入口| 日本孕妇大胆孕交无码| 91精品国产精品| 欧洲精品一区二区三区| 成人福利视频在线观看| xxxx日韩| 日本一区二区三区视频在线观看| 欧美自拍偷拍| 天堂а√在线中文在线| 一区二区三区成人精品| 日本人69视频| 成人免费看黄yyy456| 中文字幕av网址| 亚洲天堂福利av| 欧美一级视频免费观看| 欧美少妇一区二区| 亚洲老妇色熟女老太| 亚洲欧美在线一区| 在线你懂的视频| 国产99久久精品一区二区 夜夜躁日日躁| 亚洲福利影视| 国产乱码精品一区二区三区卡| 69堂免费精品视频在线播放| 成人性生交大片免费看视频直播| 成人看片爽爽爽| 色播五月综合| 狠狠爱成人网| 婷婷六月天在线| 成人黄色大片在线观看| 东京热无码av男人的天堂| 亚洲影院在线观看| 天堂网视频在线| 日韩美女主播在线视频一区二区三区| 三级在线视频| 欧美精品久久久久a| 久久女人天堂| 欧美二区在线看| 黄色成人在线网址| 免费黄频在线观看| 日本一区二区三区视频视频| 日本免费在线播放| 6080亚洲精品一区二区| 国产在线视频你懂得| 欧美精品videossex性护士| 精品69视频一区二区三区| 精品产品国产在线不卡| 欧美va亚洲va日韩∨a综合色| 91网址在线播放| 91一区二区三区在线播放| 欧美成人精品一区二区免费看片| 日韩欧美aaa| 日韩一区二区三区在线观看视频| 久久精品久久久久电影| 日韩中文在线播放| 日本不卡在线播放| 亚洲综合国产| 亚洲精品国产成人av在线| 亚洲蜜臀av乱码久久精品蜜桃| 中文字幕乱码视频| 亚洲视频欧美视频| www.成人影院| 国内视频一区二区| 夜夜嗨av一区二区三区网站四季av| 性一交一黄一片| 亚洲欧美日韩国产一区二区三区| 亚洲永久精品视频| 最近2019年手机中文字幕| 欧洲精品一区二区三区| 日韩一二三区不卡在线视频| 日韩精品电影在线| www..com.cn蕾丝视频在线观看免费版 | 欧美二区三区在线| 亚洲欧美日本日韩| 魔女鞋交玉足榨精调教| 色婷婷综合久久久久中文一区二区| 天天干免费视频| 97视频免费看| 伊人久久大香线蕉| 韩国日本在线视频| 国产日韩欧美高清在线| 欧美视频xxxx| 中文字幕欧美专区| 99综合久久| 久久久天堂国产精品| 懂色av噜噜一区二区三区av| 69精品久久久| 日韩精品免费在线播放| 日韩成人动漫| 亚洲一卡二卡| 国产一区二区0| 日韩成年人视频| 精品视频在线播放| 欧美日韩在线精品一区二区三区激情综合 | 丝袜美腿一区二区三区动态图| 欧美成人一区二区在线观看| 91麻豆123| 一级一级黄色片| 久久亚洲欧美日韩精品专区| 日韩激情欧美| 国模无码视频一区二区三区| 久久久不卡网国产精品二区| 一区二区视频免费| 欧美精品在线视频观看| 美女视频亚洲色图| 无遮挡又爽又刺激的视频| 国产精品丝袜91| 亚洲高清视频网站| 欧美影院久久久| 日本一二区不卡| 国产在线a视频| 日韩欧美精品免费在线| 欧美性videos| 国产一区自拍视频| 免费一级片91| 日韩成人一区二区三区| 夜夜嗨av一区二区三区四区 | 麻豆成人在线| 黄色一级片中国| 亚洲美女av网站| 国产精品一区二区精品| 日韩精品视频久久| 成人欧美一区二区三区| 亚洲欧美综合一区二区| 国产精品永久免费| 亚洲福利国产| 波多野结衣家庭教师在线观看 | 在线成人超碰| 国产精品jizz| 日韩欧美在线123| 国精产品一区一区三区四川|