欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

使用Spring boot 的profile功能實(shí)現(xiàn)多環(huán)境配置自動(dòng)切換

 更新時(shí)間:2018年11月25日 17:36:49   作者:黑少  
這篇文章主要介紹了使用Spring boot 的profile功能實(shí)現(xiàn)多環(huán)境配置自動(dòng)切換的相關(guān)知識(shí),非常不錯(cuò),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下

通常服務(wù)端應(yīng)用開(kāi)發(fā)需要經(jīng)過(guò)以下幾個(gè)流程:

開(kāi)發(fā) -> 測(cè)試 -> RC驗(yàn)證 -> 上線

這就涉及到四個(gè)不同的環(huán)境,開(kāi)發(fā)環(huán)境、測(cè)試環(huán)境、RC環(huán)境以及生產(chǎn)環(huán)境,為了避免不同環(huán)境之間相互干擾,通常需要獨(dú)立部署數(shù)據(jù)庫(kù)、緩存服務(wù)器等,那么應(yīng)用配置也要做相應(yīng)的調(diào)整。

為了解決不同環(huán)境配置切換問(wèn)題,很多人的做法是:把配置文件根據(jù)不同的環(huán)境,放到不同的目錄或文件中,打包時(shí)通過(guò)gradle或maven,通過(guò)命令行參數(shù)指定要打哪個(gè)環(huán)境的包。這樣就可以針對(duì)不同的環(huán)境生成不同的包。但這樣的做法有以下幾個(gè)問(wèn)題:

  • gradle或maven打包腳本文件需要重復(fù)編寫“選擇文件”打包的邏輯,增加很多重復(fù)勞動(dòng)的成功;
  • 在jenkins等集成環(huán)境中,需要針對(duì)每個(gè)應(yīng)用,不同的環(huán)境做相應(yīng)的設(shè)置;
  • 需要管理不同環(huán)境的包,帶來(lái)的成本;
  • 部署時(shí),需要注意包與運(yùn)行環(huán)境是否一致;
  • 如果運(yùn)行在docker中時(shí),因?yàn)榘煌砸槍?duì)不同的環(huán)境,構(gòu)建相應(yīng)的鏡像。

這時(shí)也許有人會(huì)說(shuō),把配置都從包里剝離出來(lái),放到配置中心就可以了,但是不同環(huán)境對(duì)應(yīng)的配置中心地址也是不一樣的。

Spring中的Profile 是什么?

Spring中的Profile功能其實(shí)早在Spring 3.1的版本就已經(jīng)出來(lái),它可以理解為我們?cè)赟pring容器中所定義的Bean的邏輯組名稱,只有當(dāng)這些Profile被激活的時(shí)候,才會(huì)將Profile中所對(duì)應(yīng)的Bean注冊(cè)到Spring容器中。

舉個(gè)更具體的例子,我們以前所定義的Bean,當(dāng)Spring容器一啟動(dòng)的時(shí)候,就會(huì)一股腦的全部加載這些信息完成對(duì)Bean的創(chuàng)建;而使用了Profile之后,它會(huì)將Bean的定義進(jìn)行更細(xì)粒度的劃分,將這些定義的Bean劃分為幾個(gè)不同的組,當(dāng)Spring容器加載配置信息的時(shí)候,首先查找激活的Profile,然后只會(huì)去加載被激活的組中所定義的Bean信息,而不被激活的Profile中所定義的Bean定義信息是不會(huì)加載用于創(chuàng)建Bean的。

為了使用不同的環(huán)境,我們首先對(duì)不同的環(huán)境,定義相應(yīng)的profile名稱。

比如,開(kāi)發(fā)環(huán)境的profile為:dev;測(cè)試環(huán)境的profile為:test;RC環(huán)境的profile為:rc;生產(chǎn)環(huán)境的profile為:prod。

下面舉個(gè)dubbo不同環(huán)境下,使用不同配置的方法:


上面例子中,當(dāng)激活相應(yīng)的profile時(shí),相應(yīng)的配置文件才會(huì)導(dǎo)入。

比如:profile為dev時(shí),導(dǎo)入dubbo-dev.properties。

注意:所有spring xml schema的版本必須是4.0以上,比如:http://www.springframework.org/schema/util/spring-util-4.3.xsd。spring 默認(rèn)profile為default, 在沒(méi)有指定profile的,會(huì)被默認(rèn)為default。

如果我們使用配置中心的話,上面的配置還可以更簡(jiǎn)單。等配置中心投產(chǎn)后我們?cè)儆懻摗?/p>

Spring boot中使用profile切換配置

