# SpringBoot 多环境部署 profile(开发环境/生产环境)

# 多环境部署

基本上有以下几个环境:

  • 开发环境:dev

    开发的时候使用

  • 测试环境:test

    部署到测试环境使用

  • 生产环境:prod

    生产环境使用

还要一些公司分得细,在测试环境和生产环境中间还有一个 预发布环境

分不同的环境,目的是需要修改一些配置,比如数据库配置、消息队列配置等。

# boot 多环境支持 profile

  • application.yml:主配置文件
  • application-{name}.yml:环境配置(挂件)

通过配置项: spring.profiles.active:{name} 来激活对应的配置文件

在 application.yml 中增加 dev 的激活,也就是说:默认是 dev 环境

spring:
  profiles:
    active: dev
1
2
3

application-prod.yml

spring:
  datasource:
    url: jdbc:mysql://192.168.56.108:3306/foodie-shop-dev?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true
    username: root
    password: root
1
2
3
4
5

当前项目比较简单,要修改的配置文件也比较少。这里主要说配置文件技巧:

  • application.yml:保留全部的配置,只有开放环境需要配置的除外

    比如:myabtis 的日志打印,只有开放环境下需要配置,如果默认配置中也配置上了,那么在 prod 里面就无法取消了,因为如果是空值,应该会报错

    mybatis:
      type-aliases-package: cn.mrcode.foodiedev.pojo    # 实体层
      mapper-locations: classpath:mapper/*.xml          # mapper 层
      configuration:
        log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    
    1
    2
    3
    4
    5

    那么这种情况下如何做呢?默认配置只保留如下配置即可,剩余在在 dev 中开启,而 prod 中不需要,则不配置即可

    mybatis:
      type-aliases-package: cn.mrcode.foodiedev.pojo    # 实体层
      mapper-locations: classpath:mapper/*.xml          # mapper 层
    
    1
    2
    3
  • application-dev.yml:只需要在 dev 环境下需要更改的配置

这样做的好处是:

  1. 当你的配置很多的时候,各种环境能比较清晰的知道哪些配置是更改了的

  2. 当新增或则减少配置时,能话最小的代价去维护

    比如:公共配置中的配置,在 dev 和 prod 中都没有覆盖,那么只需要维护公共配置文件中的内容即可,而不需要维护所有环节的配置文件内容

# profiles 需要更改的地方梳理

由于当前阶段项目中某些配置写得不够好,还需要手动硬编码,这里做一个梳理

  1. 在 prod 配置文件中修改的有:
    1. 数据源配置
    2. mybatis 日志打印
  2. 项目中直接需要硬编码改变的配置有
    1. cn.mrcode.foodiedev.resource.FileUpload 图片加载的配置文件,图片存储目录和图片服务器路径
    2. BaseController 中硬编码的支付中心地址、回调地址信息