精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

欧美wwwww| 欧美日韩破处视频| 久久亚洲春色中文字幕久久久| 啪一啪鲁一鲁2019在线视频| 日本人亚洲人jjzzjjz| 96视频在线观看欧美| 天天影视涩香欲综合网| 水蜜桃亚洲精品| 亚洲黄色一级大片| 日韩国产在线观看一区| 欧美男插女视频| 欧美多人猛交狂配| 国产一区精品二区| 欧美香蕉大胸在线视频观看| 国产精品亚洲天堂| 五月激情丁香婷婷| 国产一区二区三区四区五区入口| 91黄色8090| 在线看的片片片免费| 伊人久久大香线蕉| 欧美tk丨vk视频| 一区二区xxx| 黄色污网站在线观看| 亚洲色图欧美激情| 欧美亚洲免费高清在线观看| 精品久久国产视频| 免播放器亚洲一区| 欧美一级bbbbb性bbbb喷潮片| 国产精品精品软件男同| 九一成人免费视频| 亚洲国产一区二区三区在线观看 | 99久久99久久精品国产片| 中文字幕视频网站| 精品动漫3d一区二区三区免费| 日韩小视频在线观看| 亚洲最大成人网站| 超碰成人在线观看| 欧美一区二区三区视频免费播放 | 成人高清视频在线观看| 91免费高清视频| 免费在线不卡av| 午夜在线播放视频欧美| 久久免费观看视频| 久久在线视频精品| 欧美福利网址| 久久中文字幕在线| www色aa色aawww| **女人18毛片一区二区| 中文字幕亚洲无线码a| 怡红院一区二区三区| 美女精品一区最新中文字幕一区二区三区| 精品国精品国产| 国产探花一区二区三区| 成人污污www网站免费丝瓜| 欧美日韩精品是欧美日韩精品| 激情综合网俺也去| 超碰这里只有精品| 欧美性生活一区| 中国黄色片免费看| 久久亚洲国产精品尤物| 欧美探花视频资源| 中文字幕免费高清在线| 性欧美video另类hd尤物| 欧美日韩黄视频| 色播五月综合网| 国产乱子精品一区二区在线观看| 欧美日韩一区二区在线观看 | 久草视频这里只有精品| 亚洲wwwww| 亚洲国产欧美在线| 一二三四视频社区在线| 人人草在线视频| 色综合天天综合在线视频| www.xxx亚洲| 伊人久久大香线蕉综合影院首页| 91精品一区二区三区久久久久久 | 伊人久久一区二区| 韩国一区二区三区| 91传媒视频在线观看| 亚洲乱码在线观看| 99精品久久只有精品| 欧美日韩一区综合| 日本在线观看免费| 亚洲永久免费视频| av动漫免费看| 成人在线精品| 亚洲成人av在线播放| 麻豆精品免费视频| 香蕉国产精品| 69久久夜色精品国产69| 成人毛片一区二区三区| 黑人巨大精品欧美一区| 精品在线一区| 香蕉视频在线看| 亚洲成人www| 天天操天天爱天天爽| 亚洲精品一区二区三区中文字幕| 亚洲国产精品久久| 黄色片网站免费| 国内精品福利| 国产免费一区视频观看免费 | 日韩在线网址| 亚洲色图35p| 欧美人妻一区二区| 日韩电影免费一区| 国产精品对白刺激久久久| 黄色在线免费观看大全| 一区二区三区在线视频播放| 欧美韩国日本在线| 日本免费一区二区视频| 国产午夜精品全部视频在线播放| 免费中文字幕在线观看| 日韩激情一二三区| 精品国产一区二区三区麻豆免费观看完整版 | 不卡高清视频专区| 国产福利片一区二区| 最近高清中文在线字幕在线观看1| 欧美一区二区在线播放| 成人手机在线免费视频| 欧美在线高清| 国产精品中文字幕久久久| 亚洲人在线观看视频| 一区二区在线观看视频| 黄色手机在线视频| 自拍偷拍精品| 久久免费在线观看| 中文字幕+乱码+中文字幕明步| 不卡一区中文字幕| 国产欧美123| 日日狠狠久久| 亚洲性猛交xxxxwww| 国产女同在线观看| 粉嫩高潮美女一区二区三区| 亚洲欧洲一区二区在线观看| 中文一区一区三区高中清不卡免费| 日韩欧美色综合网站| 成人信息集中地| 日本中文一区二区三区| 日本在线高清视频一区| 一个人看的www视频在线免费观看| 精品国产乱码久久久久久影片| 免费高清在线观看电视| 精品一区二区免费视频| 亚洲精品中字| 国产精品99精品一区二区三区∴| 亚洲天天在线日亚洲洲精| 国产午夜免费福利| 91麻豆精品在线观看| 黄页网站在线观看视频| 国产成人澳门| 97色在线观看| 亚洲人妻一区二区三区| 色综合视频在线观看| www在线观看免费视频| 石原莉奈一区二区三区在线观看| 日产中文字幕在线精品一区| 91精品影视| 中文国产亚洲喷潮| 亚洲图片小说视频| 日韩毛片精品高清免费| 免费人成视频在线播放| 国一区二区在线观看| 国产一区免费观看| 天天免费亚洲黑人免费| 国产一区二区三区三区在线观看| 成人免费一级片| 日韩一区在线看| aaaaa黄色片| 国产视频久久| 日本在线免费观看一区| 国产黄色一区| 欧美激情欧美激情| 性感美女福利视频| 欧美综合久久久| 99成人在线观看| 国产成人综合亚洲91猫咪| 国产 日韩 欧美在线| 最新国产一区| 成人午夜黄色影院| 欧美人与动牲性行为| 亚洲精品天天看| 91久久久久久久久久久久| 夜夜爽夜夜爽精品视频| 久久丫精品国产亚洲av不卡| 秋霞午夜av一区二区三区| 日韩女优电影在线观看| 欧美精品一区二区三区在线四季| 成人a在线观看高清电影| 久久伊人免费视频| 香蕉视频国产在线| 欧美综合一区二区三区| 久久久久久激情| 久久蜜臀中文字幕| 手机在线免费毛片| 老司机一区二区三区| 97精品国产97久久久久久粉红| 久久精品国产亚洲5555| 国产精品最新在线观看| 91超碰在线免费| 中文字幕亚洲欧美| 性高潮久久久久久久久久| 欧美精品第1页| 看片网址国产福利av中文字幕| 国产精品毛片久久久久久| 精品伦一区二区三区| 日本视频一区二区三区| 久草视频国产在线| 日本久久精品| 久久久久久高清| 日韩精品一区二区三区中文在线 | 国产激情欧美| 午夜欧美大片免费观看| 巨大荫蒂视频欧美大片| 亚洲色图激情小说| 视频一区 中文字幕| 欧美日韩在线不卡| 日日噜噜噜噜人人爽亚洲精品| 亚洲免费三区一区二区| 极品人妻videosss人妻| www.亚洲在线| 中文字幕 欧美 日韩| 日本亚洲天堂网| 免费在线激情视频| 在线不卡亚洲| 国产精品国三级国产av| 99re66热这里只有精品8| 日本精品一区二区三区高清 久久| 久久久久观看| 国产精品日韩欧美一区二区三区 | 国产一区二区高清视频| 日韩精品久久久久久久软件91| 成人免费xxxxx在线观看| 巨大黑人极品videos精品| 日韩av免费在线播放| 日本黄色免费在线| 午夜精品一区二区三区视频免费看| h片在线播放| 久久久精品美女| 精品孕妇一区二区三区| www.日韩欧美| 日本精品一区二区三区在线播放| 亚洲视频专区在线| 黄色片在线播放| 亚洲人成电影网站色…| 青青草超碰在线| 亚洲精品一区二区在线| 青青青草原在线| 亚洲色图13p| bbbbbbbbbbb在线视频| 中文日韩在线视频| 欧美私人网站| 久久综合久中文字幕青草| 国产在线高清视频| 欧美成人全部免费| 在线观看小视频| 久久久久久久久久久网站| 牛牛在线精品视频| 久久久亚洲欧洲日产国码aⅴ| 国产嫩草在线视频| 777午夜精品福利在线观看| 123区在线| 欧美孕妇性xx| 国产精品天堂蜜av在线播放| 成人亚洲欧美一区二区三区| 日本成人精品| 久久影院理伦片| 欧美日韩国产免费观看视频| 一本久久a久久精品vr综合| 欧美 日韩 国产一区二区在线视频| 成人污网站在线观看| 亚洲作爱视频| 亚洲老女人av| 国产一区二区免费在线| 国产伦精品一区二区三区精品| 久久久久久电影| 免费精品在线视频| 亚洲成av人片一区二区| 成人免费毛片视频| 欧美一二三区在线| 亚洲人视频在线观看| 色狠狠久久aa北条麻妃| 超碰在线网站| 国产精品扒开腿做爽爽爽男男| 国产美女视频一区二区| 精品一区二区久久久久久久网站| 精品日韩一区| 高清无码一区二区在线观看吞精| 国产一区二区三区的电影| www.涩涩涩| 希岛爱理中文字幕| 亚洲国产精品国自产拍av| 青草影院在线观看| 日韩欧美在线视频免费观看| 国产精品一区二区人人爽| 日韩精品免费在线观看| 欧洲美女少妇精品| 91精品国产91| 综合久久伊人| 欧美日韩精品免费观看视一区二区 | 欧美一区二区精品在线| 日本免费不卡| 久久99精品久久久久久青青91| 丁香六月综合| 成人影片在线播放| 大色综合视频网站在线播放| 久久综合久久网| 韩国av一区二区三区四区 | 中文字幕在线观看一区| 国产精品7777777| 日韩网站在线看片你懂的| 成人资源www网在线最新版| 国内揄拍国内精品| 国产精品xnxxcom| 日韩福利视频| 国产免费成人| 稀缺小u女呦精品呦| 综合欧美亚洲日本| 亚洲视频在线观看一区二区| 精品在线观看国产| 2021天堂中文幕一二区在线观| 91免费看片网站| 日韩一区三区| 国产福利影院在线观看| 久久人人爽爽爽人久久久| 国产香蕉在线视频| 日韩欧美不卡在线观看视频| 四虎久久免费| 国产欧美在线观看| 成人写真视频| 久久美女福利视频| 成人99免费视频| 国产真实夫妇交换视频 | 男男电影完整版在线观看| 欧美日韩成人在线视频| www.麻豆av| 国产乱妇无码大片在线观看| 欧美一区二区三区影院| 亚洲日穴在线视频| 亚洲熟女乱色一区二区三区久久久| 亚洲欧美日韩天堂一区二区| 女海盗2成人h版中文字幕| 国产一区不卡在线观看| 99视频+国产日韩欧美| 捆绑裸体绳奴bdsm亚洲| 精品国产乱码久久久久酒店| 日本激情一区二区| 欧美精品www在线观看| 丁香五月缴情综合网| 日本香蕉视频在线观看| 成人污污视频在线观看| 久久高清免费视频| 日韩av在线免费观看| 亚洲风情在线资源| 欧美一区二区在线| 热久久一区二区| 午夜精品一区二区三级视频| 欧美一区二区三区四区高清| 视频在线这里都是精品| 成人av播放| 在线亚洲精品| 国产jk精品白丝av在线观看| 欧美日韩在线综合| av在线网址观看| 国产传媒一区二区三区| 国产农村妇女精品一二区| www.自拍偷拍| 欧美精品自拍偷拍| 日韩另类在线| 久久精品日产第一区二区三区| 视频一区免费在线观看| 日本 欧美 国产| 精品国产91九色蝌蚪| 亚洲电影观看| 综合视频免费看| 成人一区二区三区| 国产真人无遮挡作爱免费视频| 色偷偷噜噜噜亚洲男人| 77成人影视| 黑森林福利视频导航| 国产精品久久久久天堂| 亚洲成人77777| 日本高清视频一区| 婷婷久久一区| 亚洲男人在线天堂| 欧美日本高清视频在线观看| 蜜臀av国内免费精品久久久夜夜| 久久久99爱| 精东粉嫩av免费一区二区三区| 国产无遮挡又黄又爽又色| 在线精品国产欧美| 成人高潮视频| 在线观看av网页| 精品女同一区二区三区在线播放| 1024视频在线| 久久精品中文字幕一区二区三区 | 深夜福利一区| 国产无套内射久久久国产| 亚洲视频在线观看一区| 天天操天天干天天插| 91久久久久久久久|