SpringBoot --多环境配置文件动态切换

多环境配置

​ 在项目实际开发过程中,可能会有不同的环境,例如开发环境,测试环境和生产环境。不同的环境,对应的配置信息是不同的,将项目发布到不同的环境,需要去更改对应环境的配置信息,如果每次都是手动去更改环境,非常不友好,且容易漏掉配置,如果能够实现不同环境的自动识别,动态切换,将极大的提高工作效率。下面介绍一下自己在工作中使用到的多环境配置方法。

环境变量控制

​ SpringBoot打包服务时,一些参数需要从外界获取,可以通过在配置文件中配置环境变量实现:

spring:
  datasource:
      driverClassName: com.mysql.cj.jdbc.Driver
      url: jdbc:mysql://${DB_HOST:localhost}:${DB_PORT:3306}/${DB_NAME:table}?useUnicode=true&characterEncoding=UTF-8
      username: ${DB_USER:root}
      password: ${DB_PASSWORD:root}

​ 上面案例中,${DB_HOST:localhost} 服务会先在系统环境变量 DB_HOST 中获取值,如果获取不到则使用默认值 localhost

​ 我们可以利用系统环境变量读取机制,在不同环境下给变量配置不同值,通过读取对应变量的值,获取不同的运行配置文件:

​ 1、建立两个文件,分别为 application-dev.ymlapplication-prod.yml 分别代表开发环境和生产环境的配置:

# 开发环境的配置 application-dev.yml
server:
  port: 6770
spring:
  application:
    name: order-service
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: 123456
    url: jdbc:mysql://127.0.0.1:3306/seata_test?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        register-enabled: true
        namespace: 18cc53ad-c5ea-4396-892b-46d56ccde9e1
      config:
        server-addr: 127.0.0.1:8848
        enabled: true
        file-extension: yaml
        namespace: 18cc53ad-c5ea-4396-892b-46d56ccde9e1

# 生产环境的配置 application-prod.yml
server:
  port: 6771
spring:
  application:
    name: order-service
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root_pro
    password: root_pro
    url: jdbc:mysql://113.116.28.182:3306/seata_test?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true
  cloud:
    nacos:
      discovery:
        server-addr: 113.116.28.182:8848
        register-enabled: true
        namespace: 4780f343-39df-49f4-9bac-cad0543b3658
      config:
        server-addr: 113.116.28.182:8848
        enabled: true
        file-extension: yaml
        namespace: 4780f343-39df-49f4-9bac-cad0543b3658

​ 2、创建 application.yml 文件,里面就只有简单的配置:

spring:
  profiles:
    active: ${ORDER_PROFILES_ACTIVE:pro} # 读取环境变量的值,使用不同的配置文件,默认生产环境

​ 3、配置系统环境变量,此处为 ORDER_PROFILES_ACTIVE=dev

​ 配置成功后,idea中可以观察到该变量:

4、测试,运行服务,观察使用的配置文件:

注意:如果使用的 linux 物理机, 使用 vim /etc/profile 命令,添加上一下配置:

  SPRING_PROFILES_ACTIVE=prod
  export SPRING_PROFILES_ACTIVE

host 配置控制

​ 通过环境变量的方式,不同环境的配置可以直接观察到,不太安全(当然可以将关键配置抽离成环境变量)。可以将配置文件全部放置在 nacos 中,然后通过统一的域名访问 nacos 服务器,在不同的环境配置域名对应的host ,指向不同的nacos服务器地址,从而读取对应的配置。

​ 1、创建 bootstrap.yml 文件:

spring:
  cloud:
    nacos:
      config:
        server-addr: nacos.connection.com:8848 # 使用域连接nacos,获取配置信息
        enabled: true
        file-extension: yaml
        namespace: 18cc53ad-c5ea-4396-892b-46d56ccde9e1
        prefix: storage

​ 2、nacos 创建对应配置文件:SpringBoot --多环境配置文件动态切换_第1张图片
​ 其对应的配置文件完整内容如下:

server:
  port: 6771
spring:
  application:
    name: storage-service
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: 123456
    url: jdbc:mysql://127.0.0.1:3306/seata_test?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true
  cloud:
    nacos:
      discovery:
        server-addr: nacos.connection.com:8848
        register-enabled: true
        namespace: 18cc53ad-c5ea-4396-892b-46d56ccde9e1


