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

Nacos Client服務訂閱機制之核心流程

開發 架構
說起Nacos的服務訂閱機制,對此不了解的朋友,可能感覺非常神秘,這篇文章就大家深入淺出的了解一下Nacos 2.0客戶端的訂閱實現。

[[417043]]

本文轉載自微信公眾號「程序新視界」,作者二師兄。轉載本文請聯系程序新視界公眾號。

說起Nacos的服務訂閱機制,對此不了解的朋友,可能感覺非常神秘,這篇文章就大家深入淺出的了解一下Nacos 2.0客戶端的訂閱實現。由于涉及到的內容比較多,就分幾篇來講,本篇為第一篇。

Nacos訂閱概述

Nacos的訂閱機制,如果用一句話來描述就是:Nacos客戶端通過一個定時任務,每6秒從注冊中心獲取實例列表,當發現實例發生變化時,發布變更事件,訂閱者進行業務處理。該更新實例的更新實例,該更新本地緩存的更新本地緩存。

nacos

上圖畫出了訂閱方法的主線流程,涉及的內容較多,處理細節復雜。這里只用把握住核心部分即可。下面就通過代碼和流程圖來逐步分析上述過程。

從訂閱到定時任務開啟

我們這里聊的訂閱機制,其實本質上就是服務發現的準實時感知。上面已經看到了當執行訂閱方法時,會觸發定時任務,定時去拉服務器端的數據。所以,本質上,訂閱機制就是實現服務發現的一種方式,對照的方式就是直接查詢接口了。

