多环境开发

1 yml单一文件版

​ 概述:多环境开发就是针对不同的环境设置不同的配置属性。

​ 你自己开发时,配置的端口是:

server:
  port: 80

​ 那如何想设计两组环境呢?中间使用三个减号分隔开

server:
  port: 80
---   #用来分隔不同环境
server:
  port: 81

​ 那么如何区分两种环境呢?起名字呗

spring:
	profiles: pro  #环境名称,但是这种命名已过时
server:
	port: 80
---
spring:
	profiles: dev
server:
	port: 81

​ 那怎么选择用哪个环境呢?设置默认启动哪个就可以喽

spring:
	profiles:
		active: pro		# 启动pro
---
spring:
	profiles: pro
server:
	port: 80
---
spring:
	profiles: dev
server:
	port: 81

​ 实际上它就这么简单,再多来一组环境也OK呦~

spring:
	profiles:
		active: pro		# 启动pro
---
spring:
	profiles: pro
server:
	port: 80
---
spring:
	profiles: dev
server:
	port: 81
---
spring:
	profiles: test
server:
	port: 82

​ 其中关于环境名称定义上述格式是过时格式,标准格式如下

spring:
	config:
    	activate:
        	on-profile: pro

总结

  1. 实际开发中会有多种环境需求,如开发、测试、运维…
  2. yml文件中 — 用来分割每种环境
  3. 使用某种环境时直接指定就行了

2 yml 多文件版

​ 上面说了单文件版,但是呢,平常开发中一个环境的配置文件都很多了,如果把所有配置文件都设置到一个文件里,显然是不利于调试的,所以,我们一般都把各个环境独立书写一个配置文件,额外有一个主配置文件,用来指定开发环境,并把一些公共配置写到该配置文件中。

​ 例子:

主配置文件

spring:
	profiles:
		active: pro		# 启动pro

环境配置文件

server:
	port: 80

​ 环境配置文件因为每一个都是配置自己的项,所以连名字都不用写里面了。那问题是如何区分这是哪一组配置呢?使用文件名区分。

application-pro.yaml

server:
	port: 80

application-dev.yaml

server:
	port: 81

​ 文件的命名规则为:application-环境名.yml。

​ 如开头所说,在各个环境的配置文件中,如果某些配置项是重复的,那么我们可以把这些配置写在主配置文件中,这样方便调试。

Eg:

  • 主配置文件中设置公共配置(全局)
  • 环境分类配置文件中常用于设置冲突属性(局部)

总结

  1. 我们可以使用独立配置文件定义环境属性
  2. 独立配置文件优点:便于线上系统维护更新并保障系统安全性

3 properties多文件版

​ 一句话:同上yml多文件版,但是,properties文件多环境配置仅支持多文件格式。

4 多环境开发独立配置文件书写技巧

​ 正所谓:天下大势,分久必合,合久必分。对于配置文件也一样,可能有些时候,像数据库这些客户的隐私信息配置文件,我们并不知道,举个例子:银行让你搞开发,能让你知道人家数据库信息?

​ 所以就有了多环境开发的独立配置文件。

格式

将所有的配置根据功能对配置文件中的信息进行拆分,并制作成独立的配置文件,命名规则如下

  • application-devDB.yml
  • application-devRedis.yml
  • application-devMVC.yml

使用

​ 使用include属性在激活指定环境的情况下,同时对多个环境进行加载使其生效,多个环境间使用逗号分隔

spring:
	profiles:
    	active: dev
        include: devDB,devRedis,devMVC

​ 简单来说,就是现在相当于加载dev配置时,再加载对应的3组配置,从结构上就很清晰,用了什么,对应的名称是什么。

冲突属性有效情况

​ 当主环境dev与其他环境有相同属性时,主环境属性生效;其他环境中有相同属性时,最后加载的环境属性生效

重点

​ 但是上面的设置也有一个问题,比如我要切换dev环境为pro时,include也要修改。因为include属性只能使用一次,这就比较麻烦了。SpringBoot从2.4版开始使用group属性替代include属性,降低了配置书写量。简而言之,group用分组形式进行开发环境管理。

spring:
	profiles:
    	active: dev
        group:
        	"dev": devDB,devRedis,devMVC
      		"pro": proDB,proRedis,proMVC
      		"test": testDB,testRedis,testMVC

总结

  1. 多环境开发使用group属性设置配置文件分组,便于线上维护管理

4 多环境开发控制

​ 看到这里,朋友们可能会想到Maven,因为Maven也能设置多环境,但是,这个问题很简单,Maven是用来进行项目构建的,并最终形成代码包,而SpringBoot呢,人家是用来简化开发的,所以呢,Maven才是哥。

​ SpringBoot工程中Maven设置多环境大体思想:

  • 先在maven环境中设置用什么具体的环境
  • 在SpringBoot中读取maven设置的环境即可

maven中设置多环境(使用属性方式区分环境)

<profiles>
    <profile>
        <id>env_dev</id>    <!--环境坐标id-->
        <properties>
            <profile.active>dev</profile.active>      <!--选择环境启动时的读取名字-->
        </properties>
        <activation>
            <activeByDefault>true</activeByDefault>		<!--默认启动环境-->
        </activation>
    </profile>
    <profile>
        <id>env_pro</id>
        <properties>
            <profile.active>pro</profile.active>
        </properties>
    </profile>
</profiles>

SpringBoot中读取maven设置值

spring:
	profiles:
    	active: @profile.active@

​ 上面的**@属性名@**就是读取maven中配置的属性值的语法格式。

总结

  1. 当Maven与SpringBoot同时对多环境进行控制时,以Mavn为主,SpringBoot使用@…@占位符读取Maven对应的配置属性值
  2. 基于SpringBoot读取Maven配置属性的前提下,如果在Idea下测试工程时pom.xml每次更新需要手动compile方可生效或刷新Maven依赖(当然我推荐第二种)
10-19 10:31