解讀nacos獲取配置文件的大致過程
一、spring 體系相關(guān)類
(主要借助spring的api,自動注入配置信息)
com.alibaba.nacos.spring.core.env.AbstractNacosPropertySourceBuilder com.alibaba.nacos.spring.core.env.NacosPropertySourcePostProcessor com.alibaba.nacos.spring.util.config.NacosConfigLoader
主要是將ConfigService(實現(xiàn)類NacosConfigService)
獲取的配置信息添加到environment.getPropertySources()
二、配置
1、獲取配置文件
獲取配置文件由ConfigService的getConfig接口提供,
實現(xiàn)類的核心流程就是根據(jù)配置的nacos地址使用,當然會有一些優(yōu)先級之類的處理
網(wǎng)絡(luò)請求由com.alibaba.nacos.client.config.impl.ClientWorker的getServerConfig處理
(getServerConfig->HttpAgent(MetricsHttpAgent)->HttpAgent(ServerHttpAgent)->HttpSimpleClient->HttpURLConnection);
2、監(jiān)聽配置更新
拉取數(shù)據(jù)其實是在NacosConfigService創(chuàng)建的時候就開始的
NacosConfigService創(chuàng)建的時候
Nacos創(chuàng)建ClientWorker成員變量
worker = new ClientWorker(agent, configFilterChainManager);
然后在worker的構(gòu)造函數(shù)啟動time task:
executor.scheduleWithFixedDelay(new Runnable() { public void run() { try { checkConfigInfo(); } catch (Throwable e) { log.error(agent.getName(), "NACOS-XXXX", "[sub-check] rotate check error", e); } } }, 1L, 10L, TimeUnit.MILLISECONDS); executorService.execute(new LongPollingRunnable(i)); List<String> changedGroupKeys = checkUpdateDataIds(cacheDatas, inInitializingCacheList); checkUpdateConfigStr(sb.toString(), isInitializingCacheList)
checkUpdateConfigStr最終會調(diào)用http請求,http請求將本地配置文件的md5計算后傳給nacos服務(wù)器,服務(wù)器根據(jù)MD5
計算返回變動了的配置文件的列表,client在根據(jù)這個結(jié)果拉取配置文件,
nacos的配置監(jiān)聽使用異步 Servlet 技術(shù),默認在配置相同的情況下,會等待30秒,不然會立刻獲取配置信息
com.alibaba.nacos.config.server.controller.ConfigServletInner
nacos在這里處理異步返回的結(jié)果
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot接口實現(xiàn)百萬并發(fā)的代碼示例
隨著互聯(lián)網(wǎng)的發(fā)展,越來越多的應(yīng)用需要支持高并發(fā),在這種情況下,如何實現(xiàn)高并發(fā)成為了一個重要的問題,Spring Boot是一個非常流行的Java框架,它提供了很多方便的功能來支持高并發(fā),本文將介紹如何使用Spring Boot來實現(xiàn)百萬并發(fā)2023-10-10完美解決gson將Integer默認轉(zhuǎn)換成Double的問題
下面小編就為大家?guī)硪黄昝澜鉀Qgson將Integer默認轉(zhuǎn)換成Double的問題。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-03-03Java中parallelStream().forEach()的踩坑日記
本文主要介紹了Java中parallelStream().forEach()的踩坑日記,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06springsecurity第三方授權(quán)認證的項目實踐
Spring security 是一個強大的和高度可定制的身份驗證和訪問控制框架,本文主要介紹了springsecurity第三方授權(quán)認證的項目實踐,具有一定的參考價值,感興趣可以了解一下2023-08-08java應(yīng)用開發(fā)之JVM運行時內(nèi)存分析
這篇文章主要介紹了java應(yīng)用開發(fā)之JVM運行時內(nèi)存,文中附含圖文示例內(nèi)容分析非常簡要,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-09-09