多环境配置
什么是多环境配置?
在实际项目开发过程中,我们往往需要区分开发,测试,联调,预发布,生产等不同的应用环境。这些应用环境用途不同,对应环境的配置项,稳定性,数据质量,保障性,可接触人群等要求也不同,比如 Swagger 一般上在生产时是关闭的;不同环境数据库地址,端口号等都是不尽相同的。要是没有多环境的自由切换,部署起来是很繁琐也容易出错的。
使用多环境配置,可以针对不同的应用环境,提前配置好对应的环境配置信息。在使用时,仅需要修改具体的环境名称,就可以把对应环境配置信息,系统参数等相关内容全部切换。不仅使用便捷,还极大地降低了手工修改参数的出错率。
Maven 多环境配置
使用Maven
可以通过在pom.xml
中增加<profiles>
配置进行多环境的配置。参见以下示例:
<profiles>
<profile>
<id>development</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
...
</properties>
</profile>
<profile>
<id>produtction</id>
<properties>
...
</properties>
</profile>
<profile>
<id>testing</id>
<properties>
...
</properties>
</profile>
</profiles>
通过下面配置就可以指定当前默认的环境是哪个
<activation>
<activeByDefault>true</activeByDefault>
</activation>
在开发和使用过程中,必须要配置一个默认的环境。配置完成之后,在 IDE 中也会提供可操作性界面进行操作。下图即为 IDEA 的界面示例:
Spring Boot 多环境配置
Spring Boot 环境设置机制
spring.profiles.active
属性可以为我们指定当前设置的环境,以此来选择我们的配置文件。例如我们有配置文件
- application.yml
- application-dev.yml
- application-test.yml
- application-prod.yml
当执行 java -jar xxx.jar --spring.profiles.actvie=test
此时,系统将启用 application.yml
和 application-test.yml
配置文件。
当执行 java -jar xxx.jar --spring.profiles.actvie=prod
此时,系统将启用 application.yml
和 application-prod.yml
配置文件。
正是这种配置参数可以决定我们使用哪种配置文件,如果我们把不同环境的配置写在对应的配置文件中,我们就可以实现多环境机制。
配置多环境
正如上一点所述,我们配置不同的配置文件
- application.yml
- application-dev.yml(开发环境)
- application-test.yml(测试环境)
- application-uat.yml(预发布环境)
- application-prod.yml(生产环境)
指定环境
- 在 cmd 命令中指定
java -jar xxx.jar --spring.profiles.actvie=dev
- 在
application.yml
中指定
spring:
profiles:
active: dev
- 在 IDEA 编辑器中指定
在运行按钮(绿色三角形按钮)旁边选择 Edit Configurations...
,在弹出的对话框中 Active profiles
输入 dev
或其他即可。
注意
这种方法只有在本地调试的时候才生效。
单一文件写法
spring:
application:
name: @artifactId@
profiles:
active: develpment
...
---
# 开发环境配置
spring:
config:
activate:
on-profile: develpment
---
# 生产环境配置
spring:
config:
activate:
on-profile: production
Nacos 多环境配置
本身没有提供统一的多环境管理。在 Nacos 中,本身有多个不同管理级别的概念,包括:Data ID,Group,Namespace。只要利用好这些层级概念的关系,就可以根据自己的需要来实现多环境的管理。
Data Id
Data Id
的默认值为${spring.cloud.nacos.config.prefix}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}
spring.cloud.nacos.config.prefix
的默认值为${spring.application.name}
spring.cloud.nacos.config.file-extension
的默认值为properties
- 当
spring.profiles.active
未配置时,则匹配${spring.application.name}.properties
- 若设置了
spring.profiles.active
而Nacos
中存在${spring.application.name}.properties
时,若还存在 ${spring.application.name}-${spring.profiles.active}.properties
,则默认匹配后者,若不存在,则会自动匹配前者
由于Nacos
建议且默认用spring.application.name
作为Data Id
的前缀,若要在不同服务中共享项目统一配置,则可以通过配置spring.cloud.nacos.config.shared-dataids
或spring.cloud.nacos.config.refreshable-dataids
来添加共享配置,前者不支持自动刷新,后者支持
Group
Group
是一个很灵活的配置项,并没有固定的规定,可以用作多环境,多模块,多版本之间区分配置
Namespace
使用命名空间来区分不同环境的配置,因为使用profiles
或group
会是不同环境的配置展示到一个页面,而Nacos
控制台对不同的Namespace
做了Tab
栏分组展示
创建方式如下图所示
警告
配置 Namespace 的时候不是通过名称,而是通过命名空间的 ID(上图所示),可通过如下配置来设置服务使用的命名空间
<profile>
<id>docker</id>
<properties>
<!--当前环境-->
<profile.name>docker</profile.name>
<!--数据库类型-->
<database.type>postgresql</database.type>
<!--代码构建控制-->
<!--跳过构建源代码包-->
<skip.build.source.package>false</skip.build.source.package>
<!--不copy代码包到docker构建目录-->
<skip.copy.docker.resource>false</skip.copy.docker.resource>
<!--不执行git commit 构建-->
<skip.build.git.commit.info>false</skip.build.git.commit.info>
<!--Nacos配置中心地址-->
<config.server-addr>192.168.101.10:8848</config.server-addr>
<!--Nacos配置中心命名空间,用于支持多环境.这里必须使用ID,不能使用名称,默认为空-->
<config.namespace></config.namespace>
<!--Nacos服务发现地址-->
<discovery.server-addr>192.168.101.10:8848</discovery.server-addr>
<sentinel.server-addr>192.168.101.10:8858</sentinel.server-addr>
</properties>
</profile>
Docker 和 K8S 多环境配置
Docker
和K8S
的多环境,因为不同使用者使用的方式不同,Dante Cloud 并没有过多涉及。Dante Cloud 中,也简单定义了自己Docker
多环境,涉及production
和development
两个环境,主要区别是production
环境 docker 打包会包含Skywalking Agent
,而development
环境 docker 打包只会包含应用,通过执行不同的docker-compose
文件进行区分仅此而已。如果不使用Skywalking
,使用development
环境打包 docker 即可。
Dante Cloud 的多环境配置
微服务架构涉及多方面内容,Dante Cloud的为解决多环境,综合使用Maven
,Spring Boot
以及Nacos
多环境的特点,以支持微服务的多环境切换和多种数据库的配置支持。
Dante Cloud 中的 Maven 多环境配置
Dante Cloud Maven 多环境配置,在工程根目录下的pom.xml
中进行配置。这里的环境配置主要解决以下问题:
- 传递参数:传递
<profile.name>
和<database.type>
两个参数。
<profile.name>
的值传递至bootstrap.yml
中,这样就可以联动使用Spring Boot
和Nacos
的多环境配置;<database.type>
参数,传递至bootstrap.yml
中,用于指定具体使用的数据库配置
- Dashboard:通过
<skip.build.source.package>
,<skip.copy.docker.resource>
和<skip.build.git.commit.info>
三个参数进行打包控制。
<skip.build.source.package>
控制是否构建源代码包:构建源代码包便于调试dante-cloud-athena
的调试。<skip.copy.docker.resource>
控制是否拷贝服务 jar 包:编译完成后,将可执行额外操作,将服务 jar 包拷贝到统一的 docker build context 下,使用统一配置 build docker,这样就不必每一个服务都编写Dockerfile
<skip.build.git.commit.info>
控制是否生成 Git 信息:是否将 Git commit 等相关信息在编译打包时,写入到 jar 包中。写入 Git commit 等相关信息,可以便于在运维过程中快速区分不同 jar 对应的提交信息,编译,开发者等相关信息。
Nacos
和Sentinel Dashboard
地址指定:
指定不同环境下Nacos
配置中心,服务发现和Sentinel Dashboard
的地址,Nacos
配置中心,服务发现地址无法写在Nacos
的配置中,所以在此处进行设置。
Dante Cloud 中的 Spring Boot 和 Nacos 多环境配置
- 通过
Spring Boot
的profiles
机制,实现Spring Boot
与Nacos
的联动。 - 利用
Nacos
的Group
信息,实现Nacos
配置的多环境。${project_home}/platform/dante-cloud-monitor/resources/configs
目录下,还有一级目录。这级目录的名称,是对应Nacos
中的Group
。所以在向Nacos
导入配置时,一定要注意Group
的创建和匹配。切勿全部导入到DEFAULT
组下,这样会导致无法正常运行。