日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Nacos源码HostReactor

發布時間:2024/4/14 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Nacos源码HostReactor 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

訂閱服務消息,這里是由HostReactor類的getServiceInfo()方法來實現的:

public ServiceInfo getServiceInfo(final String serviceName, final String clusters) {NAMING_LOGGER.debug("failover-mode: " + failoverReactor.isFailoverSwitch());// 由 服務名@@集群名拼接 keyString key = ServiceInfo.getKey(serviceName, clusters);if (failoverReactor.isFailoverSwitch()) {return failoverReactor.getService(key);}// 讀取本地服務列表的緩存,緩存是一個Map,格式:Map<String, ServiceInfo>ServiceInfo serviceObj = getServiceInfo0(serviceName, clusters);// 判斷緩存是否存在if (null == serviceObj) {// 不存在,創建空ServiceInfoserviceObj = new ServiceInfo(serviceName, clusters);// 放入緩存serviceInfoMap.put(serviceObj.getKey(), serviceObj);// 放入待更新的服務列表(updatingMap)中updatingMap.put(serviceName, new Object());// 立即更新服務列表updateServiceNow(serviceName, clusters);// 從待更新列表中移除updatingMap.remove(serviceName);} else if (updatingMap.containsKey(serviceName)) {// 緩存中有,但是需要更新if (UPDATE_HOLD_INTERVAL > 0) {// hold a moment waiting for update finish 等待5秒中,待更新完成synchronized (serviceObj) {try {serviceObj.wait(UPDATE_HOLD_INTERVAL);} catch (InterruptedException e) {NAMING_LOGGER.error("[getServiceInfo] serviceName:" + serviceName + ", clusters:" + clusters, e);}}}}// 開啟定時更新服務列表的功能scheduleUpdateIfAbsent(serviceName, clusters);// 返回緩存中的服務信息return serviceInfoMap.get(serviceObj.getKey()); }

基本邏輯就是先從本地緩存讀,根據結果來選擇:

  • 如果本地緩存沒有,立即去nacos讀取,updateServiceNow(serviceName, clusters)

如果本地緩存有,則開啟定時更新功能,并返回緩存結果:

  • scheduleUpdateIfAbsent(serviceName, clusters)

?在UpdateTask中,最終還是調用updateService方法:

?

不管是立即更新服務列表,還是定時更新服務列表,最終都會執行HostReactor中的updateService()方法:

public void updateService(String serviceName, String clusters) throws NacosException {ServiceInfo oldService = getServiceInfo0(serviceName, clusters);try {// 基于ServerProxy發起遠程調用,查詢服務列表String result = serverProxy.queryList(serviceName, clusters, pushReceiver.getUdpPort(), false);if (StringUtils.isNotEmpty(result)) {// 處理查詢結果processServiceJson(result);}} finally {if (oldService != null) {synchronized (oldService) {oldService.notifyAll();}}} }

總結

以上是生活随笔為你收集整理的Nacos源码HostReactor的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。