首頁>技術>

目錄前言專案規劃問題配置子專案spring.profiles.include配置檔案目錄多環境目錄多環境配置問題總結前言

我們在日常開發過程中,在新建一個專案中,我們經常會將一個專案按照功能性、模組等將一個專案分成多個子專案,這些子專案都包含在主專案中。

今天老顧就介紹企業應用中,分散式專案如何將配置分為開發環境、測試環境、預演環境、生產環境,對於不同的環境引數配置,如何處理?以及如何規劃配置檔案?

專案規劃

如一個電商系統,內部的核心繫統架構,如下圖

專案架構如下圖

問題

在整個系統中,我們會配置資料庫源的相關配置,如:

#============資料來源配置================spring: datasource: url: jdbc:mysql://127.0.0.1:3306/shop username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver

還有dubbo微服務註冊中心地址

dubbo: registry: address: spring-cloud://127.0.0.1

上面的註冊中心採用的是springcloud alibaba的nacos註冊中心,這個不是重點

因為整個系統中有很多微服務,都要用到資料來源和註冊中心地址;那通常做法就是把各個服務application.yml中進行配置,如:

業務邏輯專案rb-business也會在它的application.yml中也會用到註冊中心地址。

那問題來了:

這麼多子專案中各自都配置了資料來源以及註冊中心,顯然不合理;萬一地址變了,那所有的子專案都要進行更改

那這麼進行修改呢?

配置子專案

怎麼解決上面的問題?就是再新建一個公共配置的子專案,把公共的配置放在配置子專案中,然後其他子專案引用這個公共配置子專案

我們可以把資料庫配置,redis配置引數、oss、sms等共同需要的配置寫在裡面,我們觀察一些配置檔案的名字的命名方式application-xxx.properties(也可以yml格式);這個必須要準守,因為我們要利用一下springboot的機制。繼續往下看。

spring.profiles.include

小夥伴有沒有見過profiles.include呢?好像一直在用profiles.active。

SpringBoot能使用application- {你的自定義profile名稱myProfileName} .properties模式新增任何你指定配置檔案到其屬性檔案。

要載入特定的配置檔案屬性檔案,我們可以使用命令列選項-Dspring.profiles.active = myProfileName。

預設預設SpringBoot是載入application.properties,無需任何-Dspring.profile.active選項。

或使用-Dspring.profiles.active = default來載入。預設屬性檔案也可以命名為application-default.properties。

預設配置檔案application.properties中指定的任何屬性將被你指定載入的配置檔案中的的屬性覆蓋。

也可以在application.properties中指定啟用配置檔案。

spring.profiles.active=prod

比如你有三個配置檔案:

src/main/resources/application.properties(預設的)src/main/resources/application-dev.properties(你指定的dev)src/main/resources/application-prod.properties(你指定的prod)

如果在application.properties中有:

spring.profiles.active=prod

那麼SpringBoot將載入application-prod.properties內容。

如果你在程式碼中使用配置檔案中的變數:

