多环境开发
博客主页:踏风彡的博客
博主介绍:一枚在学习的大学生,希望在这里和各位一起学习。
所属专栏:SpringBoot学习笔记
文章创作不易,期待各位朋友的互动,有什么学习问题都可在评论区留言或者私信我,我会尽我所能帮助大家。
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
总结
- 实际开发中会有多种环境需求,如开发、测试、运维…
- yml文件中 — 用来分割每种环境
- 使用某种环境时直接指定就行了
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:
- 主配置文件中设置公共配置(全局)
- 环境分类配置文件中常用于设置冲突属性(局部)
总结
- 我们可以使用独立配置文件定义环境属性
- 独立配置文件优点:便于线上系统维护更新并保障系统安全性
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
总结
- 多环境开发使用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中配置的属性值的语法格式。
总结
- 当Maven与SpringBoot同时对多环境进行控制时,以Mavn为主,SpringBoot使用@…@占位符读取Maven对应的配置属性值
- 基于SpringBoot读取Maven配置属性的前提下,如果在Idea下测试工程时pom.xml每次更新需要手动compile方可生效或刷新Maven依赖(当然我推荐第二种)