Spring boot中默認(rèn)加載的配置文件是:application.properties或application.yml。當(dāng)激活profile后(后面我們討論如何激活profile),可以通過(guò)profile自動(dòng)選擇加載的application-{profile}.properties或application-{profile}.yml格式的配置文件。

比如:profile為dev時(shí),會(huì)加載application.properties或application.yml外,還會(huì)加載application-dev.properties或application-dev.yml配置。

另外如果引入Spring cloud 時(shí),也會(huì)加載啟動(dòng)配置bootstrap.properties或bootstrap.yml以及bootstrap-{profile}.properties 或 bootstrap-{profile}.yml。

所以把各個(gè)環(huán)境公共的配置寫在application.properties或application.yml中。把不同環(huán)境的配置寫在application-{profile}.properties或application-{profile}.yml中。

@Profile注解的使用

使用java進(jìn)行配置時(shí),可以通過(guò)@Profile注解,實(shí)現(xiàn)不同環(huán)境使用配置策略。比如swagger現(xiàn)在使用很普遍了,但是它存在一定的安全問(wèn)題,如果生產(chǎn)環(huán)境中也暴露swagger的話,風(fēng)險(xiǎn)還是比較大的,建議只在開(kāi)發(fā)環(huán)境和測(cè)試環(huán)境啟用,配置例子如下:


將上面的代碼保存到logback-spring.xml文件中,而不是logback.xml中。

logback中profile的使用

在開(kāi)發(fā)環(huán)境或測(cè)試環(huán)境中,為了方便排查問(wèn)題,我們會(huì)使用DEBUG甚至TRACE級(jí)別的日志,而在生產(chǎn)環(huán)境中,避免日志增長(zhǎng)過(guò)快,盡量只是輸出ERROR級(jí)別的日志。這就需要日志配置也要能根據(jù)不同的環(huán)境,使用不同的配置策略。

spring boot中的logback就可以滿足這樣的需求,例子如下:


將上面的代碼保存到logback-spring.xml文件中,而不是logback.xml中。

Spring boot 激活 profile的幾種方式

在配置文件中直接指定

spring.profiles.active=test

這種方式非常不靈活,在實(shí)際開(kāi)發(fā)部不太會(huì)使用到

使用占位符

在打包時(shí)替換,以mavne為例:

首先在配置文件中增加:

spring.profiles.active=@package.target@

在pom.xml中增加不同環(huán)境打包的配置:


執(zhí)行打包命令:

mvn package -Ptest

缺點(diǎn):每次打包都要指定profile

JVM參數(shù)方式

java命令行指定:

java -jar app.jar --spring.profiles.active=dev

tomcat 中 catalina.bat(.sh中不用“set”) 添加JAVA_OPS。通過(guò)設(shè)置active選擇不同配置文件:

set JAVA_OPTS="-Dspring.profiles.active=test"

eclipse 中啟動(dòng)tomcat。項(xiàng)目右鍵 run as –> run configuration–>Arguments–> VM arguments中添加。

-Dspring.profiles.active="dev"

在微服務(wù)的時(shí)代,會(huì)不會(huì)覺(jué)得有點(diǎn)麻煩呢?

web.xml方式

標(biāo)注方式(junit單元測(cè)試非常實(shí)用)

@ActiveProfiles({"dev"})

ENV方式(建議使用此方式)

設(shè)置系統(tǒng)環(huán)境變量:SPRING_PROFILES_ACTIVE(注意:是大寫)

比如mac開(kāi)發(fā)環(huán)境中設(shè)置環(huán)境變量的方法:

vi ~/.bash_profile

在~/.bash_profile中增加如下內(nèi)容:

export SPRING_PROFILES_ACTIVE=dev

總結(jié)

上面關(guān)于profile的東西,基本能滿足工作的需要了。使用profile后,可以減化因不同環(huán)境配置差異,而帶來(lái)的配置管理以及打包工作。

盡量使用環(huán)境變量來(lái)激活profile,如果是可執(zhí)行的包,也可以使用java命令行指定,其它方式不建議使用。

使用profile后,使得應(yīng)用能更容易接入配置中心,以及使用docker容器技術(shù),所以非常有意義。