@Configurationpublic class UserBean { @Value("${app.name}") private String name; @Value("${app.age}") private int age;

如果application-prod.properties和application.properties都有app.name和app.age,那麼以prod中配置的值為主。

spring.profile.include屬性

在application-prod.properties還可以加入

spring.profiles.include=redis,db

這是無條件地新增活動配置檔案(以逗號分隔)。此屬性新增的配置檔案不會根據某些條件或命令列開關決定是否新增,而是始終無條件新增它們。

上述配置是就載入了:

src/main/resources/application-redis.propertiessrc/main/resources/application-db.properties

這兩個配置檔案中的內容。即使這些檔案在其他子專案resources中,也可以被載入

我們只需要在rb-user-server、rb-goods-server等引用專案中引用rb-common-config這個子專案。並且在專案中的application.yml配置檔案中,加入

spring: profiles: include: - redis - db - nacos

就可以引用rb-common-config中的配置檔案了。

有些細心的小朋友會問,那個rb-common-config專案的配置檔案是在resources目錄下的config資料夾下的哦,怎麼也會載入呢?

配置檔案目錄

SpringBoot配置檔案可以放置在多種路徑下,不同路徑下的配置優先順序有所不同。

可放置目錄(優先順序從高到低)

file:./config/ (當前專案路徑config目錄下);

file:./ (當前專案路徑下);

classpath:/config/ (類路徑config目錄下);

classpath:/ (類路徑config下).

優先順序由高到底,高優先順序的配置會覆蓋低優先順序的配置;

SpringBoot會從這四個位置全部載入配置檔案並互補配置;

我們可以從ConfigFileApplicationListener這類便可看出,其中DEFAULT_SEARCH_LOCATIONS屬性設定了載入的目錄:

所以之前的配置檔案在config目錄中也照樣有效,而且優先順序高一級哦。

到這裡為止,我們很好的把公共的配置項,轉移到子專案rb-common-config檔案下了,其中的關鍵點就是,在引用專案加入spring.profiles.include配置

多環境配置

在開發過程中,我們都會區分開發環境,測試環境,預演環境,生產環境等;不同環境的配置引數是不一樣的。分散式專案中如何應用呢?

網上大多數介紹是針對單個專案工程的,利用上面介紹的spring.profiles.active配置來進行區分不同的環境

src/main/resources/application.properties(預設的)src/main/resources/application-dev.properties(開發環境)src/main/resources/application-prod.properties(生產環境)

想要什麼環境,在啟動的時候

java -jar xxx.jar --spring.profiles.active=prod

上面就是應用了生產環境了。

這種方式是否可以應用到分散式多專案中,也是可以的,我們可以把rb-common-config中也配置多個配置檔案,如:

src/main/resources/config/application-devDB.properties(開發環境)src/main/resources/config/application-devRedis.properties(開發環境)src/main/resources/config/application-prodDB.properties(生產環境)src/main/resources/config/application-prodRedis.properties(生產環境)

然後在引用專案中如rb-user-server中

application-dev.properties加入

spring.profiles.include=devDB,devRedis

application-prod.properties加入

spring.profiles.include=prodDB,prodRedis

啟動rb-user-server.jar

java -jar rb-user-server.jar --spring.profiles.active=prod

這樣就做到了區分多環境的目的。

多環境配置問題總結

在上面的多環境配置中,我們需要在各個專案中,新建多個properties檔案,區分不同的環境,這個是比較麻煩的事情,而且不夠優雅。

遺留問題一:

那有沒有一種方案,不需要建那麼多的配置檔案,每個專案只需要必須的配置檔案就行了呢?

遺留問題二:

上面的方案中,涉及到了開發環境,測試環境,預演環境,生產環境,我們把各自環境的引數配置到各自的配置檔案中。

這裡就出現了安全問題,資料庫的連線地址,使用者名稱與密碼等直接暴露在開發人員面前;開發與測試環境安全要求低,還能接受;但是生產環境的相關伺服器引數直接暴露在開發人員面前,那是很不安全的。那怎麼處理呢?

---End---

最近老顧上傳了微服務閘道器的分享課程,請大家多多支援

推薦閱讀

1、基於RocketMq的SpringCloud Stream框架實戰入門

2、如何搭建訊息中介軟體應用框架之SpringCloud Stream

3、面試必備:閘道器異常了怎麼辦?如何做全域性異常處理?

4、Gateway網關係列(二):SpringCloud Gateway入門實戰,路由規則

5、Gateway網關係列開篇:SpringCloud的官方閘道器Gateway介紹

6、API閘道器在微服務架構中的應用,這一篇就夠了

7、學習Lambda表示式看這篇就夠了,不會讓你失望的哦(續篇)

8、Lambda用在哪裡?幾種場景?

9、為什麼會出現Lambda表示式,你知道嗎?

10、不說“分散式事務”理論,直接上大廠阿里的解決方案,絕對實用

11、女程式設計師問到這個問題,讓我思考了半天,Mysql的“三高”架構

12、大廠二面:CAP原則為什麼只能滿足其中兩項?而不能同時滿足

13、阿里P7二面:聊聊零拷貝的原理

14、秒殺系統的核心點都在這裡,快來取

15、你了解如何利用token方式實現分散式Session嗎?

16、Mysql索引結構演變,為什麼最終會是那個結構呢?讓你一看就懂

17、一場比賽涉及到的知識,用通俗易通的方式介紹併發協調

18、企業實戰Redis全方面思考,你思考了嗎?

19、面試題:Thread的start和run的區別

20、面試題:什麼是CAS?CAS的作用以及缺點

21、如何訪問redis中的海量資料?避免事故產生

22、如何解決Redis熱點問題?以及如何發現熱點?

23、如何設計API介面,實現統一格式返回?

24、你真的知道在生產環境下如何部署tomcat嗎?

25、分享一線網際網路大廠分散式唯一ID設計 之 snowflake方案

26、分享大廠分散式唯一ID設計方案,快來圍觀

27、你想了解一線大廠的分散式唯一ID生成方案嗎?

28、你知道如何處理大資料量嗎?(資料拆分篇)

29、如何永不遷移資料和避免熱點? 根據伺服器指標分配資料量(揭祕篇)

30、你知道怎麼分庫分表嗎?如何做到永不遷移資料和避免熱點嗎?

31、你了解大型網站的頁面靜態化嗎?

32、你知道如何更新快取嗎?如何保證快取和資料庫雙寫一致性?

33、你知道怎麼解決DB讀寫分離,導致資料不一致問題嗎?

34、DB讀寫分離情況下,如何解決快取和資料庫不一致性問題?

35、你真的知道怎麼使用快取嗎?

36、如何利用鎖,防止快取擊穿?重構思想的重要性

37、海量訂單產生的業務高峰期,如何避免訊息的重複消費?

38、你知道如何保障生產端100%訊息投遞成功嗎?

39、微服務下的分散式session該如何管理?

40、阿里二面:filter、interceptor、aspect應如何選擇?很多人中招

41、網際網路架構重要組員CDN,很多高階開發都沒有實操過,來看這裡

42、阿里二面:CDN快取控制原理,看看能不能難住你

43、SpringCloud Alibaba之Nacos多環境多專案管理

44、SpringCloud Alibaba系列之Nacos配置中心玩法

45、SpringCloud Alibaba之Nacos註冊中心

46、SpringCloud Plus版本之SpringCloud Alibaba

47、SpringCloud Alibaba之Nacos叢集、持久化

48、SpringCloud Alibaba之Nacos共享配置、灰度配置

49、SpringCloud Alibaba之Sentinel工作原理

50、SpringCloud Alibaba之Sentinel流控管理

51、SpringCloud Alibaba之Sentinel降級管理

52、SpringCloud Alibaba之Sentinel熱點引數限流

53、SpringCloud Alibaba之Sentinel的API實戰

最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 最近寫Vue,真是累死人了!沒有Angular爽,誰能幫幫我?[吐槽]