一次打包,多個環境運行(開發、測試、生產等)

1、問題描述

以前常用的,使用maven插件根據不同環境(開發、測試、線上)打不同的包,方便吧? 也還可以,但是打各個環境的包配置文件不一樣(maven打包是指定了編譯配置文件,未指定不會打包進來),有時候包會出現混淆,影響使用;最近使用了jar啓動命令指定profiles文件,個人感覺更加合理一些,不使用maven插件打包,就打一個包,在不同的環境下,配置不同的啓動參數就可以了,啓動命令只需配置一次,一個包,就能用到不同的環境,開發、測試、線上環境都可以用,簡單介紹下。

2、解決方案

簡單來說就是使用jar啓動命令的時候,指定不同的profiles,來達到一次打包,多個環境共用的目的。

2.1 application.yml簡要說明

(1)application.yml是默認加載使用的配置文件,裏面的配置項會默認加載;

(2)通過新建多個yml,application-dev.yml,application-uat.yml,application-prod.yml,在application.yml中或java啓動的時候配置,可以激活具體自定義yml;

例如:

spring:
   profiles:
      active: dev

項目會加載application.yml和application-dev.yml中的配置項;

springboot2.4(2020-11-12發佈)後版本,配置有點不一樣了,更改爲:

spring.config.activate.on-profile=dev

(3)後綴名字要保持一致,否則會報找不到具體配置項目(不會報找不到yml);

(4)假如application.yml配置項與自定義yml(application-dev.yml等)一樣,以自定義yml配置項爲準;

2.2 配置

(1)application.yml配置

spring:
   profiles:
      active: dev
server:
  port: 9090

test:
  app: 我是公共的application

(2)application-dev.yml配置

test:
  name: dev老王是帥哥

(3)application-prod.yml配置

test:
  name: prod老王是靚仔

2.3 新建測試controller方法

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/test")
public class TestController {
    @Value("${test.name}")
    private String name;
    @Value("${test.app}")
    private String app;

    @RequestMapping("/")
    public String test() {
        return app + "-------------" + name;
    }
}

2.4演示

(1)當active:dev

由展示可以看出:展示了application.yml和application-dev.yml配置項內容;

(2)active:prod的時候:

由展示可以看出:展示了application.yml和application-prod.yml配置項內容;

簡單總結:

(1)當時active選擇爲:dev的時候,會加載application.yml和application-dev.yml兩個配置類;

(2)當時active選擇爲:prod的時候,會加載application.yml和application-dev.yml兩個配置類;

利用這個特性,實現編譯打包一次,多個環境運行的目的;

2.5 一次打包多個環境運行

其實是利用java的jar包設置啓動參數的來實現的,dev服務器環境運行命令:

nohup java -jar -server -Dserver.port=10001 -Xms1024M -Xmx1024M -Dspring.profiles.active=dev /usr/local/application/laowang/laowang.jar LAOWANG>/dev/null 2>&1 &

其中-Dspring.profiles.active=dev,作用就是與配置文件配置active一樣,並且啓動命令中設置參數,級別高於配置文件中,目前正在使用的:配置文件中默認爲dev,然後打包,根據不同服務器環境配置不同的啓動參數,例如目前uat環境爲:

nohup java -jar -server -Dserver.port=10001 -Xms1024M -Xmx1024M -Dspring.profiles.active=uat /usr/local/application/laowang/laowang.jar LAOWANG>/uat/null 2>&1 &

prod環境爲:

nohup java -jar -server -Dserver.port=10001 -Xms1024M -Xmx1024M -Dspring.profiles.active=prod /usr/local/application/laowang/laowang.jar LAOWANG>/prod/null 2>&1 &

重點說明:

(1)這個方式不同於以前maven打包的環境,以前通過maven插件打包博客介紹過,是在編譯打包的時候就指定了打包的yml,指定dev環境的時候,application-uat.yml和application-prod.yml壓根就不會編譯和打包,這樣各個服務器的啓動命令也一樣;但是也導致各個環境的包不一樣,有時候會攪渾,甚至打包的時候切換也容易出問題;

(2)目前的通過啓動命令執行配置文件的方式,啓動命令在服務器上更新記錄一次就好了,然後打包的時候,就可以實現多個環境(開發、uat、線上)同一個jar包,不容易混淆,個人認爲更加合理一些;


更多信息請關注公衆號:「軟件老王」,關注不迷路,軟件老王和他的IT朋友們,分享一些他們的技術見解和生活故事。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章