前言

  通过之前的博客:SpringBoot系列——jar包与war包的部署,我们已经知道了如果实现项目的简单部署,但项目部署的时候最烦的是什么?修改成发布环境对应的配置!数据库连接地址、Eureka注册中心地址、Redis服务地址等,部署环境不一样,打包的时候就要改成对应的配置;常用的环境有本地开发环境dev,本地测试环境dev-test,生产测试环境prod-test,生产环境prod;

  开发的时候我们用dev,项目直接运行,不用改配置;发布本地测试环境的时候,打包之前我们要先改成对应配置;上线前发布生产测试环境的时候要改成对应配置;正式上线发布生产环境的时候要改成对应配置;每次这样改很麻烦,要是不小心漏改了部分地方,还会造成报错,当换一个人来部署时,还得先告诉他需要修改的地方,麻烦;

  那么有什么好办法能解决这个问题呢?我就是不想每次在打包之前改配置,我就直接打包、发布。下面记录一下利用系统环境变量与.yml配置文件的活跃分支实现“智能部署”;

  想了解springboot的配置优先级可以参考这篇大佬的博客:Spring Boot 配置优先级顺序,我这里简单总结一下:

  1. 命令行参数。
  2. 通过 System.getProperties() 获取的 Java 系统参数。
  3. 操作系统环境变量。
  4. 从 java:comp/env 得到的 JNDI 属性。
  5. 通过 RandomValuePropertySource 生成的“random.*”属性。
  6. 应用 Jar 文件之外的属性文件。(通过spring.config.location参数)
  7. 应用 Jar 文件内部的属性文件。
  8. 在应用配置 Java 类(包含“@Configuration”注解的 Java 类)中通过“@PropertySource”注解声明的属性文件。
  9. 通过“SpringApplication.setDefaultProperties”声明的默认属性。

  代码编写

  配置选择分支

  首先我们利用bootstrap.yml先于application.yml加载的顺序,在bootstrap.yml进行分支选择

spring:
config:
name: application #配置文件名
profiles:
active: ${HUANZI_PROFILES:dev} #选择配置分支,先读取系统环境变量,如果没有则默认值为 dev

  在application.yml里进行写各个分支的配置,分支之间用注释 ---- 隔开

  请看官网截图介绍:你可以在一个yml里面指定多个具体的profile配置,通过配置spring.profiles,判断使用哪个配置

##### 公共 配置 #######
server:
port: #端口号
servlet:
context-path: / #访问根路径 spring:
application:
name: springdatejpa #应用名 --- ##### dev 配置 #######
spring:
profiles: dev datasource: #连接数据库
url: jdbc:mysql://localhost:/test?serverTimezone=GMT%2B8&characterEncoding=utf-
username: root
password:
driver-class-name: com.mysql.jdbc.Driver
msg: 正在使用 dev 配置
---
##### dev-test 配置 #######
spring:
profiles: dev-test datasource: #连接数据库(暂时也先用同一个库,否则项目报错起不来)
url: jdbc:mysql://localhost:/test?serverTimezone=GMT%2B8&characterEncoding=utf-
username: root
password:
driver-class-name: com.mysql.jdbc.Driver
msg: 正在使用 dev-test 配置
---
##### prod-test 配置 #######
spring:
profiles: prod-test msg: 正在使用 prod-test 配置
---
##### prod 配置 #######
spring:
profiles: prod msg: 正在使用 prod 配置
---

  当然也可以用后缀.properties的配置文件,来进行根据活跃的profiles分支选择

  创建application-dev.properties,application-dev-test.properties...文件,将具体配置放在具体文件里,同样与yml效果一致

  PS:默认情况下yml没有中文乱码问题,而properties有

  另外,官网给出了一个yml的缺点,就是不能使用@PropertySource注释加载yml文件

  更多yml介绍请看官网:24.7 Using YAML Instead of Properties https://docs.spring.io/spring-boot/docs/2.1.0.RELEASE/reference/htmlsingle/#boot-features-external-config-yaml

  更多配置文件介绍请看官网:24. Externalized Configuration https://docs.spring.io/spring-boot/docs/2.1.0.RELEASE/reference/htmlsingle/#boot-features-external-config

               25. Profiles https://docs.spring.io/spring-boot/docs/2.1.0.RELEASE/reference/htmlsingle/#boot-features-profiles

  配置环境变量

  Windows配置系统环境变量,例如:dev-test

  Linux配置系统环境变量,请看这篇文章:Linux环境变量总结,总结下代码、步骤:

  1、vim ~/.bash_profile

  2、export HUANZI_PROFILES=dev-test ,esc :wq保存退出

  3、source ~/.bash_profile

  4、查看环境变量  echo $HUANZI_PROFILES ,如果输出dev-test设置成功

  效果

  添加一个checkProfiles测试接口,方便检查分支使用情况:

    @Value("${msg}")
private String msg; /**
* 检查配置分支
*/
@RequestMapping("checkProfiles")
public String checkProfiles() {
return msg;
}

  没有设置系统环境变量:默认使用dev

    

  设置系统环境变量后:使用环境变量的值dev-test

    

  后记

  有了“智能部署”功能,我们将所有的分支配置好之后,不管是部署在那个环境,只要在对应的环境设置好对应的系统环境变量,每次都可以直接打包发布,非常方便!当你没空发版,想叫其他同事帮忙发布,但又怕他不太熟悉时,你就告诉他:

  1、更新最新代码

  2、打包、上传

  3、启动项目(先kill掉旧项目、备份旧项目、启动新项目、查看启动日志确保启动过程有无报错)

  妈妈再也不用担心我不会发版了!

