一千萬個為什麽

搜索

我應該在哪裏放置應用程序配置?



最近我一直在閱讀關於“應該在哪裏存儲依賴於環境的屬性的問題”的辯論“。

傳統的方法是有多個屬性文件,一個是環境文件,另一個是基於環境變量(DEV,PROD ...),當你選擇啟動應用程序時(比如Spring配置文件),你可以選擇讀取它們。

另一方面,如果您使用容器來部署應用程序,則說這種配置應該來自環境本身(使用應用程序讀取的環境變量),因此映像在環境之間不會更改。

每種方法的優點和缺點是什麽?容器方案是否有“最佳”方法?

轉載註明原文: 我應該在哪裏放置應用程序配置?

一共有 2 個回答:

誰說屬性文件和環境變量相互排斥?

“我在哪裏存儲我的應用配置?”之間有區別。而且“我的應用程序它是什麽配置?”

最可能的結果是每個人都應該繼續按照存儲機制的方式繼續處理配置文件(認為只要環境具有長期的持久狀態存在)。

但是,並不是將該配置文件放到應用程序上下文中,而是讓它運行該應用程序應該能夠期望這些變量在啟動時已經在環境中可用。

這意味著您需要有兩個部署工作流程 -

  1. 我可以將應用程序部署到環境中,方法是通過X更改控制過程並使用Z工具進行Y評論,無論如何。
  2. 我將環境配置部署到環境中,方法是通過一個變更控制流程,並使用C工具,相同流程和不同結果進行B審核。

要使用一個管理環境變量作為例如consul這樣的工具中的Key Value對的例子,如果你正在將配置文件存儲在git中,那麽git2consul等工具會在配置文件更新時將該配置存入環境中。

如果您的應用程序期望將配置作為配置文件提供,那麽您可以避免將配置文件的多個副本與應用程序一起發布,方法是使用像consul-template這樣的能夠將您的領事重新回到一個文件中。

我們這樣做的方式是每個正在運行的應用程序都有3個部分(或工件)。

  1. 我們正在開發的應用程序。無論環境如何,這都是一樣的。為了匹配你的例子,這將是Spring應用程序的jar/war。
  2. 將運行應用程序的容器。無論環境如何,這都是一樣的。如果使用Spring Boot,則不再需要Tomcat,而只需要Java運行時。因此,請使用openjdk Docker容器。
  3. 應用程序需要的配置。這是唯一不同的環境。在Spring應用程序中,您可能會使用屬性文件。

配置文件位於單獨的源代碼管理中。這曾經是Git,但我們現在使用我們構建的名為Config的SaaS,位於 http://www.configapp.com 。 Config的核心功能是輕松處理特定於環境的配置。要在新服務器上運行我們的應用程序,我們需要為該環境提供Docker容器,應用程序工件和配置文件。在容器中,我們安裝存儲應用程序和配置文件的目錄,作為容器運行的一部分。我們的應用程序是相同的。我們的容器/圖像是一樣的。只有配置文件不同。

關於配置文件與環境變量。我們使用配置文件的時間最長。當我們使用PaaS /雲時,我們使用了環境變量。如果你有很多的配置,這是額外的工作,所以我們最終使用環境變量來確定正確的配置文件。我們有一個應用程序將屬性轉換為環境變量,但這是非典型的。如果我們有一個公司認可的集中配置服務器,那麽我們使用它,否則我們喜歡簡單的配置文件。

總結一下,我們拉app.jar,app.properties,openjdk Docker。然後,我們運行openjdk Docker,安裝app.jar和app.properties的位置。具體唯一的環境是app.properties。為了輕松管理app.properties,無論有多少屬性鍵,環境,集群/區域實例,我們都使用Config。