Nacos源码HostReactor
生活随笔
收集整理的這篇文章主要介紹了
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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Nacos源码NacosNamingSe
- 下一篇: Nacos处理服务变更通知