SpringBoot系列——利用系统环境变量与配置文件的分支选择实现“智能部署”的更多相关文章

  1. Springboot yml获取系统环境变量的值

    注意,这里说的是获取系统环境变量的值,譬如Windows里配置的JAVA_HOME之类的,可以直接在Springboot的配置文件中获取. 我们经常使用一些docker管理平台,如DaoCloud.r ...

  2. 【转】Delphi利用系统环境变量获取常用系统目录

    Delphi code //譬如 %WINDIR% 是表示系统目录的系统变量, 可以这样获取: var s: string; begin s := GetEnvironmentVariable('WI ...

  3. SpringBoot系列——Security + Layui实现一套权限管理后台模板

    前言 Spring Security官网:https://spring.io/projects/spring-security Spring Security是一个功能强大且高度可定制的身份验证和访问 ...

  4. Spring使用环境变量控制配置文件加载

    项目中需要用到很多配置文件,不同环境的配置文件是不一样的,因此如果只用一个配置文件,势必会造成配置文件混乱,这里提供一种利用环境变量控制配置文件加载的方法,如下: 一.配置环境变量 如果是window ...

  5. Spring使用环境变量控制配置文件加载(转)

    项目中需要用到很多配置文件,不同环境的配置文件是不一样的,因此如果只用一个配置文件,势必会造成配置文件混乱,这里提供一种利用环境变量控制配置文件加载的方法,如下: 一.配置环境变量 如果是window ...

  6. Springboot配置文件获取系统环境变量的值

    注意,这里说的是获取系统环境变量的值,譬如Windows里配置的JAVA_HOME之类的,可以直接在Springboot的配置文件中获取. 我们经常使用一些docker管理平台,如DaoCloud.r ...

  7. Linux系统环境变量的四个配置文件的关系

    Linux系统环境变量配置有四个文件分别是: /etc/environment,/etc/profile,/etc/bash.bashrc,~/.bashrc 各配置文件意义 /etc/environ ...

  8. Ubuntu Linux系统环境变量配置文件

    Ubuntu Linux系统环境变量配置文件: /etc/profile : 在登录时,操作系统定制用户环境时使用的第一个文件 ,此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行. ...

  9. Ubuntu Linux系统环境变量配置文件【转】

    本文转载自:https://my.oschina.net/qinlinwang/blog/30471 Ubuntu Linux系统环境变量配置文件:  /etc/profile : 在登录时,操作系统 ...

随机推荐

  1. 佛祖镇楼,BUG避易

    def FZZL(): print(" _ooOoo_ ") print(" o8888888o ") print(" 88 . 88 ") ...

  2. leetcode_1. Two Sum

    leetcode_1. Two Sum 前言: 这段时间开始敲leetcode.我认为这并不仅仅只是为了应付笔试,面试.而是确实有着一定的意义. 尤其,你提交代码后,网站会多方面验证你的答案. 另外, ...

  3. Python_NAT

    sockMiddle_server.py import sys import socket import threading #回复消息,原样返回 def replyMessage(conn): wh ...

  4. 洛谷 P3177 树上染色 解题报告

    P3177 [HAOI2015]树上染色 题目描述 有一棵点数为\(N\)的树,树边有边权.给你一个在\(0\) ~ \(N\)之内的正整数\(K\),你要在这棵树中选择\(K\)个点,将其染成黑色, ...

  5. spring+springmvc+mybatis构建系统

    今天和大家分享的是spring+springmvc+mybatis搭建框架的例子,说到这里不得不说现在市面上一流大公司还有很多用这种架子,创业型公司大部分都用springboot集成的mvc+myba ...

  6. MySql常用两大存储引擎简介

    MyISAM存储引擎简介 MyISAM存储引擎的表在数据库中,每一个表都被存放为三个以表名命名的物理文件. 首先肯定会有任何存储引擎都不可缺少的存放表结构定义信息的.frm文件,另外还有.MYD和.M ...

  7. 【Web】一个非常简单的移动web消息框

    适用:h5+jquery,移动网页最佳 最近在写个简单的公众号页面,前端验证时有些信息要提示,很简单的需求实在不想找啥现成的轮子,又不至于用alert这么粗暴,遂写了个非常简单的消息框,效果如图: 特 ...

  8. CORS 实战 专题

    本文会代码层面对CORS问题进行剖析 CORS相关相关概念可参考http://www.cnblogs.com/softidea/p/5496719.html ERROR info: XMLHttpRe ...

  9. java的系统时间,怎么计算从现在到凌晨还剩下多少时间?

    Apache commons-lang3 long milliSecondsLeftToday = 86400000 - DateUtils.getFragmentInMilliseconds(Cal ...

  10. JavaScript设计模式 Item 7 --策略模式Strategy

    1.策略模式的定义 何为策略?比如我们要去某个地方旅游,可以根据具体的实际情况来选择出行的线路. 如果没有时间但是不在乎钱,可以选择坐飞机. 如果没有钱,可以选择坐大巴或者火车. 如果再穷一点,可以选 ...