????博客x主页:己不由心王道长????!
????文章说明:一文彻底吃透·SpringBoot多环境开发????
✅系列专栏:SpringBoot
????本篇内容:对SpringBoot的多环境开发需求做一个总结????
☕️每日一语:情商最低的一种人,就是明明可以好好说的话,非要用最令人讨厌的方式表达。☕️
????作者详情:作者是一名双非大三在校生,喜欢Java,欢迎大家探讨学习,喜欢的话请给博主一个三连鼓励。????
???? 交流社区:己不由心王道长(优质编程社区)
前言
在我们的开发中,必然不会只用到单个环境开发。整个软件的开发分为:开发——>测试——>生产(即给用户使用)。
在这整个过程中用到的配置必然不一样,例如我们接了银行一个活,要对底层数据库进行调试;银行管理层肯定不会告诉你密码的。
这种情况下就要求分环境,开发人员自己有一套环境dev,测试人员给人家老板去提供安装、上线测试必然又是另一套(不然你运维直接开发人员全包了得了?),到上线了,老板肯定又是自己的一套环境。密码这种私密性极高的东西必然不会告诉我这种底层程序员。
yml版多环境开发
这里直接开发,创建项目太小儿科了,就不浪费时间了。
yml版单文件多环境
配置文件:
#应用环境
#公共配置
spring:
profiles:
active: dev
---
#设置环境
#生产环境
spring:
profiles: pro
server:
port: 80
---
#开发环境
spring:
profiles: dev
server:
port: 81
---
#测试环境
spring:
profiles: test
server:
port: 82
我们在上面配置了四个环境,分别是应用环境,生产环境、开发环境和测试环境。应用环境是公共环境,是用来声明这个配置文件到底使用了哪个环境作为应用的环境。每个环境之间用三个减号分割开。我们可以在每个环境中进行自己的环境配置。在active中后声明使用的环境的名称。
下面进行测试:
在上面中我们选择的是dev,即生产环境,端口号为81,测试结果为:
这就正确了吗?不急,把应用环境改为test再测试玩玩;
结果依然是正确的。所以我们完成了单文件的yml多环境测试。
问题来了,你这几个环境全部都在一个文件里,那么刚才说的老板的密码保密性在哪里呢?
人家老板不干了。老板要是不干了,那可不行,所以我们满足老板需求,请阅读:yml版多文件多环境
yml版多文件多环境
从上面我们知道,单文件多环境配置是存在局限性的,就是各种时期的人员没有隐私嘛,人老板密码能让你看。所以这里我们就使用SpringBoot提供的yml版多文件多环境开发,让老板穿上底裤!
说着挺玄乎的,难不难?不难!多环境多文件嘛,那就新建文件
application.yml就是我们的应用环境。怎么用呢?看下面
application-dev.yml:
server:
port: 80
application-pro.yml:
server:
port: 81
application-test.yml:
server:
port: 82
无非就是一个文件一个环境,到你的时候就自己配你的环境,这样老板就又隐私了。
在application.yml中配置:
spring:
profiles:
active: test
看到没有,其实就是把一个配置文件分开为了三个配置文件,其他的用法基本一样,而且分开还实现了解耦,以后的多环境开发其实就是使用多文件多环境。
测试:发现8082端口启动,正是我们想看到的
properties版多环境开发
其实这个版本跟上面的版本大同小异,大同是用法相同,小异其实就是properties和yml语法上的不同。
这里我没有把刚才的配置文件删除,而是创建一个文件夹,把它们移动到里面。
还是创建四个配置文件
还是一样进行配置文件的编写
application-dev.properties:
server.port=80
application-pro.properties:
server.port=81
application-test.properties:
server.port=82
application.properties:
#在这里配置需要启用的环境文件
spring.profiles.active=pro
测试:
结果还是正确
可以看到,两个不同的方式,但是方法都差不多,只有语法和后缀上的差异!!!
问题又来了,我们学会了多环境开发没错,老板也舒服了,有隐私了。
如果出现以下情况,请思考:
server:
port: 80
spring:
mvc:
view:
prefix: /
suffix: /*.html
datasource:
druid:
driver-class-name:
url:
username:
password:
mybatis-plus:
check-config-location: false
这些怎么样?你说还行,可我们都知道,开发项目的时候,虽然SpringBoot简化了很多的配置,但还是有很多需要我们自己动手去配置的,如果全都配置在一个文件,难以想象。
多环境分组管理
在上面我们发现了端倪,即在开发环境中,我们不会把所有的配置都放在一个配置中,那样既不美观,也不利于维护。
所以我们要学习多环境的分组管理。
分组是怎么进行的?按照功能拆分,你数据库的负责底层数据库的,你mvc负责视图和控制。
且看下面,刚才在学习多环境的properties格式时,我没有把yml文件删除掉,而是保存起来,这个时候再把它拉出来让它干活!删除properties文件,开发中一般使用yml格式。
这样,我们都是码农,当然使用dev.yml,我们刚才看见了很多配置混合在一起,如下:
server:
port: 80
spring:
mvc:
view:
prefix: /
suffix: /*.html
datasource:
druid:
driver-class-name:
url:
username:
password:
mybatis-plus:
check-config-location: false
我就分别创建application-devMysql.yml、application-devMybatis.yml、application-devMvc.yml
application-devMysql.yml:
spring:
datasource:
druid:
driver-class-name:
url:
username:
password:
application-devMybatis.yml:
mybatis-plus:
check-config-location: false
application-devMvc.yml:
spring:
mvc:
view:
prefix:
suffix:
application-dev.yml:
server:
port: 8081
然后在应用环境中配置,怎么配置呢?接着看
application.yml
spring:
profiles:
active: dev
include: devMvc,devMybatis,devMysql
在应用环境中配置了dev,使用include表示这个配置文件包括include后面的那几个文件。
测试:
结果没有意外正确,这时我们还要想一个问题,我们使用了多分组管理,这挺好的,可是如果我把active的dev改为test,即开发阶段过度到测试,那么decMvc也得改,以dev开头的都得改,很明显这是不可忍受的。
解决方案:SpringBoot给我们提供了解决方案,SpringBoot提供了group属性,这一看就是为了分组管理而来的。
使用:
使用group进行分组管理,可以设置分组类别,只要在active后添加group的分组,如dev,即可默认配置了“dev”后的所有配置文件。
到此,我们的多环境开发要告一段落了,但是别急,我们不妨再想一个问题,到底是SpringBoot依赖maven运行,还是maven依赖SpringBoot运行呢?
这不是废话嘛,当然是SpringBoot依赖maven运行了。好,那么如果在SpringBoot中做了配置,又在maven做进行同样的配置,这个时候怎么办?要是产生冲突怎么办呢?这就是下一节要讲的多环境开发控制。
多环境开发控制
在上面我们已经完成了多环境开发的基本步骤,现在就差一点,我就直接给出答案,就是maven和SpringBoot之间的配置整合,要弄懂这个,我们又必须知道是maven主导SpringBoot。
maven是做什么的?项目构建管理的,最终生成代码包的,SpringBoot是干什么的?简化开发的。简化,又不是其主导作用。最终还是要靠maven来管理整个工程,所以SpringBoot应该听maven的。整个确认后下面就好做了。大体思想如下:
- 先在maven环境中设置用什么具体的环境
- 在SpringBoot中读取maven设置的环境即可
第一步:在maven中设置环境
<profiles>
<profile>
<id>env_dev</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>
<profile>
<id>env_test</id>
<properties>
<profile.active>test</profile.active>
</properties>
</profile>
</profiles>
这里是不是很熟悉,profiles嘛,配置文件,就是下面的1.
第二步:在配置文件中读取,就是在上面的active中读取,用@profile.active@即可读取maven中默认的启动环境,以后开发要使用什么环境,直接在maven中配置即可。
spring:
profiles:
active: @profile.active@
group:
"dev": devMvc,devMybatis,devMysql
"test":
"pro":
# include: devMvc,devMybatis,devMysql
测试:这里的默认启动环境是dev,dev端口号是8081
很遗憾,启动失败,为什么失败呢?错误信息如下:
解释:
扫描下一个令牌时
找到无法启动任何标记的字符“@”。(不要将@用于缩进)
在“读者”第3行第13列中:
活动:@profile.active@
它告诉我们说的是我们在应用配置文件中的@profile.active@无法启动任何标记。
解决方案:解决方法:在profiles中勾选环境之后,点一下 Road ALL Maven Projects。
再测试:
还有一点,比如这时我把maven配置中profiles默认开启更改,改为默认启动test,此时test的端口号为8082
测试:
可以看到还是默认启动的是dev。我们怀疑会不会是上次生成的文件没有清理,这里clean再测试一下:
我们看到并不管用,这时候怎么办?采用预编译即complie
即可成功运行;
总结
1. 多环境开发需要设置若干种常用环境,例如开发、生产、测试环境
2. yaml格式中设置多环境使用—区分环境设置边界
3. 每种环境的区别在于加载的配置属性不同
4. 启用某种环境时需要指定启动时使用该环境
5. 多环境开发使用group属性设置配置文件分组,便于线上维护管理