Spring Boot - 多模組多環境配置,大廠必備技能

劉忠旭發表於2020-10-30

小夥伴們在初入職場(尤其大廠)看到別人的工程,是否曾有如下困擾:

  • 在一個工程裡面如何實現多模組,分模組開發怎麼搞?
  • 公司那麼多環境,互相隔離,配置各不相同,如何實現多環境?

反觀自己建立的工程,程式碼都堆在一個模組裡面,或許還不清楚模組的概念;更別提多環境了;

今天我們一文搞定,讓我們離大廠更近一步。

多模組

模組

模組化程式設計中,開發者將程式分解成離散功能塊(discrete chunks of functionality),並稱之為模組。

多模組的優點

每個模組具高內聚的特性,使得校驗、除錯、測試輕而易舉。 精心編寫的模組提供了可靠的抽象和封裝界限,使得每個模組都具有條理清楚的設計和明確的目的。

實現多模組

  1. 建立maven工程
  2. 配置多模組
  3. 新增模組依賴
建立maven工程

image
image
image

配置多模組

在pom中,增加modules節點,模組名<module>任意名稱</module>,可以配置多個;

<modules>
 <module>seckill-api</module>
 <module>seckill-biz</module>
</modules>

image

通常到這裡,多模組就配置完畢了。但現實中,我們的模組間是需要相互依賴的,同時每個模組還要依賴第三方模組;

新增模組依賴

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>

到這裡,配置完成;(是不是很清晰,請投幣,點贊)
image
還可以用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

多環境

在工作中,我們面臨開發、測試、生產等等多個環境,要完美實現多環境,總共可以分文兩個大的步驟;

  • 在工程中支援多環境配置;
  • 在真實環境中實現多環境啟動;

支援多環境配置

  1. 建立properties檔案
  2. 指定環境引數
建立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部分。

  • 基礎篇重點在於實現功能(導購、交易)
  • 進階篇重點突破超賣、突發流量給系統帶來的挑戰,高併發銀彈,快取如何使用;
  • 架構篇重點講解如何保障系統高可用(方法論+最佳實踐)

通過秒殺這個典型的高併發場景,帶你徹底搞明白高併發系統該如何設計。

相關文章