Nacos 幫我們解決什麼問題?(配置管理篇)
是阿里巴巴今年7月份開源的專案,如其名, Naming Configuration Service ,專注於服務發現和配置管理領域。本系列文章,將從 5W1H(What、Where、When、Who、Why、How)全面剖析 Nacos,給大家安利一下 Nacos。本文作為 Nacos 系列文章的開篇,也就從 “What” 開始。我們開始關注一個開源專案的時候,通常最先冒出的 2 個問題是:
-
它是什麼?
-
它幫我們解決什麼問題?
Nacos 是什麼?上面已經大概介紹了,更多詳細內容可以從 或 瞭解。
Nacos 能幫我們解決什麼問題?本文圍繞其“配置管理”功能來解答。
配置,作為程式碼如影隨形的小夥伴,伴隨著應用的整個生命週期,我們當然對它也非常的熟悉,想想配置一般都透過哪幾種形式存在?
-
硬編碼
-
配置檔案
-
DB 配置表
硬編碼
配置項作為類欄位的形式存在,如:
public class AppConfig { private int connectTimeoutInMills = 5000; public int getConnectTimeoutInMills() { return connectTimeoutInMills; } public void setConnectTimeoutInMills(int connectTimeoutInMills) { this.connectTimeoutInMills = connectTimeoutInMills; } }
這種形式主要有三個問題:
如果配置是需要動態修改的話,需要當前應用去暴露管理該配置項的介面,至於是 Controller 的 API 介面,還是 JMX ,都是可以做到。
另外,配置變更都是發生在記憶體中,並沒有持久化。因此,在修改配置之後重啟應用,配置又會變回程式碼中的預設值了,這是一個坑啊,筆者就曾經掉進去過,爬了好一會才上岸。
最後一個問題,就是當你有多臺機器的時候,要修改一個配置,每一臺都得去操作一遍,運維成本可想而知,極其蛋疼。
配置檔案
Spring 中常見的 properties、yml 檔案,或其他自定義的,如,“conf”字尾等:
# application.propertiesconnectTimeoutInMills=5000
相比“硬編碼”的形式,它解決了第二個問題,持久化了配置。但是,另外兩個問題並沒有解決,運維成本依舊還是很高的。
配置動態變更,可以是透過類似“硬編碼”暴露管理介面的方式,這時,程式碼中會多一步持久化新配置到檔案的邏輯。或者,簡單粗暴點,直接登入機器上去修改配置檔案,再重啟應用,讓配置生效。當然,你也可以在程式碼中增加一個定時任務,如每隔 10s 讀取配置檔案內容,讓最新的配置能夠及時在應用中生效,這樣也就免去了重啟應用這個“較重”的運維操作。
透過增加“持久化邏輯”、“定時任務”讓“配置檔案”的形式比“硬編碼”前進了一小步。
DB 配置表
這裡的 DB 可以是 MySQL 等的關係型資料庫,也可以是 Redis 等的非關係型資料庫。資料表如:
CREATE TABLE `config` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `key` varchar(50) NOT NULL DEFAULT '' COMMENT '配置項', `value` varchar(50) NOT NULL DEFAULT '' COMMENT '配置內容', `updated_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `created_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `idx_key` (`key`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='配置資訊';INSERT INTO `config` (`key`, `value`, `updated_time`, `created_time`) VALUES ('connectTimeoutInMills', '5000', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP);
它相對於前兩者,更進一步,將配置從應用中抽離出來,集中管理,能較大的降低運維成本。
那麼,它能怎麼解決動態更新配置的問題呢?據我所知,有兩種方式。
其一,如同之前一樣,透過暴露管理介面去解決,當然,也一樣得增加持久化的邏輯,只不過,之前是寫檔案,現在是將最新配置寫入資料庫。不過,程式中還需要有定時從資料庫讀取最新配置的任務,這樣,才能做到只需呼叫其中一臺機器的管理配置介面,就能把最新的配置下發到整個應用叢集所有的機器上,真正達到降低運維成本的目的。
其二,直接修改資料庫,程式中透過定時任務從資料庫讀取最新的配置內容。
“DB 配置表”的形式解決了主要的問題,但是它不夠優雅,帶來了一些“累贅”。
Nacos 配置管理
Nacos 真正將配置從應用中剝離出來,統一管理,優雅的解決了配置的動態變更、持久化、運維成本等問題。
應用自身既不需要去新增管理配置介面,也不需要自己去實現配置的持久化,更不需要引入“定時任務”以便降低運維成本。Nacos 提供的配置管理功能,將配置相關的所有邏輯都收攏,並且提供簡單易用的 SDK,讓應用的配置可以非常方便被 Nacos 管理起來。
如果是在 Spring 中使用 Nacos,只需三個步驟即可:
-
新增依賴
<dependency> <groupId>com.alibaba.nacos</groupId> <artifactId>nacos-spring-context</artifactId> <version>${latest.version}</version> </dependency>
-
新增
@EnableNacosConfig
註解啟用 Nacos Spring 的配置管理服務。以下示例中,我們使用@NacosPropertySource
載入了dataId
為example
的配置源,並開啟自動更新:
@Configuration @EnableNacosConfig(globalProperties = @NacosProperties(serverAddr = "127.0.0.1:8848")) @NacosPropertySource(dataId = "example", autoRefreshed = true) public class NacosConfiguration { }
-
透過 Spring 的
@Value
註解設定屬性值。
注意:需要同時有
Setter
方法才能在配置變更的時候自動更新。
public class AppConfig { @Value("${connectTimeoutInMills:5000}") private int connectTimeoutInMills; public int getConnectTimeoutInMills() { return connectTimeoutInMills; } public void setConnectTimeoutInMills(int connectTimeoutInMills) { this.connectTimeoutInMills = connectTimeoutInMills; } }
以上的三個步驟,對應用本身幾乎沒有任何的侵入,1 個依賴 2 註解,寥寥數行,就把配置透過 Nacos 管理起來了。
關於配置的動態更新,對 Nacos Spring 的使用者來說,在自身應用中就只是設定 “autoRefreshed” 的一個布林值。然後在需要修改配置的時候,呼叫 Nacos 修改配置的介面,或使用 Nacos 的控制檯去修改,配置發生變更後, Nacos 就會把最新的配置推送到該應用的所有機器上,簡單而高效。
想想之前,為了實現此功能,寫了多少冤枉程式碼,做了多少冤枉的運維工作。要是早一點認識 Nacos,該有多好呀!
總結
本文作為 Nacos 5W1H 系列文章的開篇,從“What” 講述了 Nacos 配置管理能幫我們解決的問題:以簡單、優雅、高效的方式管理配置,實現配置的動態變更,大大降低運維成本,讓開發同學早點下班。
當然,Nacos 的配置管理,不單單隻有上述的那些功能,還有諸如“灰度釋出”、“版本管理”、“快速回滾”、“監聽查詢”、“推送軌跡”、“許可權控制”、“敏感配置(如,資料庫連線配置)的加密儲存”等等,這些有的已經在 Nacos 中開源實現了,有的在 Nacos 配置管理的阿里雲免費產品 中提供了,當然,後續也會慢慢開源到 Nacos 中,敬請期待。
本系列文章,會持續為大家講述 Nacos 的點點滴滴,不單單講述 “Nacos 能幫我們解決什麼問題?”,還會深入原始碼分析“Nacos 是如何做到簡單而強大的?”。同時,如果小夥們有興趣的話,我們還會給大家八卦一下 Nacos 的 稗官野史,關於 Nacos 在阿里內部的歷史,關於 Nacos 服務埠的寓意等等。總之,一句話:我有故事,也有美酒,君還何求?
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31551794/viewspace-2217526/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Service Mesh是什麼,為我們解決了什麼問題?
- 我們希望智慧物聯中臺UCC解決什麼問題
- bang能看過來嗎,幫我解決一個問題麼
- 雲真機可以幫助測試解決什麼問題?
- 從小眾到火爆,圖資料庫能為我們解決什麼問題?資料庫
- 我們在講的 Database Plus,到底能解決什麼樣的問題?Database
- ABI解決什麼問題
- iOS super 關鍵字幫我們做了什麼?iOS
- Nacos 常見問題及解決方法
- ERP系統能夠幫助企業解決什麼問題
- Promise到底解決了什麼問題?Promise
- 什麼是解決問題的能力?
- 我們一直在嘗試解決問題,但是很少有人真正去想一下:什麼是解決方案?
- 老哥們我遇到一個很奇怪的問題 子程式間互相影響。。求幫忙解決
- Spring系列第十篇 primary可以解決什麼問題?Spring
- jive 傳圖片問題,那位老大幫我解決一下
- 企業需要DFSS解決什麼問題?
- ES6解決了什麼問題
- 為什麼想來我們公司工作?- 面試常見問題解析面試
- 批發分銷ERP系統可以幫助企業解決什麼問題?
- 今天幫別人解決一下SAP 問題..呵呵.其實也沒什麼
- 我們常常意識不到問題的存在,直到有人解決了這些問題
- 用shell幫助解決ORA問題
- jboss4和mysql5出現問題,請幫我解決MySql
- RAG能解決大模型的什麼問題?不能解決什麼問題?大模型
- 大資料:它是什麼?它能幫助我們什麼?大資料
- 為什麼我們啟用HTTP/2時發生問題? - LucidchartHTTP
- 軟體測試缺乏配置管理的問題解決方法
- Akka 系列(六):Actor 解決了什麼問題?
- Akka系列(六):Actor解決了什麼問題?
- 簡單瞭解下JMM解決什麼問題
- SpringCloud 配置管理:NacosSpringGCCloud
- SoundSource5幫你解決音量問題
- 自己練習寫一個論壇時遇到問題幫我解決了吧
- 解決問題oracle學習篇Oracle
- 區塊鏈技術在解決什麼問題?區塊鏈
- 六西格瑪解決問題的思路是什麼?
- DFSS能為天津企業解決什麼問題?