相關(guān)文章

  • Java通過(guò)切面實(shí)現(xiàn)統(tǒng)一處理Token設(shè)置用戶信息

    Java通過(guò)切面實(shí)現(xiàn)統(tǒng)一處理Token設(shè)置用戶信息

    這篇文章主要介紹了Java切面統(tǒng)一處理Token設(shè)置用戶信息,常見(jiàn)的后端開(kāi)發(fā)中,接口請(qǐng)求中一般前端都是先通過(guò)用戶登錄獲取token,每次接口請(qǐng)求都需要在頭信息中攜帶token信息,后端每次都需要手動(dòng)處理token信息,從token信息中解析獲取用戶信息,需要的朋友可以參考下
    2023-10-10
  • 如何設(shè)置IDEA遠(yuǎn)程連接服務(wù)器開(kāi)發(fā)環(huán)境并結(jié)合cpolar實(shí)現(xiàn)ssh遠(yuǎn)程開(kāi)發(fā)(最新推薦)

    如何設(shè)置IDEA遠(yuǎn)程連接服務(wù)器開(kāi)發(fā)環(huán)境并結(jié)合cpolar實(shí)現(xiàn)ssh遠(yuǎn)程開(kāi)發(fā)(最新推薦)

    本文主要介紹如何在IDEA中設(shè)置遠(yuǎn)程連接服務(wù)器開(kāi)發(fā)環(huán)境,并結(jié)合Cpolar內(nèi)網(wǎng)穿透工具實(shí)現(xiàn)無(wú)公網(wǎng)遠(yuǎn)程連接,然后實(shí)現(xiàn)遠(yuǎn)程Linux環(huán)境進(jìn)行開(kāi)發(fā),感興趣的朋友跟隨小編一起看看吧
    2024-03-03
  • SWT(JFace)體驗(yàn)之圓環(huán)狀(戒指型)

    SWT(JFace)體驗(yàn)之圓環(huán)狀(戒指型)

    SWT(JFace)體驗(yàn)之圓環(huán)狀(戒指型)實(shí)現(xiàn)代碼。
    2009-06-06
  • Java CharacterEncodingFilter案例詳解

    Java CharacterEncodingFilter案例詳解

    這篇文章主要介紹了Java CharacterEncodingFilter案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • 快速入門Java中的Lambda表達(dá)式

    快速入門Java中的Lambda表達(dá)式

    Lambda作為函數(shù)式編程中的基礎(chǔ)部分,在其他編程語(yǔ)言中早就廣為使用,但在Java領(lǐng)域中發(fā)展較慢,直到j(luò)ava8,才開(kāi)始支持Lambda。網(wǎng)上關(guān)于Lambda的教程很多,今天小編給大家分享一篇快速入手Lambda的教程。
    2016-08-08
  • java基于socket傳輸zip文件功能示例

    java基于socket傳輸zip文件功能示例

    這篇文章主要介紹了java基于socket傳輸zip文件功能,結(jié)合實(shí)例形式分析了java使用socket進(jìn)行文件傳輸?shù)木唧w操作步驟與服務(wù)器端、客戶端相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2017-07-07
  • java連接MySQl數(shù)據(jù)庫(kù)實(shí)例代碼

    java連接MySQl數(shù)據(jù)庫(kù)實(shí)例代碼

    這篇文章介紹了java連接MySQl數(shù)據(jù)庫(kù)實(shí)例代碼,有需要的朋友可以參考一下
    2013-10-10
  • Java 8實(shí)現(xiàn)圖片BASE64編解碼

    Java 8實(shí)現(xiàn)圖片BASE64編解碼

    Java 8終于有了標(biāo)準(zhǔn)的方法來(lái)處理base64的編解碼。Java一直缺少BASE64編碼API,以至于通常在項(xiàng)目開(kāi)發(fā)中會(huì)選用第三方的API實(shí)現(xiàn)。但是,Java 8實(shí)現(xiàn)了BASE64編解碼API,它包含到j(luò)ava.util包。下面這篇文章我會(huì)對(duì)Java 8的BASE64編解碼做一個(gè)詳細(xì)的介紹。
    2016-10-10
  • 詳解Spring Bean 之間的特殊關(guān)系

    詳解Spring Bean 之間的特殊關(guān)系

    在 Spring 容器中,兩個(gè) Bean 之間除了通過(guò) <ref> 建立依賴關(guān)系外,還存在著一些特殊關(guān)系。這篇文章給大家想想介紹了Spring Bean 之間的特殊關(guān)系,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下
    2018-05-05
  • Java遞歸來(lái)實(shí)現(xiàn)漢諾塔游戲,注釋詳細(xì)

    Java遞歸來(lái)實(shí)現(xiàn)漢諾塔游戲,注釋詳細(xì)

    這篇文章介紹了Java遞歸來(lái)實(shí)現(xiàn)漢諾塔游戲的方法,文中的代碼注釋介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-11-11

最新評(píng)論