国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

聊聊對Nacos Client服務發現源碼分析

開發 前端
本篇帶大家通過源碼層面分析一下Nacos Client的服務發現的路程,事實可能并不像你想象的那樣簡單。

[[416416]]

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

學習不用那么功利,二師兄帶你從更高維度輕松閱讀源碼~

本篇帶大家通過源碼層面分析一下Nacos Client的服務發現的路程,事實可能并不像你想象的那樣簡單。

Nacos服務發現

直觀的看,Nacos客戶端的服務發現,就是封裝參數、調用服務端接口、獲得返回實例列表。

naocos

但細化這個流程,會發現不僅包括了通過NamingService獲取服務列表,在獲取服務列表的過程中還涉及到通信協議(Http or gRPC)、訂閱流程、故障轉移邏輯等。下面我們根據服務發現來捋一下相關的流程。

先說入口程序,依舊是在NamingTest中可以看到:

  1. NamingService namingService = NacosFactory.createNamingService(properties); 
  2. namingService.registerInstance("nacos.test.1", instance); 
  3.  
  4. ThreadUtils.sleep(5000L); 
  5. // 獲取實例列表 
  6. List<Instance> list = namingService.getAllInstances("nacos.test.1"); 

關于NamingService的實例化和基本功能,在服務注冊時已經講過,這里直接看獲取實例列表方法getAllInstances。該方法的參數就是服務的名稱。