seata:
  enabled: true
  application-id: ${spring.application.name}
  # 事务群组(可以每个应用独立取名,也可以使用相同的名字),要与服务端service.vgroupMapping的后缀对应
  # 此处对应 service.vgroupMapping.storage-service
  tx-service-group: ${spring.application.name}
  config:
    type: nacos
    # 需要和seata-server在同一个注册中心下
    nacos:
      namespace: 920779ab-6745-4305-89c8-75e37d1cd0ad
      serverAddr: nacos.connection.com:8848
      # 需要和seata-server(registry和config)配置保持一致
      group: SEATA_GROUP
      username: "nacos"
      password: "nacos"
  registry:
    type: nacos
    nacos:
      # 需要和seata-server保持一致,默认为seata-server
      application: seata-server
      server-addr: nacos.connection.com:8848
      group: SEATA_GROUP
      namespace: 920779ab-6745-4305-89c8-75e37d1cd0ad
      username: "nacos"
      password: "nacos"

mybatis:
  mapper-locations: classpath:mapping/*.xml  #注意:一定要对应mapper映射xml文件的所在路径
  type-aliases-package: com.jidi.alibaba.seata.storage.entity  # 注意:对应实体类的路径
  configuration:
    call-setters-on-nulls: true
    # 开启驼峰映射
    map-underscore-to-camel-case: true

​ 3、更改host文件:

# 对应本地开发环境
127.0.0.1 nacos.connection.com

​ 4、测试,运行服务:​ SpringBoot --多环境配置文件动态切换_第2张图片

nacos控制

​ 上面两种方式都是不同的环境对应不同的配置中心,如果多个环境都是使用的同一个配置中心(使用nacos作为配置中心),那么可以通过 dataId 实现不同环境的隔离。

​ 1、创建 bootstrap.yml 文件:

spring:
  profiles:
    active: ${BUSINESS_PROFILES_ACTIVE:pro}
  cloud:
    nacos:
      config:
        server-addr: nacos.connection.com:8848 # 使用域连接nacos,获取配置信息
        enabled: true
        file-extension: yaml
        namespace: 18cc53ad-c5ea-4396-892b-46d56ccde9e1
        prefix: business

​ 2、创建环境变量 BUSINESS_PROFILES_ACTIVE

​ ​3、在nacos中分别创建不同环境的配置文件,通过 dataId 进行区分:

注意:在 Nacos 中,dataid 完整格式如下:${prefix}-${spring.profiles.active}.${file-extension},通俗一点就是前缀-环境-扩展名

​ 1、prefix:默认为 spring.application.name,的值,也可以通过配置项 spring.cloud.nacos.config.prefix 来配置;

​ 2、active:是配置开发环境的值。**注意:**当 spring.profile.active 为空时,对应的连接符也将不存在,dataId 的拼接格式变成:${prefix}.${file-extension}

​ 3、file-extension:配置文件类型,默认是 properties


maven控制

​ 如果项目是maven工程,可以通过命令 mvn -P 设置要使用的环境。

​ 1、创建两个文件,分别为 application-dev.ymlapplication-prod.yml 分别代表开发环境和生产环境的配置:

# application-dev.yml
server:
  port: 6770
spring:
  application:
    name: order-service
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: 123456
    url: jdbc:mysql://127.0.0.1:3306/seata_test?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        register-enabled: true
        namespace: 18cc53ad-c5ea-4396-892b-46d56ccde9e1
      config:
        server-addr: 127.0.0.1:8848
        enabled: true
        file-extension: yaml
        namespace: 18cc53ad-c5ea-4396-892b-46d56ccde9e1


# application-pro.yml
server:
  port: 7770
spring:
  application:
    name: order-service
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: 123456
    url: jdbc:mysql://127.0.0.1:3306/seata_test?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        register-enabled: true
        namespace: 18cc53ad-c5ea-4396-892b-46d56ccde9e1
      config:
        server-addr: 127.0.0.1:8848
        enabled: true
        file-extension: yaml
        namespace: 18cc53ad-c5ea-4396-892b-46d56ccde9e1    

​ 2、创建 application.yml 文件:

spring:
  profiles:
    active: ${ORDER_PROFILES_ACTIVE:pro} # 读取环境变量的值,使用不同的配置文件,默认生產环境

​ 3、pom 文件增加maven配置:

 <profiles>
        <profile>
            <id>devid>
            <properties>
                <profileActive>devprofileActive>
            properties>
            
            <activation>
                <activeByDefault>trueactiveByDefault>
            activation>
        profile>
        <profile>
            <id>testid>
            <properties>
                <profileActive>testprofileActive>
            properties>
        profile>
        <profile>
            <id>proid>
            <properties>
                <profileActive>proprofileActive>
            properties>
        profile>
    profiles>

​ 4、maven 打包命令加上 -P dev

​ 5、测试运行服务:SpringBoot --多环境配置文件动态切换_第3张图片可以看到服务启动使用的环境为maven 命令指定的环境。



以上方法亲测有效。希望能够帮助到您!

你可能感兴趣的:(spring,boot,java,spring,boot)