在项目实际开发过程中,可能会有不同的环境,例如开发环境,测试环境和生产环境。不同的环境,对应的配置信息是不同的,将项目发布到不同的环境,需要去更改对应环境的配置信息,如果每次都是手动去更改环境,非常不友好,且容易漏掉配置,如果能够实现不同环境的自动识别,动态切换,将极大的提高工作效率。下面介绍一下自己在工作中使用到的多环境配置方法。
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.yml
和 application-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
通过环境变量的方式,不同环境的配置可以直接观察到,不太安全(当然可以将关键配置抽离成环境变量)。可以将配置文件全部放置在 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 创建对应配置文件:
其对应的配置文件完整内容如下:
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
上面两种方式都是不同的环境对应不同的配置中心,如果多个环境都是使用的同一个配置中心(使用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工程,可以通过命令 mvn -P
设置要使用的环境。
1、创建两个文件,分别为 application-dev.yml
和 application-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、测试运行服务:可以看到服务启动使用的环境为maven 命令指定的环境。
以上方法亲测有效。希望能够帮助到您!