經過一些列的重載方法調用,真正處理核心邏輯的方法如下:

  1. @Override 
  2. public List<Instance> getAllInstances(String serviceName, String groupName, List<String> clusters, 
  3.         boolean subscribe) throws NacosException { 
  4.     ServiceInfo serviceInfo; 
  5.     String clusterString = StringUtils.join(clusters, ","); 
  6.     // 是否訂閱模式 
  7.     if (subscribe) { 
  8.         // 先從客戶端緩存獲取服務信息 
  9.         serviceInfo = serviceInfoHolder.getServiceInfo(serviceName, groupName, clusterString); 
  10.         if (null == serviceInfo) { 
  11.             // 如果本地緩存不存在服務信息,則進行訂閱 
  12.             serviceInfo = clientProxy.subscribe(serviceName, groupName, clusterString); 
  13.         } 
  14.     } else { 
  15.         // 如果未訂閱服務信息,則直接從服務器進行查詢 
  16.         serviceInfo = clientProxy.queryInstancesOfService(serviceName, groupName, clusterString, 0, false); 
  17.     } 
  18.     // 從服務信息中獲去實例列表 
  19.     List<Instance> list; 
  20.     if (serviceInfo == null || CollectionUtils.isEmpty(list = serviceInfo.getHosts())) { 
  21.         return new ArrayList<Instance>(); 
  22.     } 
  23.     return list; 

首先看重載的getAllInstances方法,比入口方法多了幾個參數,這里不僅有服務名稱,還有分組名稱(groupName)、集群列表(clusters)、是否訂閱(subscribe)。

重載方法中的其他參數已經設置了默認值。比如,分組名稱默認為“DEFAULT_GROUP”、集群列表默認為空數組、是否訂閱默認為“訂閱”。

上述方法整理成流程圖如下:

naocos

上述流程的基本邏輯為:

如果是訂閱模式,則直接從本地緩存獲取服務信息(ServiceInfo),然后從中獲取實例列表,這是因為訂閱機制會自動同步服務器實例的變化到本地。如果本地緩存中沒有,那說明是首次調用,則進行訂閱,在訂閱完成后會獲得到服務信息。

如果是非訂閱模式,那就直接請求服務器端,獲得服務信息。

訂閱處理流程

在上述流程中,涉及到了訂閱邏輯,入口代碼為獲取實例列表中的如下方法:

  1. serviceInfo = clientProxy.subscribe(serviceName, groupName, clusterString); 

下面就來看看該方法內部是如何進行處理的。首先,這里的clientProxy是NamingClientProxy類的對象。對應的subscribe實現如下:

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

在上述代碼中,可以看到在獲取服務實例列表時(特別是首次),也進行了訂閱邏輯的拓展,基本流程圖如下:

naocos

上圖流程中可以看出,訂閱方法先通過代理類進行了本地緩存的判斷,如果本地緩存存在ServiceInfo信息,則直接返回。如果不存在,則默認采用gRPC協議進行訂閱,并返回ServiceInfo。

grpcClientProxy的subscribe訂閱方法就是直接向服務器發送了一個訂閱請求,并返回結果,就沒有做過多處理了。

訂閱完成之后,會通過ServiceInfoUpdateService開啟一個定時任務,這個定時任務主要的作用就是來定時同步服務器端的實例列表信息,并進行本地緩存更新等操作。

最后一步,ServiceInfo本地緩存處理。這里會將獲得的最新ServiceInfo與本地內存中的ServiceInfo進行比較,更新,發布變更時間,磁盤文件存儲等操作。其實,這一步的操作,在訂閱定時任務中也進行了處理。

關于訂閱細節和本地緩存處理,涉及內容較多,我們后面單獨拓展開講解。這里知道整體流程即可。

小結

本文主要梳理了Nacos客戶端服務發現的核心流程,包括:

第一,如果沒有開啟訂閱模式,則直接通過/instance/list接口(默認通過gRPC協議)獲取服務實例列表信息;

第二,如果開啟訂閱模式(默認開啟),則先會從本地緩存中獲取實例信息,如果不存在,則進行訂閱獲并獲取實例信息;

第三,在開啟訂閱時,會開啟定時任務,定時執行UpdateTask(獲取服務器實例信息、更新本地緩存、發布事件);

第四,在第二步獲得最新的實例信息之后,也會執行processServiceInfo方法來更新內存和本地實例緩存,并發布變更時間。

第五,至此,與第二步形成循環,每次獲取本地緩存,不存在則更新……

 

關于用來處理訂閱相關的UpdateTask和用來處理本地緩存的ServiceInfoHolder#processServiceInfo方法,我們后面文章繼續講解。

 

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

2021-07-12 08:00:21

Nacos 服務注冊源碼分析

2021-07-16 06:56:50

Nacos注冊源碼

2021-09-08 06:51:53

CountDownLa閉鎖源碼

2021-08-09 07:58:36

Nacos 服務注冊源碼分析

2021-05-18 20:22:00

Spring ClouNacos服務

2021-08-12 06:52:01

Nacos服務機制

2021-08-16 07:26:42

服務訂閱機制

2023-09-06 18:16:14

自動發現Zabbix網絡

2021-09-07 07:53:42

Semaphore 信號量源碼

2024-07-05 08:26:54

2010-02-06 13:28:31

Android源碼

2022-02-07 07:10:32

服務注冊功能

2022-02-09 07:03:01

SpringNacos服務注冊

2021-05-27 22:46:00

Nacos Clien版本Nacos

2022-05-08 17:53:38

Nacos服務端客戶端

2022-05-06 07:52:06

Nacos服務注冊

2021-04-18 07:33:20

項目Springboot Nacos

2022-09-28 11:34:27

用戶行為數據業務

2023-11-02 20:05:17

KubernetesPod管理

2024-07-03 13:51:02

SQL毛刺數據庫
點贊
收藏

51CTO技術棧公眾號

精品999成人| 先锋影音国产一区| 视频二区欧美毛片免费观看| 风间由美性色一区二区三区四区| 欧美日韩免费高清一区色橹橹 | 久久亚洲中文字幕无码| 免费观看久久av| 国产视频亚洲视频| 污污的网站在线观看| 国产三级欧美三级日产三级99 | 都市激情久久久久久久久久久| 日韩中文在线| 亚洲国产欧美一区二区三区同亚洲| 欧美5-7sexvideos处| 91免费在线播放| 波多野结衣三级在线| 欧美日韩三级| 日韩av电影院| 日韩综合久久| 亚洲精品成人av| 日本韩国在线视频爽| 亚洲免费av高清| 九九视频精品在线观看| 国产精品一区三区| 四虎永久国产精品| 久久精品盗摄| 蜜桃传媒一区二区| 一本色道久久综合亚洲精品高清 | 亚洲国产精品久久久久蝴蝶传媒| 国内精品久久久久久中文字幕| 日韩av中字| 国产偷亚洲偷欧美偷精品| 精品国产白色丝袜高跟鞋| 精品国产户外野外| videoxxxx另类日本极品| 国产精品久久久久aaaa樱花| 黄色片视频在线播放| www欧美成人18+| 日本免费黄视频| 91免费国产在线观看| 成人一区二区免费视频| 国产.欧美.日韩| 日本a视频在线观看| 9色porny自拍视频一区二区| 日本香蕉视频在线观看| 国产精品亚洲第一| 免费看黄在线看| 成人不卡免费av| 国产精品亚洲a| 亚洲视频在线观看三级| 婷婷丁香六月天| 天天亚洲美女在线视频| 尤物免费看在线视频| 中国一级特黄毛片大片| 久久免费看少妇高潮| 成人性做爰aaa片免费看不忠| 91se在线| 亚洲午夜私人影院| 无码人妻少妇伦在线电影| 亚洲人和日本人hd| 国产欧美日韩中文字幕在线| 色呦呦在线视频| 成人免费三级在线| 成人在线精品视频| 成人高清免费观看mv| 久久中文在线| 中文国产亚洲喷潮| 美女色狠狠久久| 欧美精品做受xxx性少妇| 成人免费直播在线| 国产日韩亚洲欧美| 国产亚洲午夜| 国内自拍中文字幕| 搜成人激情视频| 97国产在线观看| 九七久久人人| 日韩欧美激情四射| 成人在线观看一区| 日韩三级在线观看| 欧美日韩视频免费看| 69视频在线免费观看| 国产一区二区三区四区三区四 | 精品入口麻豆88视频| 国产成人高潮免费观看精品| 国产在线欧美| 成年人深夜视频| 亚洲一区二区美女| 丝袜在线视频| 91精品国产高清久久久久久91 | 色婷婷亚洲综合| 天堂中文最新版在线中文| 超碰精品一区二区三区乱码| 日韩中文在线电影| 亚洲免费不卡| 亚洲欧美经典视频| 青春草在线免费视频| 性欧美xxxx| 日韩电影免费在线看| 日韩av卡一卡二| 69成人精品免费视频| 伊人www22综合色| 国产一区二区高清视频| 久久亚洲一区二区三区明星换脸| 福利在线播放| 欧美大奶子在线| 日韩精品一二三| 五月天最新网址| 综合欧美国产视频二区| 亚洲国内自拍| 久久久久久久久久久久91| 日韩欧美国产综合在线一区二区三区 | 91看片就是不一样| 欧美日韩成人在线一区| 国产欧美啪啪| 五月天激情图片| 欧美日韩精品免费观看视频| 亚洲成aⅴ人片久久青草影院| 男女激烈动态图| 欧美四级电影在线观看| 欧美精品momsxxx| 欧美黑人经典片免费观看| 日韩久久精品一区| 98精品久久久久久久| 波多野结衣天堂| 亚洲图片欧洲图片av| 欧美日韩18| 黄页网站免费在线观看| 欧美成人精品三级在线观看| 激情综合亚洲精品| 美女羞羞视频在线观看| 91精品在线观| 一区二区三区欧美日韩| 亚洲国产高清在线观看| 国产特级淫片高清视频| 亚洲精品网站在线播放gif| 欧美日韩专区| 一个人免费视频www在线观看| 97不卡在线视频| 久久精品一区蜜桃臀影院| 日韩网站中文字幕| 国产精品久久成人免费观看| 日韩免费一区二区| 久久动漫亚洲| 91大神在线网站| 国产精品免费视频一区二区| 色综合中文字幕| 色无极亚洲影院| 性视频在线播放| 国产精品7m视频| 一区二区欧美在线观看| 伊甸园亚洲一区| 99re6在线视频| 欧美中文在线观看| 一区二区三区在线高清| 成人亚洲一区二区| h网址在线观看| 成人日韩av在线| 黑人巨大精品欧美一区免费视频 | 一本色道久久综合亚洲精品小说| 日韩精品91亚洲二区在线观看| 免费av毛片在线看| 欧美日韩一区二区三区免费| 日韩午夜激情av| 久久精品国产一区二区| 综合另类专区| 狠狠爱免费视频| 性欧美xxxx视频在线观看| 亚洲欧美偷拍卡通变态| 欧美aaaaaaaaaaaa| 午夜看片在线免费| 亚洲精品一区二区毛豆| 亚洲小视频在线观看| 国产香蕉久久精品综合网| 一道在线中文一区二区三区| 一级黄色在线| 亚洲精蜜桃久在线| 久久久成人av| 亚洲午夜久久久久久久久电影院| 欧美在线亚洲| 污污片在线免费视频| av一区二区三区免费观看| 欧美夫妻性生活xx| 午夜精品久久久久久久久 | 性欧美长视频免费观看不卡| 亚洲第一福利视频在线| 雨宫琴音一区二区在线| 老色鬼在线视频| 成人一区二区三| 国产精品揄拍500视频| 3atv在线一区二区三区| 国产成人精品综合在线观看 | av在线精品| 伊人发布在线| 久久www免费人成精品| 亚洲新声在线观看| 成人免费一区二区三区视频 | 欧美日韩国产第一页| 亚洲国产色一区| 老司机一区二区三区| 国产一区二区|