一文捋清項(xiàng)目里的各種配置,看了必懂!
點(diǎn)擊關(guān)注公眾號,Java干貨及時送達(dá)
來源:https://lepdou.github.io/blogs/config/config.html
引言
項(xiàng)目開發(fā)中總是有各種各樣的配置,對于程序開發(fā)新手來說,配置是擺在面前的第一座大山?;叵氘?dāng)年在學(xué)校學(xué)習(xí)經(jīng)典的“SSH”的時候,一個web.xml配置都是異常的艱辛。工作多年的你,對配置真的了解嗎?
什么是配置?
首先我們來看一下配置文件的定義:
“A software file used to configure the initial settings for a computer program.” -- From wikipedia
配置來源可能有以下這些:
硬編碼參數(shù) 項(xiàng)目里的配置文件 文件系統(tǒng)上的配置文件 網(wǎng)絡(luò)上的配置文件 啟動參數(shù)(JVM屬性) 操作系統(tǒng)參數(shù)

下面會詳細(xì)介紹每一種配置類型的使用場景。
硬編碼參數(shù)
最常見的就是定義靜態(tài)變量方式。例如:public static final int PAGE_SIZE = 10;另外就是通過框架暴露的各種API接口設(shè)置參數(shù)。
優(yōu)點(diǎn)
這種是最簡單、成本最低的方式 不用額外創(chuàng)建文件 代碼里能直接能讀取 離配置使用地方最近的一種方式
缺點(diǎn)
代碼和配置糅合在一起,不易于維護(hù) 修改配置必須修改源代碼,重新編譯、打包、上線 同一個框架的配置散落到項(xiàng)目各個角度,不利于查找
適用場景
Hard Code 適用于配置極其簡單且?guī)缀醪粫兏?/section> 為了賦予常量語義 配置極少從而創(chuàng)建配置文件成本高
項(xiàng)目里配置文件
這種方式是最常見的。標(biāo)準(zhǔn)的maven項(xiàng)目有一個resources目錄就是用來放置各種類型的配置文件,例如:
web項(xiàng)目的web.xml log框架的配置 spring的bean定義的xml文件 mybatis的sql配置文件 spring boot的application.yml application.properties 自定義的properties文件
另外maven項(xiàng)目的核心pom.xml也算是配置文件。項(xiàng)目里使用到的各種各樣的框架、中間件基本上都需要配置文件來支撐??蚣茉谶\(yùn)行時,讀取配置文件來決定運(yùn)行時的行為。另外,Maven 系列教程全部整理好了,微信搜索關(guān)注公眾號:Java技術(shù)棧,在菜單欄中閱讀。
優(yōu)點(diǎn)
缺點(diǎn)
適用場景
文件系統(tǒng)上的配置文件
另外一種使用比較多的場景是應(yīng)用直接讀取文件系統(tǒng)上的某個文件。這種方式的好處就是可以動態(tài)更新配置,無需重新編譯、打包、運(yùn)行應(yīng)用。
優(yōu)點(diǎn)
缺點(diǎn)
適用場景
筆者遇到過一個dal框架,datasource配置文件就是放在文件系統(tǒng)上,結(jié)果開發(fā)人員在上線時,忘記在機(jī)器上放置這個文件導(dǎo)致線上bug。
點(diǎn)擊關(guān)注公眾號,Java干貨及時送達(dá)
網(wǎng)絡(luò)上的配置文件
常見的包括兩種:DB上的配置表、配置中心。如果公司沒有統(tǒng)一的配置中心,那么最簡單的動態(tài)修改配置的方式莫過于把配置放置在DB上。相信大部分的開發(fā)都使用過或者遇到過。
配置中心是最適合集中化管理配置、動態(tài)修改配置的地方。常見的配置中心都會提供管理配置后臺、實(shí)時推送配置、分環(huán)境管理配置、配置版本管理等。筆者目前就在開發(fā)一款開源的配置中心系統(tǒng)。
優(yōu)點(diǎn)
集中管理配置、全方位管理配置 動態(tài)修改配置、實(shí)時推送、更新配置 配置更加靈活,例如可以分環(huán)境、集群以及灰度發(fā)布等
缺點(diǎn)
需要依賴數(shù)據(jù)庫或者配置中心,成本高
適用場景
經(jīng)常需要變更的配置 配置值每個環(huán)境不一致 不希望配置值隨著代碼一起發(fā)布,例如開源項(xiàng)目中的某些配置
啟動參數(shù)(JVM屬性)
JVM屬性主要是應(yīng)用運(yùn)行的JVM進(jìn)程相關(guān)的屬性,比如java.class.version、java.class.path等Java相關(guān)的參數(shù)。在代碼里,可以通過System.getProperty()獲取參數(shù)值。另外,可以通過在啟動時指定-D參數(shù)來設(shè)置JVM屬性。最常見的使用場景是用來解決不同環(huán)境需要配置不同的參數(shù)。
最新 JVM 面試題整理好了,點(diǎn)擊Java面試庫小程序在線刷題。
例如作為中間件,依賴的外部系統(tǒng)越少越好,如果不依賴配置中心,那么就可以通過這種方式來實(shí)現(xiàn)不同環(huán)境配置不同的參數(shù),例如每個環(huán)境的數(shù)據(jù)庫連接串不一樣。另外需要提到的是maven打包參數(shù)。
相比于-D運(yùn)行時參數(shù),maven打包參數(shù)是在編譯時設(shè)置配置屬性,maven會獲取打包參數(shù)然后替換掉配置文件里的placeholder。假設(shè)一個可運(yùn)行的jar包,只需要在打包的時候傳入?yún)?shù)值,打出來的jar包就可以到處運(yùn)行了,如果不這么做,那么需要每次運(yùn)行的時候指定參數(shù),成本太高。使用方式則是在mvn package 時指定-D參數(shù)。新手很容易混淆這兩種參數(shù)。換個角度看-D是命令行參數(shù)。
優(yōu)點(diǎn)
以非常小的代價就可以達(dá)到運(yùn)行時指定特殊參數(shù)值
缺點(diǎn)
啟動運(yùn)行項(xiàng)目需要設(shè)置啟動參數(shù),增加使用成本
適用場景
適合中間件類系統(tǒng),不推薦業(yè)務(wù)系統(tǒng)使用(業(yè)務(wù)系統(tǒng)用配置中心解決此類場景) 增加統(tǒng)一運(yùn)維成本
操作系統(tǒng)參數(shù)
操作系統(tǒng)參數(shù)一般是只讀的,當(dāng)然也可以設(shè)置。例如前面提到的server.properties文件里的env參數(shù),其實(shí)也可以作為系統(tǒng)參數(shù),但是不建議這么做。
另外,Java 系列面試題和答案全部整理好了,微信搜索Java技術(shù)棧,在后臺發(fā)送:面試,可以在線閱讀。
后記
配置的好處顯而易見,但是我們在工作中經(jīng)常會遇到這種情況。拿到一個項(xiàng)目,看到亂七八糟的配置無從下手,項(xiàng)目中使用的框架、中間件配置風(fēng)格更不相同,更頭疼的是配置項(xiàng)如果不了解框架的基礎(chǔ)上很難理解。
導(dǎo)致的結(jié)果就是如果不復(fù)制、粘貼配置,手寫配置基本上很難寫對。驗(yàn)證這種情況最簡單的方式就是不復(fù)制其它項(xiàng)目的配置,手動搭建一個新項(xiàng)目。我相信絕大多數(shù)的人都難以做到。
片面的說學(xué)習(xí)一個框架其實(shí)是在學(xué)習(xí)這個框架的API和配置參數(shù)。如果你非常熟悉一個框架的配置,那么你對框架的使用就得心應(yīng)手了。當(dāng)然,知道框架的原理也非常重要。說這么多,只想說明項(xiàng)目的配置真的非常重要,更好的管理、規(guī)范配置更加重要。
對于框架、中間件開發(fā)者來說,配置應(yīng)該越少越好,增加一個配置對于使用者使用成本就會大大提高。如果配置很多,那么你的框架基本上就是很難用了。Spring一直是Java界最權(quán)威的框架體系,最新的Spring Boot框架的配置就非常少,一眼看上去非常舒心。
推薦一個 Spring Boot 基礎(chǔ)教程及實(shí)戰(zhàn)示例:
https://github.com/javastacks/spring-boot-best-practice
Spring現(xiàn)在倡導(dǎo)減少配置文件,例如Spring早期版本的xml配置其實(shí)是很繁瑣的。新的Spring更多的配置放置在代碼中,利用注解以及API方式配置。Servlet最新版本也不需要web.xml文件了。
說明一個道理: 大道至簡?

關(guān)注Java技術(shù)??锤喔韶?/strong>


