需求分析

Spring项目中在各个环境之中的配置信息都有所区别,如果每次都要手动对每个不同环境下的配置进行选择,未免太过重复和繁琐。因此对每个环境下的配置进行统一管理,当切换环境的时候直接一键切换配置,就显得十分重要。

需求解决

基于Maven多环境

maven中工程属性设置提供了多环境配置设置的,通过在pom文件中设置不同环境下的属性配置,再利用ideamaven插件,即可轻松的切换环境允许程序和打包。

maven工程文件pom示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<profiles>
<profile>
<id>dev</id>
<properties>
<profiles.active>dev</profiles.active>
<nacos-server>127.0.0.1:8848</nacos-server>
</properties>
<activation>
<activeByDefault>true</activeByDefault><!--此处将dev设置为默认环境-->
</activation>
</profile>
<profile>
<id>prod</id>
<properties>
<profiles.active>prod</profiles.active>
<nacos-server>172.25.177.179:8848</nacos-server>
</properties>
</profile>
<profile>
<id>test</id>
<properties>
<profiles.active>test</profiles.active>
<nacos-server>172.25.177.124:8848</nacos-server>
</properties>
</profile>
</profiles>

这个只是pom文件的一部分,主要也就是利用profiles标签进行配置。现在已经有了多环境的配置,只要再在Spring的配置文件中读取即可。

Spring配置文件application.properties示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

# application
spring.application.name=user-service
# main
spring.main.allow-bean-definition-overriding=true
# 读取当前环境
spring.profiles.active=@profiles.active@
# server
server.port=8186
# nacos
spring.cloud.nacos.username=nacos
spring.cloud.nacos.password=nacos
# 读取nacos地址
spring.cloud.nacos.server-addr=@nacos-server@
spring.cloud.nacos.namespace=${spring.profiles.active}
spring.cloud.nacos.discovery.namespace=${spring.cloud.nacos.namespace}
spring.cloud.nacos.config.namespace=${spring.cloud.nacos.namespace}
spring.cloud.nacos.config.extension-configs=application.properties,${spring.application.name}.properties

maven中读取属性采用@配置名@的形式读取,如上所示,读取了当前开发环境和nacos的配置信息。

但是现在允许程序会发现直接报错,查看日志发现@配置名@并没有被替换成目标配置,因而导致项目报错。解决这个问题,就要再在pom文件中进行配置,启动配置替换。

示例:

1
2
3
4
5
6
7
8
9
10
<build>
<resources>
<resource>
<!--打包该目录下的 application.yml -->
<directory>src/main/resources</directory>
<!-- 启用过滤 即该资源中的变量将会被过滤器中的值替换 -->
<filtering>true</filtering>
</resource>
</resources>
</build>

也就是在build标签里面的resource标签里添加资源目录的路径,并且启动filtering过滤。

现在多环境配置可以说已经基本完成了,现在切换环境,只需在maven插件里面勾选所需的环境即可。

如图:

image-20230805104805733

如上图右所示,即打开maven插件,在配置文件中勾选所需环境,注意,环境名是由pom文件中多环境profiles标签里的id决定的。

基于Spring配置文件

Spring的配置文件本身就支持多环境的配置,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
server:
port: 63050

spring:
application:
name: media-service
profiles:
active: @profile.active@ #当前环境,从maven的pom文件中读取属性

cloud:
nacos:
discovery:
namespace: ${spring.profiles.active}
config:
namespace: ${spring.profiles.active}
file-extension: yaml
extension-configs:
- data-id: application.yaml
group: DEFAULT_GROUP
refresh: true # 是否自动刷新配置,默认为 false
# 多环境配置
---
spring:
profiles: dev
cloud:
nacos:
server-addr: 127.0.0.1:8848
username: nacos
password: nacos
---
spring:
profiles: prod
cloud:
nacos:
server-addr: 172.25.177.179:8848
username: nacos
password: nacos
---

如上,在YAML配置文件中,我通过分块,配置了不同环境下的nacos的配置,同时当前环境的属性从从mavenpom文件中读取,也就是读取@profile.active@,结合上一点所说的方法,也要在父工程的pom文件中对这个属性进行多环境配置。从根本上来说,这种方法是在第一种方法的基础上又利用了spring自带的多环境配置。

区分

两种多环境各有优点,第二种方法更可以说是第一种方法的基础上来的。两种方法主要是配置细粒度的区别,如我每个服务的nacos地址都一样,那就可以采用第一种方式,直接一个pom文件配置所有地址;相反,如果我每个地址都有所区别,就可以采用第二种方式。但是总的来说两种方式并不矛盾冲突的,还是要根据实际项目需求进行不同的选择。