摘要:發布配置支持程序自動發布配置,創建和修改配置使用同一個方法,配置不存在則創建配置已存在則更新。示例源碼項目代碼已上傳至碼云和上,歡迎下載學習參考資料用戶指南的推薦閱讀系列歡迎來到的世界系列基于的注冊中心系列基于的配置中心
Maven依賴
Nacos提供完整的Java SDK,便于配置管理和服務發現及管理,以 Nacos-0.8.0 版本為例
添加Maven依賴:
com.alibaba.nacos nacos-client 0.8.0
僅僅引入nacos-client是不夠的,否則啟動時會出現如下錯誤:
sun.misc.Launcher$AppClassLoader@18b4aac2 JM.Log:WARN Init JM logger with NopLoggerFactory, pay attention. sun.misc.Launcher$AppClassLoader@18b4aac2 java.lang.ClassNotFoundException: org.apache.logging.log4j.core.Logger at java.net.URLClassLoader.findClass(URLClassLoader.java:381) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:264) at com.alibaba.nacos.client.logger.log4j2.Log4j2LoggerFactory.(Log4j2LoggerFactory.java:33) at com.alibaba.nacos.client.logger.LoggerFactory. (LoggerFactory.java:59) at com.alibaba.nacos.client.config.utils.LogUtils. (LogUtils.java:49) at com.alibaba.nacos.client.config.NacosConfigService. (NacosConfigService.java:55) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:264) at com.alibaba.nacos.api.config.ConfigFactory.createConfigService(ConfigFactory.java:40) at com.alibaba.nacos.api.config.ConfigFactory.createConfigService(ConfigFactory.java:59) at com.alibaba.nacos.api.NacosFactory.createConfigService(NacosFactory.java:52) at com.learn.nacos.config.NacosConfig.main(NacosConfig.java:12)
根據錯誤提示,應該還需要添加log4j相關依賴,官網的文檔并沒有對此說明,我在pom.xml添加了下面這些依賴才不報錯
配置管理ch.qos.logback logback-classic 1.1.11 org.logback-extensions logback-ext-spring 0.1.4 org.slf4j jcl-over-slf4j 1.7.25 log4j log4j 1.2.17 org.slf4j slf4j-api 1.7.25
創建ConfigService,可以通過 NacosFactory.createConfigService() 或 ConfigFactory.createConfigService() 來創建,后者是前者的底層實現方式,這兩種方式都包含如下兩個方法:
createConfigService(serverAddr)
createConfigService(properties)
創建示例:
// 方式一 String serverAddr = "127.0.0.1:8848"; ConfigService configService = ConfigFactory.createConfigService(serverAddr); // 方式二 ConfigService configService = ConfigFactory.createConfigService(properties) Properties properties = new Properties(); properties.put("serverAddr", serverAddr);
查看ConfigService源碼,它提供了如下方法:
獲取 Nacos Server 當前狀態:String getServerStatus()
底層源碼:
public String getServerStatus() { if (worker.isHealthServer()) { return "UP"; } else { return "DOWN"; } }
根據源碼注釋,該狀態應該是指 Nacos Server 的狀態,我把 Nacos Server 關閉之后,再次運行示例,得到的結果仍然是UP,不知道這是不是一個BUG。
發布配置:boolean publishConfig(String dataId, String group, String content) throws NacosException
支持程序自動發布Nacos配置,創建和修改配置使用同一個方法,配置不存在則創建;配置已存在則更新。
底層源碼:
try { result = agent.httpPost(url, headers, params, encode, POST_TIMEOUT); } catch (IOException ioe) { log.warn("NACOS-0006", LoggerHelper.getErrorCodeStr("NACOS", "NACOS-0006", "環境問題", "[publish-single] exception")); log.warn(agent.getName(), "[publish-single] exception, dataId={}, group={}, msg={}", dataId, group, ioe.toString()); return false; }
發布配置后,如果馬上用getConfig()讀取配置,有時候會讀不到,設置了足夠的等待時長后才可保證每次正常讀取,看了源碼才知道Nacos的配置管理(發布、讀取、移除)都是通過HTTP接口完成的,但發布配置的時延是多少,官網似乎沒有說明?幾秒鐘的時延在一些對實時性要求很高的場景會不會存在影響呢?
讀取配置:String getConfig(String dataId, String group, long timeoutMs) throws NacosException
timeoutMs指讀取配置超時時間,官網推薦設置為3000ms
底層源碼:
// 優先使用本地配置 String content = LocalConfigInfoProcessor.getFailover(agent.getName(), dataId, group, tenant); if (content != null) { log.warn(agent.getName(), "[get-config] get failover ok, dataId={}, group={}, tenant={}, config={}", dataId, group, tenant, ContentUtils.truncateContent(content)); cr.setContent(content); configFilterChainManager.doFilter(null, cr); content = cr.getContent(); return content; } try { content = worker.getServerConfig(dataId, group, tenant, timeoutMs); cr.setContent(content); configFilterChainManager.doFilter(null, cr); content = cr.getContent(); return content; } catch (NacosException ioe) { if (NacosException.NO_RIGHT == ioe.getErrCode()) { throw ioe; } log.warn("NACOS-0003", LoggerHelper.getErrorCodeStr("NACOS", "NACOS-0003", "環境問題", "get from server error")); log.warn(agent.getName(), "[get-config] get from server error, dataId={}, group={}, tenant={}, msg={}", dataId, group, tenant, ioe.toString()); }
從源碼上看,配置會先從本地緩存文件讀取,如果沒讀取到,才會去請求Nacos Server的配置,這個緩存文件在哪呢?就在當前用戶的nacos目錄下
生成的緩存文件:nacos/config/fixed-127.0.0.1_8848_nacos/snapshot/DEFAULT_GROUP/nacos-sdk-java-config,配置內容和發布到Nacos Server的配置內容是一致的。
移除配置:boolean removeConfig(String dataId, String group) throws NacosException
支持程序自動發布Nacos配置,配置不存在時會直接返回成功,移除配置后,本地的緩存文件也會被刪除
底層源碼:
try { result = agent.httpDelete(url, null, params, encode, POST_TIMEOUT); } catch (IOException ioe) { log.warn("[remove] error, " + dataId + ", " + group + ", " + tenant + ", msg: " + ioe.toString()); return false; }
移除配置同發布配置一樣,如果移除后馬上查詢,有可能還能將剛移除的配置查出來,也存在一定的時延,需要設置等待時間讀取。
添加配置監聽:void addListener(String dataId, String group, Listener listener) throws NacosException
支持動態監聽配置的變化,運行示例源碼,在Nacos控制臺把配置內容修改為sdk-java-config:change from nacos console,此時觀看IDE控制臺,你會看到如下打印信息:
當前線程:com.alibaba.nacos.client.Worker.longPollingfixed-127.0.0.1_8848 ,監聽到配置內容變化:sdk-java-config:change from nacos console
移除配置監聽:void removeListener(String dataId, String group, Listener listener)
移除監聽后,配置的變化不會再監聽
啟動完整示例,運行結果如下,請注意配置監聽線程和配置管理線程不是同一個線程
當前線程:main ,服務狀態:UP 添加監聽 添加監聽成功 發布配置 發布配置成功 當前線程:com.alibaba.nacos.client.Worker.longPollingfixed-127.0.0.1_8848 ,監聽到配置內容變化:nacos-sdk-java-config:init 當前線程:main ,發布配置后獲取配置內容:nacos-sdk-java-config:init 重新發布配置 重新發布配置成功 當前線程:main ,重新發布配置后獲取配置內容:sdk-java-config:update 當前線程:com.alibaba.nacos.client.Worker.longPollingfixed-127.0.0.1_8848 ,監聽到配置內容變化:sdk-java-config:update 當前線程:com.alibaba.nacos.client.Worker.longPollingfixed-127.0.0.1_8848 ,監聽到配置內容變化:sdk-java-config:change from nacos console 移除配置 移除配置成功 當前線程:main ,移除配置后獲取配置內容:null 取消監聽 取消監聽成功服務管理
創建NamingService,可以通過 NacosFactory.createNamingService() 或 NamingFactory.createNamingService() 來創建,后者是前者的底層實現方式,這兩種方式都包含如下兩個方法:
createNamingService(serverAddr)
createNamingService(properties)
創建示例:
// 方式一 String serverAddr = "127.0.0.1:8848"; NamingService namingService = NamingFactory.createNamingService(serverAddr); // 方式二 NamingService namingService = NamingFactory.createNamingService(properties) Properties properties = new Properties(); properties.put("serverAddr", serverAddr);
查看NamingService類源碼,它提供了如下方法:
獲取 Nacos Server 當前狀態:String getServerStatus()
注冊服務實例:void registerInstance(多個參數)
方式一: String serverIp = "127.0.0.1"; int serverPort = 8848; String serverAddr = serverIp + ":" + serverPort; String serviceName = "nacos-sdk-java-discovery"; NamingService namingService = NamingFactory.createNamingService(serverAddr); namingService.registerInstance(serviceName, serverIp, serverPort); 方式二: Instance instance = new Instance(); instance.setIp(serverIp);//IP instance.setPort(serverPort);//端口 instance.setServiceName(serviceName);//服務名 instance.setEnabled(true);//true: 上線 false: 下線 instance.setHealthy(healthy);//健康狀態 instance.setWeight(1.0);//權重 instance.addMetadata("nacos-sdk-java-discovery", "true");//元數據 NamingService namingService = NamingFactory.createNamingService(serverAddr); namingService.registerInstance(serviceName, instance);
注冊后,本地會生成緩存文件
1、在Nacos安裝目錄data目錄下:data/naming/data/public/com.alibaba.nacos.naming.domains.meta.public##nacos-sdk-java-discovery
2、當前用戶的nacos目錄下:/nacos/naming/public/failover/nacos-sdk-java-discovery
3、當前用戶的nacos目錄下:/nacos/naming/public/nacos-sdk-java-discovery即使刪除服務實例,上面三個緩存文件也不會被刪除,Nacos控制臺服務列表中該服務也還存在著(但服務實例數會變成0);刪除Nacos控制臺的該服務,安全目錄data目錄下的緩存文件會被刪除,但當前用戶的nacos目錄下的文件不會被刪除,這里面是什么機制,我暫時還沒整明白,等后面整明白了再來補充。
刪除服務實例:void deregisterInstance(多個參數)
獲取所有服務實例:List
獲取所有健康或不健康的服務實例:List
隨機獲取一個健康實例(根據負載均衡算法):Instance selectOneHealthyInstance(多個參數)
添加服務實例監聽:void subscribe(多個參數)
添加服務實例監聽:void unsubscribe(多個參數)
分頁獲取所有服務實例:ListView
獲取所有監聽的服務實例:List
啟動完整示例,運行結果如下,請注意服務實例監聽線程和服務實例管理線程不是同一個線程
當前線程:main ,服務狀態:UP 注冊實例 注冊實例成功 添加監聽 添加監聽成功 當前線程:main ,注冊實例后獲取所有實例:[{"clusterName":"DEFAULT","enabled":true,"instanceId":"127.0.0.1#8848#DEFAULT#nacos-sdk-java-discovery","ip":"127.0.0.1","metadata":{},"port":8848,"serviceName":"nacos-sdk-java-discovery","valid":true,"weight":1.0}] 當前線程:main ,注冊實例后獲取所有健康實例:[{"clusterName":"DEFAULT","enabled":true,"instanceId":"127.0.0.1#8848#DEFAULT#nacos-sdk-java-discovery","ip":"127.0.0.1","metadata":{},"port":8848,"serviceName":"nacos-sdk-java-discovery","valid":true,"weight":1.0}] 當前線程:com.alibaba.nacos.naming.client.listener ,監聽到實例名稱:nacos-sdk-java-discovery 當前線程:com.alibaba.nacos.naming.client.listener ,監聽到實例內容:[{"clusterName":"DEFAULT","enabled":true,"instanceId":"127.0.0.1#8848#DEFAULT#nacos-sdk-java-discovery","ip":"127.0.0.1","metadata":{},"port":8848,"serviceName":"nacos-sdk-java-discovery","valid":true,"weight":1.0}] 當前線程:main ,注冊實例后獲取一個健康實例:{"clusterName":"DEFAULT","enabled":true,"instanceId":"127.0.0.1#8848#DEFAULT#nacos-sdk-java-discovery","ip":"127.0.0.1","metadata":{},"port":8848,"serviceName":"nacos-sdk-java-discovery","valid":true,"weight":1.0} 當前線程:com.alibaba.nacos.naming.client.listener ,監聽到實例名稱:nacos-sdk-java-discovery 當前線程:com.alibaba.nacos.naming.client.listener ,監聽到實例內容:[{"clusterName":"DEFAULT","enabled":true,"instanceId":"127.0.0.1#8848#DEFAULT#nacos-sdk-java-discovery","ip":"127.0.0.1","metadata":{"change":"true;"},"port":8848,"serviceName":"nacos-sdk-java-discovery","valid":true,"weight":2.0}] 取消監聽 取消監聽成功 刪除實例 刪除實例成功 Exception in thread "main" java.lang.IllegalStateException: no host to srv for serviceInfo: nacos-sdk-java-discovery at com.alibaba.nacos.client.naming.core.Balancer$RandomByWeight.selectAll(Balancer.java:45) at com.alibaba.nacos.client.naming.core.Balancer$RandomByWeight.selectHost(Balancer.java:53) at com.alibaba.nacos.client.naming.NacosNamingService.selectOneHealthyInstance(NacosNamingService.java:270) at com.alibaba.nacos.client.naming.NacosNamingService.selectOneHealthyInstance(NacosNamingService.java:263) at com.alibaba.nacos.client.naming.NacosNamingService.selectOneHealthyInstance(NacosNamingService.java:253) at com.learn.nacos.discovery.NacosDiscovery.main(NacosDiscovery.java:121) 當前線程:main ,刪除實例后獲取所有實例:[] 當前線程:main ,刪除實例后獲取所有健康實例:[]
以上就是 Nacos Java SDK 配置管理和服務管理功能的介紹,請參考示例源碼學習。
示例源碼項目:learn-nacos-sdk-java
代碼已上傳至碼云和Github上,歡迎下載學習
Gitee
Github
參考資料Nacos用戶指南:Java的SDK
推薦閱讀Nacos系列:歡迎來到Nacos的世界!
Nacos系列:基于Nacos的注冊中心
Nacos系列:基于Nacos的配置中心
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/73379.html
摘要:數據源內嵌的數據庫,通過命令直接啟動即可,無需額外安裝。參考資料部署手冊集群部署說明推薦閱讀系列歡迎來到的世界系列基于的注冊中心系列基于的配置中心系列的使用 三種部署模式 Nacos支持三種部署模式 1、單機模式:可用于測試和單機使用,生產環境切忌使用單機模式(滿足不了高可用) 2、集群模式:可用于生產環境,確保高可用 3、多集群模式:可用于多數據中心場景 單機模式 啟動 Nacos ...
摘要:元數據數據如配置和服務描述信息,如服務版本權重容災策略負載均衡策略鑒權配置各種自定義標簽,從作用范圍來看,分為服務級別的元信息集群的元信息及實例的元信息。 什么是Nacos? Nacos 是構建以服務為中心的現代應用架構 (例如微服務范式、云原生范式) 的服務基礎設施。 Nacos可以做什么? 1、動態配置服務:支持以中心化、外部化和動態化的方式管理所有環境的配置。動態配置消除了配置變...
摘要:年月阿里巴巴高級技術專家許真恩慕義發布了首個開源版本,作為的開源實現截止目前已經更新到了的大版本,并且支持大規模生產版本。支持目前幾乎所有主流的微服務生態體系。 前言 6月份阿里開源的Nacos出了1.0.1版本,從去年7月份第一個release版本到現在一直在默默關注 官方的版本規劃為:Nacos從0.8.0開始支持生產可用,1.0版本可大規模生產可用,2.0版本接入k8s、Spri...
摘要:殺只雞而已,你拿牛刀來做甚釋義小團隊小項目選擇簡單的配置管理方式就好了,要什么配置中心,純屬沒事找事。,我就啰嗦到這里吧,下面正式介紹作為配置中心是怎么使用的。 前言 在看正文之前,我想請你回顧一下自己待過的公司都是怎么管理配置的,我想應該會有以下幾種方式: 1、硬編碼沒有什么配置不配置的,直接寫在代碼里面,比如使用常量類優勢:對開發友好,開發清楚地知道代碼需要用到什么配置劣勢:涉及秘...
閱讀 3729·2021-11-24 09:39
閱讀 3444·2019-08-30 15:56
閱讀 1370·2019-08-30 15:55
閱讀 1031·2019-08-30 15:53
閱讀 1919·2019-08-29 18:37
閱讀 3601·2019-08-29 18:32
閱讀 3128·2019-08-29 16:30
閱讀 2918·2019-08-29 15:14