Spring Boot - 多模塊多環境配置,大廠必備技能
小伙伴們在初入職場(尤其大廠)看到別人的工程,是否曾有如下困擾:
- 在一個工程里面如何實現多模塊,分模塊開發怎么搞?
- 公司那么多環境,互相隔離,配置各不相同,如何實現多環境?
反觀自己創建的工程,代碼都堆在一個模塊里面,或許還不清楚模塊的概念;更別提多環境了;
今天我們一文搞定,讓我們離大廠更近一步。
多模塊
模塊
在模塊化編程中,開發者將程序分解成離散功能塊(discrete chunks of functionality),并稱之為模塊。
多模塊的優點
每個模塊具高內聚的特性,使得校驗、調試、測試輕而易舉。 精心編寫的模塊提供了可靠的抽象和封裝界限,使得每個模塊都具有條理清楚的設計和明確的目的。
實現多模塊
- 創建maven工程
- 配置多模塊
- 添加模塊依賴
創建maven工程
配置多模塊
在pom中,增加modules節點,模塊名<module>任意名稱</module>,可以配置多個;
- <modules>
- <module>seckill-api</module>
- <module>seckill-biz</module>
- </modules>
通常到這里,多模塊就配置完畢了。但現實中,我們的模塊間是需要相互依賴的,同時每個模塊還要依賴第三方模塊;
添加模塊依賴
seckill-api(api層)要依賴seckill-biz(業務層),在api模塊的pom文件中,增加如下配置
- <dependencies>
- <dependency>
- <groupId>com.sifou.courses</groupId>
- <artifactId>seckill-biz</artifactId>
- <version>1.0-SNAPSHOT</version>
- </dependency>
- </dependencies>
假定,api和biz模塊都依賴lombok,validation-api這兩個第三方模塊(包),如何實現?
- 方案1:在每個(biz & api)模塊中,增加依賴;
- 方案2:在父模塊增加依賴;
相信大家都會選擇方案2;在root工程中的pom文件,增加如下配置;
- <properties>
- <lombok.version>1.18.8</lombok.version>
- <javax.validation>2.0.1.Final</javax.validation>
- </properties>
- <dependencies>
- <dependency>
- <groupId>org.projectlombok</groupId>
- <artifactId>lombok</artifactId>
- <version>${lombok.version}</version>
- </dependency>
- <dependency>
- <groupId>javax.validation</groupId>
- <artifactId>validation-api</artifactId>
- <version>${javax.validation}</version>
- </dependency>
- </dependencies>
到這里,配置完成;(是不是很清晰,請投幣,點贊)
還可以用mvn dependency:tree命令,來查看依賴關系(必備核心技能,解決包沖突,解決包版本失效)
- [INFO] Scanning for projects...
- [INFO] ------------------------------------------------------------------------
- [INFO] Reactor Build Order:
- [INFO]
- [INFO] com.sifou.courses.seckill
- [INFO] seckill-biz
- [INFO] seckill-api
- [INFO]
- [INFO] ------------------------------------------------------------------------
- [INFO] Building com.sifou.courses.seckill 1.0-SNAPSHOT
- [INFO] ------------------------------------------------------------------------
- [INFO]
- [INFO] --- maven-dependency-plugin:3.1.2:tree (default-cli) @ com.sifou.courses.seckill ---
- [INFO] com.sifou.courses:com.sifou.courses.seckill:pom:1.0-SNAPSHOT
- [INFO] +- org.projectlombok:lombok:jar:1.18.8:compile
- [INFO] \- javax.validation:validation-api:jar:2.0.1.Final:compile
- [INFO]
- [INFO] ------------------------------------------------------------------------
- [INFO] Building seckill-biz 1.0-SNAPSHOT
- [INFO] ------------------------------------------------------------------------
- [INFO]
- [INFO] --- maven-dependency-plugin:3.1.2:tree (default-cli) @ seckill-biz ---
- [INFO] com.sifou.courses:seckill-biz:jar:1.0-SNAPSHOT
- [INFO] +- org.projectlombok:lombok:jar:1.18.8:compile
- [INFO] \- javax.validation:validation-api:jar:2.0.1.Final:compile
- [INFO]
- [INFO] ------------------------------------------------------------------------
- [INFO] Building seckill-api 1.0-SNAPSHOT
- [INFO] ------------------------------------------------------------------------
- [INFO]
- [INFO] --- maven-dependency-plugin:3.1.2:tree (default-cli) @ seckill-api ---
- [INFO] com.sifou.courses:seckill-api:jar:1.0-SNAPSHOT
- [INFO] +- com.sifou.courses:seckill-biz:jar:1.0-SNAPSHOT:compile
- [INFO] +- org.projectlombok:lombok:jar:1.18.8:compile
- [INFO] \- javax.validation:validation-api:jar:2.0.1.Final:compile
- [INFO] ------------------------------------------------------------------------
- [INFO] Reactor Summary:
- [INFO]
- [INFO] com.sifou.courses.seckill .......................... SUCCESS [ 1.007 s]
- [INFO] seckill-biz ........................................ SUCCESS [ 0.040 s]
- [INFO] seckill-api ........................................ SUCCESS [ 0.036 s]
- [INFO] ------------------------------------------------------------------------
- [INFO] BUILD SUCCESS
- [INFO] ------------------------------------------------------------------------
- [INFO] Total time: 1.862 s
- [INFO] Finished at: 2020-10-29T23:18:09+08:00
- [INFO] Final Memory: 27M/230M
- [INFO] ------------------------------------------------------------------------
- Process finished with exit code 0
多環境
在工作中,我們面臨開發、測試、生產等等多個環境,要完美實現多環境,總共可以分文兩個大的步驟;
- 在工程中支持多環境配置;
- 在真實環境中實現多環境啟動;
支持多環境配置
- 創建properties文件
- 指定環境參數
創建properties文件
在resources文件夾下創建三個以properties為后綴的文件
例如:
application-dev.properties:開發環境
application-test.properties:測試環境
application-prod.properties:生產環境
指定環境參數
spring.profiles.active=test
到這里,多環境配置完成;
在Spring Boot中多環境配置文件名必須滿足:application-{profile}.properties的固定格式,其中{profile}對應你的環境標識;
例如:
application-dev.properties:開發環境
application-test.properties:測試環境
application-prod.properties:生產環境
application.properyies通過spring.profiles.active來具體激活一個或者多個配置文件,如果沒有指定任何profile的配置文件的話,spring boot默認會啟動application-default.properties;而哪個配置文件運行:
spring.profiles.active=test
就會加載application-test.properties配置文件內容
多環境啟動
剛剛講了在工程中如何配置,那么在真正的環境中如何啟動?莫非,改配置嗎???當然不是,正解如下。
- -Dspring.profiles.active=${PROFILE}
在啟動腳本中,增加上面這個,按環境來指定要加載的配置文件;
以上,歡迎大家多交流。
最后
我在思否開了一門《大廠電商 Java 秒殺系統架構實戰》課程,本課程從秒殺場景出發,分為基礎篇、進階篇、架構篇3部分。
- 基礎篇重點在于實現功能(導購、交易)
- 進階篇重點突破超賣、突發流量給系統帶來的挑戰,高并發銀彈,緩存如何使用;
- 架構篇重點講解如何保障系統高可用(方法論+最佳實踐)
通過秒殺這個典型的高并發場景,帶你徹底搞明白高并發系統該如何設計。