天天看點

分布式系統中處理參數配置的 4 種方案

一個系統中包含有各種各樣的配置資訊,如一個日志檔案需要配置以下幾個資訊。

日志檔案生成主目錄

日志檔案名稱,不同的日志級别對應不同的檔案

目前日志級别

還有其他各種業務參數、系統參數等,大多單一系統是直接把這些配置寫死在配置檔案中,當部署到測試、生産環境就再修改下配置檔案,這樣很容易出錯,也不能靈活修改。還有就是系統變成分布式系統後,子系統越來越多,你要維護這些配置就變得越來越困難。

我覺得至少要能解決以下幾個問題才能算優秀!

1)能線上靈活修改配置

2)能線上動态重新整理配置

3)能根據不同環境配置

4)能統一管理維護配置

那麼如何靈活維護這些配置呢?我給大家總結了一下幾類方法,根據不同的應用場大家參考一下。

1、資料庫法

把所有參數存儲到資料庫,系統啟動的時候加載到記憶體。

這種實作方式比較簡單,但需要占用資料庫資源,系統簡單壓力較小時可以選用此種方式。

2、打包處理法

利用 Maven 的 maven-resources-plugin 插件,然後根據不同的環境(Profile)提供不同環境的配置檔案,這樣,不同環境的配置資訊在打包階段就決定好了。

這樣隻能解決了不同作業系統上面的配置,不能靈活動态修改,每次更新隻能重新打包或者線上修改配置檔案,而且資訊也難于同步,如果項目少還好,項目多起來,配置還要經常變動,這樣變得異常煩瑣。

3、環境變量法

可以把屬性值設定到環境變量中,然後讀取後設定到 Java 系統屬性中。這種可以實作區分不同環境的目的,但仍然不能動态更新配置,而且配置和維護環境變量相當麻煩,并且在分布式系統中更是個十分頭疼的問題。

// 讀取環境變量
java.lang.System#getenv(java.lang.String)

// 設定系統屬性
java.lang.System#setProperty
      

這種方法,一些全局的系統配置,如日志、緩存、臨時目錄等可以參考,主流日志系統都支援從 system properties 中讀取配置。其他一些配置,不建議存儲在環境變量中。

4、配置中心法

1)目前大多數分布式配置中心都是基于 Zookeeper 來實作的,Spring Cloud 有自己的配置中心元件,它們都支援線上動态更新和重新整理配置。

2)直接把配置存放在資料庫,如果系統并發小的或者管理類系統的話可以參考,對于高并發應用不建議用資料庫做配置中心,畢竟它會帶來通路壓力,而且實作動态更新配置也比較複雜。

總結

這是我們目前應用的 4 種配置方法,很顯然,配置中心是最佳的解決方案,也解決了以上的幾個問題,但需要依賴中間件及其高可用性,如果你有其他更好的方式,歡迎留言。