多环境配置

码匠君 ... 2021-10-28 大约 6 分钟

# 多环境配置

# 什么是多环境配置?

在实际项目开发过程中,我们往往需要区分开发,测试,联调,预发布,生产等不同的应用环境。这些应用环境用途不同,对应环境的配置项,稳定性,数据质量,保障性,可接触人群等要求也不同,比如 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>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

通过下面配置就可以指定当前默认的环境是哪个

<activation>
    <activeByDefault>true</activeByDefault>
</activation>
1
2
3

在开发和使用过程中,必须要配置一个默认的环境。配置完成之后,在 IDE 中也会提供可操作性界面进行操作。下图即为 IDEA 的界面示例:

profiles

# 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.ymlapplication-test.yml 配置文件。

当执行 java -jar xxx.jar --spring.profiles.actvie=prod 此时,系统将启用 application.ymlapplication-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
1
  • application.yml 中指定
spring:
  profiles:
    active: dev
1
2
3
  • 在 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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

# Nacos 多环境配置

本身没有提供统一的多环境管理。在 Nacos 中,本身有多个不同管理级别的概念,包括:Data ID,Group,Namespace。只要利用好这些层级概念的关系,就可以根据自己的需要来实现多环境的管理。

# Data Id

  1. Data Id的默认值为${spring.cloud.nacos.config.prefix}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}
  2. spring.cloud.nacos.config.prefix的默认值为${spring.application.name}
  3. spring.cloud.nacos.config.file-extension的默认值为properties
  4. spring.profiles.active未配置时,则匹配${spring.application.name}.properties
  5. 若设置了spring.profiles.activeNacos中存在${spring.application.name}.properties时,若还存在
  6. ${spring.application.name}-${spring.profiles.active}.properties,则默认匹配后者,若不存在,则会自动匹配前者 由于Nacos建议且默认用spring.application.name作为Data Id的前缀,若要在不同服务中共享项目统一配置,则可以通过配置spring.cloud.nacos.config.shared-dataidsspring.cloud.nacos.config.refreshable-dataids来添加共享配置,前者不支持自动刷新,后者支持

# Group

Group是一个很灵活的配置项,并没有固定的规定,可以用作多环境,多模块,多版本之间区分配置

# Namespace

使用命名空间来区分不同环境的配置,因为使用profilesgroup会是不同环境的配置展示到一个页面,而Nacos控制台对不同的Namespace做了Tab栏分组展示

Namespaces Tab

创建方式如下图所示

Namespaces Create

警告

配置 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>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

# Docker 和 K8S 多环境配置

DockerK8S的多环境,因为不同使用者使用的方式不同,Dante Cloud 并没有过多涉及。Dante Cloud 中,也简单定义了自己Docker多环境,涉及productiondevelopment两个环境,主要区别是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中进行配置。这里的环境配置主要解决以下问题:

  1. 传递参数:传递<profile.name><database.type>两个参数。
  • <profile.name>的值传递至bootstrap.yml中,这样就可以联动使用Spring BootNacos的多环境配置;
  • <database.type>参数,传递至bootstrap.yml中,用于指定具体使用的数据库配置
  1. 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 对应的提交信息,编译,开发者等相关信息。
  1. NacosSentinel Dashboard地址指定

指定不同环境下Nacos配置中心,服务发现和Sentinel Dashboard的地址,Nacos配置中心,服务发现地址无法写在Nacos的配置中,所以在此处进行设置。

# Dante Cloud 中的 Spring Boot 和 Nacos 多环境配置

  • 通过Spring Bootprofiles机制,实现Spring BootNacos的联动。
  • 利用NacosGroup信息,实现Nacos配置的多环境。${project_home}/platform/dante-cloud-monitor/resources/configs目录下,还有一级目录。这级目录的名称,是对应Nacos中的Group。所以在向Nacos导入配置时,一定要注意Group的创建和匹配。切勿全部导入到DEFAULT组下,这样会导致无法正常运行。
上次编辑于: 2022年7月30日 16:09
贡献者: herodotus , 码匠君