NacosNamingService中暴露的許多重載的subscribe,重載的目的就是讓大家少寫一些參數,這些參數呢,Nacos給默認處理了。最終這些重載方法都會調用到下面這個方法:

  1. // NacosNamingService 
  2. public void subscribe(String serviceName, String groupName, List<String> clusters, EventListener listener) 
  3.         throws NacosException { 
  4.     if (null == listener) { 
  5.         return
  6.     } 
  7.     String clusterString = StringUtils.join(clusters, ","); 
  8.     changeNotifier.registerListener(groupName, serviceName, clusterString, listener); 
  9.     clientProxy.subscribe(serviceName, groupName, clusterString); 

方法中的事件監聽我們暫時不聊,直接看subscribe方法,這里clientProxy類型為NamingClientProxyDelegate。實例化NacosNamingService時該類被實例化,前面章節中已經講到,不再贅述。

而clientProxy.subscribe方法在NamingClientProxyDelegate中實現:

  1. // NamingClientProxyDelegate 
  2. @Override 
  3. public ServiceInfo subscribe(String serviceName, String groupName, String clusters) throws NacosException { 
  4.     String serviceNameWithGroup = NamingUtils.getGroupedName(serviceName, groupName); 
  5.     String serviceKey = ServiceInfo.getKey(serviceNameWithGroup, clusters); 
  6.     // 獲取緩存中的ServiceInfo 
  7.     ServiceInfo result = serviceInfoHolder.getServiceInfoMap().get(serviceKey); 
  8.     if (null == result) { 
  9.         // 如果為null,則進行訂閱邏輯處理,基于gRPC協議 
  10.         result = grpcClientProxy.subscribe(serviceName, groupName, clusters); 
  11.     } 
  12.     // 定時調度UpdateTask 
  13.     serviceInfoUpdateService.scheduleUpdateIfAbsent(serviceName, groupName, clusters); 
  14.     // ServiceInfo本地緩存處理 
  15.     serviceInfoHolder.processServiceInfo(result); 
  16.     return result; 

這段方法是不是眼熟啊?對的,在前面分析《Nacos Client服務發現》時我們已經講過了。看來殊途同歸,查詢服務列表和訂閱最終都調用了同一個方法。

上篇講了其他流程,我們這里重點看任務調度:

  1. // ServiceInfoUpdateService 
  2. public void scheduleUpdateIfAbsent(String serviceName, String groupName, String clusters) { 
  3.     String serviceKey = ServiceInfo.getKey(NamingUtils.getGroupedName(serviceName, groupName), clusters); 
  4.     if (futureMap.get(serviceKey) != null) { 
  5.         return
  6.     } 
  7.     synchronized (futureMap) { 
  8.         if (futureMap.get(serviceKey) != null) { 
  9.             return
  10.         } 
  11.         // 構建UpdateTask 
  12.         ScheduledFuture<?> future = addTask(new UpdateTask(serviceName, groupName, clusters)); 
  13.         futureMap.put(serviceKey, future); 
  14.     } 

該方法包含了構建serviceKey、通過serviceKey判重,最后添加UpdateTask。

而其中的addTask的實現就是發起了一個定時任務:

  1. // ServiceInfoUpdateService 
  2. private synchronized ScheduledFuture<?> addTask(UpdateTask task) { 
  3.     return executor.schedule(task, DEFAULT_DELAY, TimeUnit.MILLISECONDS); 

定時任務延時1秒執行。

跟蹤到這里就告一階段了。核心功能只有兩個:調用訂閱方法和發起定時任務。

定時任務都干了啥

UpdateTask封裝了訂閱機制的核心業務邏輯,先來通過一張流程圖看一下都做了啥。

nacos

有了上述流程圖,基本就很清晰的了解UpdateTask所做的事情了。直接貼出run方法的所有代碼:

  1. public void run() { 
  2.     long delayTime = DEFAULT_DELAY; 
  3.  
  4.     try { 
  5.         // 判斷該注冊的Service是否被訂閱,如果沒有訂閱則不再執行 
  6.         if (!changeNotifier.isSubscribed(groupName, serviceName, clusters) && !futureMap.containsKey(serviceKey)) { 
  7.             NAMING_LOGGER 
  8.                     .info("update task is stopped, service:" + groupedServiceName + ", clusters:" + clusters); 
  9.             return
  10.         } 
  11.  
  12.         // 獲取緩存的service信息 
  13.         ServiceInfo serviceObj = serviceInfoHolder.getServiceInfoMap().get(serviceKey); 
  14.         if (serviceObj == null) { 
  15.             // 根據serviceName從注冊中心服務端獲取Service信息 
  16.             serviceObj = namingClientProxy.queryInstancesOfService(serviceName, groupName, clusters, 0, false); 
  17.             serviceInfoHolder.processServiceInfo(serviceObj); 
  18.             lastRefTime = serviceObj.getLastRefTime(); 
  19.             return
  20.         } 
  21.  
  22.         // 過期服務(服務的最新更新時間小于等于緩存刷新時間),從注冊中心重新查詢 
  23.         if (serviceObj.getLastRefTime() <= lastRefTime) { 
  24.             serviceObj = namingClientProxy.queryInstancesOfService(serviceName, groupName, clusters, 0, false); 
  25.             // 處理Service消息 
  26.             serviceInfoHolder.processServiceInfo(serviceObj); 
  27.         } 
  28.         // 刷新更新時間 
  29.         lastRefTime = serviceObj.getLastRefTime(); 
  30.         if (CollectionUtils.isEmpty(serviceObj.getHosts())) { 
  31.             incFailCount(); 
  32.             return
  33.         } 
  34.         // 下次更新緩存時間設置,默認為6秒 
  35.         // TODO multiple time can be configured. 
  36.         delayTime = serviceObj.getCacheMillis() * DEFAULT_UPDATE_CACHE_TIME_MULTIPLE; 
  37.         // 重置失敗數量為0 
  38.         resetFailCount(); 
  39.     } catch (Throwable e) { 
  40.         incFailCount(); 
  41.         NAMING_LOGGER.warn("[NA] failed to update serviceName: " + groupedServiceName, e); 
  42.     } finally { 
  43.         // 下次調度刷新時間,下次執行的時間與failCount有關 
  44.         // failCount=0,則下次調度時間為6秒,最長為1分鐘 
  45.         // 即當無異常情況下緩存實例的刷新時間是6秒 
  46.         executor.schedule(this, Math.min(delayTime << failCount, DEFAULT_DELAY * 60), TimeUnit.MILLISECONDS); 
  47.     } 

首先在判斷服務是否是被訂閱過,實現方法是ChangeNotifier#isSubscribed:

  1. public boolean isSubscribed(String groupName, String serviceName, String clusters) { 
  2.     String key = ServiceInfo.getKey(NamingUtils.getGroupedName(serviceName, groupName), clusters); 
  3.     ConcurrentHashSet<EventListener> eventListeners = listenerMap.get(key); 
  4.     return CollectionUtils.isNotEmpty(eventListeners); 

查看該方法的源碼會發現,這里的listenerMap正是最開始的subscribe方法中registerListener注冊的EventListener。

run方法后面的業務處理基本上都雷同了,先判斷緩存是否有ServiceInfo信息,如果沒有則查詢注冊中心、處理ServiceInfo、更新上次處理時間。

而下面判斷ServiceInfo是否失效,正是通過“上次更新時間”與當前ServiceInfo中的“上次更新時間”做比較來判斷。如果失效,也會查詢注冊中心、處理ServiceInfo、更新上次處理時間等一系列操作。

業務邏輯最后會計算下一次定時任務的執行時間,通過delayTime來延遲執行。delayTime默認為 1000L * 6,也就是6秒。而在finally里面真的發起下一次定時任務。當出現異常時,下次執行的時間與失敗次數有關,但最長不超過1分鐘。

小結

這一篇我們講了Nacos客戶端服務訂閱機制的源碼,主要有以下步驟:

第一步:訂閱方法的調用,并進行EventListener的注冊,后面UpdateTask要用來進行判斷;

第二步:通過委托代理類來處理訂閱邏輯,此處與獲取實例列表方法使用了同一個方法;

第三步:通過定時任務執行UpdateTask方法,默認執行間隔為6秒,當發生異常時會延長,但不超過1分鐘;

第四步:UpdateTask方法中會比較本地是否存在緩存,緩存是否過期。當不存在或過期時,查詢注冊中心,獲取最新實例,更新最后獲取時間,處理ServiceInfo。

第五步:重新計算定時任務時間,循環執行上述流程。

 

責任編輯:武曉燕 來源: 程序新視界
相關推薦

2021-08-16 07:26:42

服務訂閱機制

2025-05-28 08:35:00

Nacos服務訂閱流程開發

2022-05-14 22:27:40

Nacos訂閱機制定時器

2022-05-19 07:39:43

Nacos訂閱機制線程類

2022-06-08 10:58:00

服務配置Nacos

2021-08-10 07:00:00

Nacos Clien服務分析

2022-05-02 22:01:49

訂閱模式Eureka推送模式

2025-06-03 08:25:00

Nacos開發服務

2018-08-19 11:00:05

2021-05-27 22:46:00

Nacos Clien版本Nacos

2023-03-01 08:15:10

NginxNacos

2020-06-28 13:51:03

哈希map結構

2016-09-22 16:40:48

微服務架構RPC-client序

2012-07-03 10:57:54

Hadoop核心機制

2021-12-20 00:03:38

Webpack運行機制

2021-09-16 06:44:04

Android進階流程

2021-09-01 09:40:44

Docker開發人員擴展

2021-07-12 08:00:21

Nacos 服務注冊源碼分析

2023-01-11 08:22:22

RabbitMQ通信模型

2023-08-14 08:17:13

Kafka服務端
點贊
收藏

51CTO技術棧公眾號

欧美日韩一区二区免费在线观看| 国产在线一区二区综合免费视频| 日韩成人在线视频观看| 女人另类性混交zo| 1769在线观看| 国产成人精品1024| 国产成人综合一区二区三区| 精品亚洲乱码一区二区| 久久综合另类图片小说| 欧美性视频一区二区三区| 黄色影视在线观看| 婷婷五月综合久久中文字幕| 蜜桃av噜噜一区| 午夜精品久久久久久久久久久久 | 青娱乐国产盛宴| 天堂资源在线亚洲| 3d成人动漫网站| 国产二区视频在线播放| 黄色网页网址在线免费| 91视视频在线观看入口直接观看www| 国产精品视频自拍| 日韩一区二区视频在线| 永久亚洲成a人片777777| 亚洲美女av在线播放| a级大片免费看| 亚洲不卡系列| 亚洲成a人片在线观看中文| 中文字幕在线中文字幕日亚韩一区| 神宫寺奈绪一区二区三区| 精品中文字幕一区二区小辣椒| 51色欧美片视频在线观看| 朝桐光av在线| 久久免费大视频| 亚洲色图偷窥自拍| 黄色短视频在线观看| 麻豆视频久久| 在线播放视频一区| 国产区二区三区| 欧美艳星kaydenkross| 亚洲国产日韩a在线播放| 中国一级黄色录像| 看黄网站在线| 国产精品久久久久天堂| 日本一区二区三区视频免费看| 欧美 日韩 综合| 国产福利一区二区| 91夜夜揉人人捏人人添红杏| 亚洲图片视频小说| 日本不卡的三区四区五区| 日韩美女视频免费看| 日本三级一区二区| 欧美天天在线| 久久免费高清视频| 91香蕉在线视频| 在线高清一区| 5278欧美一区二区三区| 91av在线免费视频| 国产视频亚洲| 国产成人欧美在线观看| 久久久久99精品成人片我成大片| 国产视频一区三区| 日本国产高清不卡| 999视频在线| 美女视频一区二区三区| 国产精品免费久久久久久| 中文字幕人妻互换av久久| 欧美96一区二区免费视频| 国产精品自产拍在线观看中文| 在线观看毛片视频| 韩国一区二区在线观看| 999视频在线免费观看| 成人午夜视频一区二区播放| 成人动漫一区二区| 欧美日韩电影一区二区| 97电影在线| 亚洲三级在线免费| 国产精品成人久久电影| 国产欧洲在线| 91福利在线看| 亚洲一二三av| 久久大胆人体视频| 亚洲色图第三页| 久久国产美女视频| 亚洲国产一区二区精品专区| 国产成人精品一区二区| 一本色道久久综合无码人妻| 国产99久久久久| 美国av一区二区三区| 欧美尤物美女在线| 亚洲国产精品欧美一二99| 1024精品视频| aa亚洲一区一区三区| 亚洲第一色在线| 国产aⅴ激情无码久久久无码| 欧美1级片网站| 欧美精品福利视频| 国产精品xxxxxx| 国产精品自产自拍| 欧美精品欧美精品系列c| 黄色网在线播放| 欧美日韩久久久久| 三区视频在线观看| 亚洲品质自拍| 九九九久久久久久| 日本中文不卡| 天天摸夜夜添狠狠添婷婷| 中文字幕第一区第二区| 免费看欧美黑人毛片| 岛国精品在线| 亚洲国产毛片完整版| 中文字幕91视频| 亚洲一区二区网站| 成人在线视频电影| 日本黄色片在线观看| 欧美日韩国产一区二区| 三级黄色片免费看| 波多野结衣的一区二区三区| 欧美精品制服第一页| 在线观看污污网站| av电影一区二区| 成人污网站在线观看| 91亚洲精品| 亚洲成人久久电影| 激情视频在线播放| 极品销魂美女一区二区三区| 精品一区日韩成人| 丁香花高清在线观看完整版| 7777精品伊人久久久大香线蕉最新版| 午夜理伦三级做爰电影| 一本综合久久| 国产v亚洲v天堂无码| 91极品在线| 欧美日韩成人综合天天影院| 综合 欧美 亚洲日本| 久久激情婷婷| 久久影视中文粉嫩av| 9999精品成人免费毛片在线看| 欧美一区二区三区思思人| 日韩欧美在线视频播放| 热久久一区二区| 相泽南亚洲一区二区在线播放| 你懂得影院夜精品a| 精品香蕉一区二区三区| 日本三级小视频| av不卡免费电影| 青青青免费在线| 国产精品玖玖玖在线资源| 欧美国产精品日韩| 亚洲av无码一区二区三区性色| 亚洲男人电影天堂| 久草福利在线观看| 欧美日韩国产亚洲一区| 99精品国产高清一区二区| 91香蕉在线观看| 精品精品国产高清a毛片牛牛| 久久久久香蕉视频| www.欧美.com| 69堂免费视频| 国产欧美久久一区二区三区| 国产精品高潮粉嫩av| 午夜毛片在线| 欧美高清视频一二三区| 五月天丁香激情| 国产999精品久久久久久绿帽| 亚洲色欲久久久综合网东京热| 成人动态视频| 欧美一级免费视频| 北条麻妃在线视频观看| 亚洲一区二区三区四区| 一本色道久久88精品综合| 这里只有精品免费视频| 亚洲日本乱码在线观看| 日韩黄色一区二区| 先锋影音久久久| 五月婷婷一区| 9999久久久久| 日韩av不卡电影| 欧美私人网站| 亚洲国产高清自拍| 天天干天天操天天操| 国产精品久久久久久久裸模| 中文字幕一二三区| 99精品视频免费观看| 色综合久久av| 日韩一区二区三区精品| 欧洲中文字幕国产精品| 超碰个人在线| 日韩av一卡二卡| 亚洲天堂网在线观看视频| 一区二区在线观看视频| 黄色片视频免费观看| 人人狠狠综合久久亚洲| 美女扒开大腿让男人桶| 成人精品久久| 国产精品三区www17con| 中文.日本.精品| 久久久久国产精品免费网站| 国产在线三区| 欧美精品一区二区三区一线天视频 | 欧美性视频精品| 91这里只有精品| 亚洲国产精品小视频| 亚洲综合精品在线| 精品国产精品三级精品av网址| 岛国片在线免费观看| www.久久精品| 日本一区二区三区在线免费观看| 久久精品在线| 性高湖久久久久久久久aaaaa| 国产精品日韩精品中文字幕| 97se亚洲综合在线| 成人在线免费| 欧美一区二粉嫩精品国产一线天| 影音先锋中文在线视频| 亚洲一区二区久久久| 国产91久久久| 91麻豆精品国产自产在线观看一区 | 精品国产一区二区三区小蝌蚪 | www.天天干.com| 日本高清不卡一区| 久久久久无码国产精品| 中文字幕在线播放不卡一区| 久久午夜夜伦鲁鲁片| 国产伦精品一区二区三区免费迷 | 国产va亚洲va在线va| 手机亚洲手机国产手机日韩| 玛丽玛丽电影原版免费观看1977| 国产精品一区二区三区美女| 成人国产精品久久久久久亚洲| 范冰冰一级做a爰片久久毛片| 久久人91精品久久久久久不卡| 成人在线播放| 久久激情视频免费观看| 高清在线观看av| 亚洲欧美日韩一区二区在线 | 亚洲国产精品无码观看久久| 国产精品91一区二区三区| 日韩欧美亚洲区| 国产成人精品999在线观看| 久久66热这里只有精品| 91麻豆精品激情在线观看最新| 亚洲最大成人免费视频| 豆花视频一区| 91久久中文字幕| 99久久这里有精品| 亚洲自拍另类欧美丝袜| 国产一区二区三区免费观看在线| 国产日韩欧美综合| 成人免费观看49www在线观看| 国产精品一区二区女厕厕| 成人四虎影院| 91精品久久久久久久久久入口| 欧美成人一二区| 亚洲精品免费一区二区三区| 精品国产第一国产综合精品| 666精品在线| 大香伊人久久精品一区二区| 国产精品乱码视频| 你懂的在线观看一区二区| 国产一区再线| 亚洲资源网你懂的| 欧美区一区二区三区| 99久久免费观看| 一区二区电影| 国产精品videossex国产高清| 亚洲香蕉网站| 亚洲美女激情视频| 91麻豆视频在线观看| 91精品国产欧美一区二区成人| 国产乱码精品一区二区三区精东| 91精品国产aⅴ一区二区| 亚洲国产精品久久人人爱潘金莲 | 无人码人妻一区二区三区免费| 国产剧情一区在线| 天天躁日日躁狠狠躁av麻豆男男| 99精品欧美一区二区三区小说| 在线不卡av电影| 亚洲天堂福利av| 日韩欧美中文字幕一区二区| 色综合久久88色综合天天6| 中文字幕一区2区3区| 91精品国产综合久久久蜜臀图片 | 国产一区二区四区| 久久久天天操| 三年中文在线观看免费大全中国| 成人一区二区视频| 欧美人妻一区二区三区 | 西西44rtwww国产精品| 91国在线观看| 成人黄色在线观看视频| 亚洲老板91色精品久久| 免费av在线| 97久久超碰福利国产精品…| 国产精品天堂蜜av在线播放| 国产成人免费观看| 精品一区二区三区中文字幕老牛 | 成a人v在线播放| 亚洲精选中文字幕| 成年视频在线观看| 欧美综合在线观看| 国产一区二区三区| 日韩av在线电影观看| 国产精品v一区二区三区| 可以免费观看av毛片| 国产激情一区二区三区桃花岛亚洲| 精品人妻无码一区二区三区换脸| 亚洲男帅同性gay1069| 国产又粗又猛又爽又| 亚洲精品一区二区三区在线观看| 电影av一区| 97视频在线观看视频免费视频 | 日韩国产成人精品| 亚洲精品无码一区二区| 一区免费观看视频| 亚洲欧美偷拍视频| 亚洲白虎美女被爆操| 免费**毛片在线| 国产精品wwww| 亚洲欧洲美洲国产香蕉| 日韩黄色片在线| 国内精品在线播放| 国产馆在线观看| 色综合天天做天天爱| 人人妻人人澡人人爽人人欧美一区| 久久视频这里只有精品| 欧美aaaaaa| 日本一区二区在线视频| 国产精品一二| 日韩精品视频一区二区| 一区二区三区四区不卡在线| 97免费观看视频| 中文字幕欧美日韩| 欧美一级大片| 欧美日韩在线精品一区二区三区| av不卡在线| 亚洲一区二区三区四区五区六区| 一区二区三区欧美| 亚洲第一精品网站| 久久99久久99精品免观看粉嫩| 国产精品18| 天天爱天天做天天操| 久久99国产精品免费网站| 免费看黄色三级| 欧美主播一区二区三区| 国模吧精品人体gogo| 日韩av高清不卡| 国内精品久久久久久99蜜桃| 欧美日韩在线成人| 国产偷国产偷精品高清尤物| 波多野结衣黄色| 伊人久久久久久久久久| 日本少妇一区| 亚洲欧洲精品在线| 精品夜夜嗨av一区二区三区| 91香蕉视频网| 欧美一区二区三区在线电影| 成年人黄视频在线观看| 丁香婷婷久久久综合精品国产| 国产精品v欧美精品v日本精品动漫| 中文字幕avav| 亚洲福利一二三区| 天天干天天爱天天操| 日本精品中文字幕| 日韩精品影视| 欧美xxxxxbbbbb| 五月婷婷激情综合网| 能在线看的av| 国产精品视频1区| 91精品91| 亚洲男人在线天堂| 在线看一区二区| 黄色在线免费| 国产福利一区二区三区在线观看| 亚洲人成人一区二区三区| 国产在线观看无码免费视频| 在线免费精品视频| 看黄网站在线观看| 狠狠色噜噜狠狠色综合久| 三级欧美在线一区| 91n在线视频| 亚洲精品在线观看网站| 九九热线视频只有这里最精品| 亚洲欧美日产图| 成人国产免费视频| 国模私拍一区二区| 欧美国产欧美亚洲国产日韩mv天天看完整| 国产精品香蕉| 亚洲高清免费在线观看| 亚洲综合免费观看高清完整版在线 | 不卡中文字幕在线| 99久久er热在这里只有精品66| 五月婷婷激情五月| 欧美极品少妇xxxxⅹ免费视频| 午夜先锋成人动漫在线| 国产传媒免费观看| 精品久久久久久久久久久久久久| 午夜精品一区| 久热国产精品视频一区二区三区| 精品一区二区在线播放| 999这里只有精品|