微服務(wù), "spring cloud", "spring boot", "YAML", "application.yml"
微服務(wù)配置 springboot配置 配置模版化 配置外置
概述
- 即便是復(fù)雜的微服務(wù)工程尔觉,也離不開 DAO升略,SERVICE,API這些基礎(chǔ)層級(jí)迅皇。
問題
-
構(gòu)建一個(gè)微服務(wù)項(xiàng)目xxx-service,基礎(chǔ)項(xiàng)目層級(jí)可能如下,
xxx-service // 這里common中的內(nèi)容全部為module,為其他服務(wù)提供必要依賴 // xxx-web 與xxx-server独榴,xxx-server2s 為兩個(gè)單獨(dú)的微服務(wù),實(shí)際部署時(shí)可能對應(yīng)兩個(gè)獨(dú)立運(yùn)行的進(jìn)程 xxx-common xxx-common-dao xxx--common-config xxx-web[Main] xxx-server[Main] xxx-server2[Main] ....
-
拋開module依賴關(guān)系奕枝,其實(shí)配置也存在一定的依賴關(guān)系括眠,對于單一“微服務(wù)”而言配置可能包含以下幾個(gè)部分內(nèi)容,
- db相關(guān)配置
- 自身相關(guān)配置
- 其他配置
-
每個(gè)服務(wù)都可能包含這三部分倍权,分別寫在自己的 application.yml中,那么我們的項(xiàng)目會(huì)存在三份相同的配置捞烟,無論是開發(fā)還是 實(shí)際部署都會(huì)可能產(chǎn)生問題
- 修改一個(gè)忘記修改另一個(gè)薄声;
- 調(diào)整配置麻煩,每個(gè)都需要去修改
- 開發(fā) & 調(diào)試 困難题画,不容易區(qū)別 local & prod環(huán)境默辨。
當(dāng)然,如果你司有完善的 dev ops苍息, 成套的CICD缩幸,各種統(tǒng)一配置,各種配置中心竞思,那么這些問題也就容易規(guī)避了表谊。
解決
-
問題原因在于配置文件中存在大量重復(fù)的內(nèi)容,就像是把現(xiàn)有的微服務(wù)架構(gòu)層次都放在一個(gè)module了一般盖喷。所以我們的目標(biāo)如下爆办,
- 提煉通用的公共配置,放在一個(gè)文件课梳。
- 散落在每個(gè)module的配置距辆,最好不需要經(jīng)常修改。
- 簡化部署過程中一些問題暮刃。
-
root目錄新增一個(gè)空的config module跨算,整體的服務(wù)結(jié)構(gòu)看起來像是這樣,
xxx-service // 這里common中的內(nèi)容全部為module椭懊,為其他服務(wù)提供必要依賴 // xxx-web 與xxx-server诸蚕,xxx-server2s 為兩個(gè)單獨(dú)的微服務(wù),實(shí)際部署時(shí)可能對應(yīng)兩個(gè)獨(dú)立運(yùn)行的進(jìn)程 xxx-common xxx-common-dao xxx--common-config xxx-web[Main] xxx-server[Main] xxx-server2[Main] xxx-config ....
讓每個(gè)獨(dú)立進(jìn)程的
module
都依賴這個(gè)config module
之前的各類配置,我們提取公共配置挫望。如這里提取出公共的db相關(guān)配置立润,在config module的resource目錄下創(chuàng)建我們的db配置文件 命名為
application-db.yml
,里面放上我們的數(shù)據(jù)庫相關(guān)配置。-
修改獨(dú)立進(jìn)程中的
application.yml
配置媳板,移除這部分公共配置桑腮,并增加對db
這個(gè)配置模塊的依賴.spring: profiles.active: db #與config module中application-后的名稱相同
-
調(diào)整完畢后我們的db配置被提煉到了config這個(gè)module,解決了公共配置問題◎刃遥可能你還有其他公共配置破讨,那么不妨都建成獨(dú)立的模塊,統(tǒng)一放置在config中奕纫,然后在獨(dú)立進(jìn)程module中引入他們,例如提陶,
#xxx-config/src/main/resources application-db.yml application-security.yml application-swagger.yml
spring: profiles.active: db,security,swagger #引入所有的配置
-
也可以把 各個(gè)獨(dú)立進(jìn)程的 module的 自定義配置也作為一個(gè)單獨(dú)的模塊放置在config module中,這樣匹层,實(shí)際部署過程中隙笆,可以把所有module的配置文件放在一起。最終的配置可能像是這樣升筏。
#xxx-config/src/main/resources application-db.yml application-security.yml application-swagger.yml application-web.yml application-server.yml application-server2.yml
xxx-web:application.yml
spring: profiles.active: db,security,swagger,web #引入所有的配置及自己的配置
xxx-server:application.yml
spring: profiles.active: db,security,swagger,server #引入所有的配置及自己的配置
xxx-server2:application.yml
spring: profiles.active: db,security,swagger,server2 #引入所有的配置及自己的配置
-
springboot配置文件外置撑柔,可以通過兩種方式
- jar包同級(jí)目錄創(chuàng)建名為
config
的文件夾,里面放置配置文件(無需額外增加其他配置您访,自動(dòng)讀取) -
jar -jar -Dloader.path=<配置文件存放目錄路徑>
铅忿,運(yùn)行時(shí)增加參數(shù)指定配置文件路徑。
- jar包同級(jí)目錄創(chuàng)建名為
實(shí)際的微服務(wù)部署中灵汪,我們可能會(huì)將所有的 獨(dú)立進(jìn)程 module的 jar包放在同一個(gè)文件夾發(fā)布檀训,使用不同的腳本去啟動(dòng)不同的微服務(wù),那么配置方面就可以通過將config目錄的所有配置文件外置即可享言,這樣峻凫,ji提煉了公共配置,又區(qū)別了每個(gè)服務(wù)的各自的配置览露,豈不妙乎蔚晨。
附錄
多module打包后拷貝至外側(cè)文件夾。
- 例如這里的xxx-web/pom.xml ."INSTALL"后拷貝至外側(cè)的dist目錄
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.8</version>
<executions>
<execution>
<phase>install</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
<echo>COPY artifact.</echo>
<copy file="target/${project.artifactId}-${project.version}.jar" tofile="../dist/${project.artifactId}-${project.version}.jar"/>
</tasks>
</configuration>
</execution>
</executions>
</plugin>
config module配置文件拷貝
- 也拷貝至外側(cè)的
dist
目錄肛循。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.8</version>
<executions>
<execution>
<phase>install</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
<echo>COPY Config.</echo>
<copy file="target/classes/prod/application-db.yml" tofile="../dist/config/application-db.yml"/>
</tasks>
</configuration>
</execution>
</executions>
</plugin>
這樣是不是只發(fā)布dist目錄就好啦铭腕?吼方便的。