目录:
- 业务场景
- 方案讨论
- 方案1: 启动指定配置
- 方案2: 打包指定配置
- 实现方案1
- 实现方案2
- 配置POM
- 配置application.yml
- 打包验证
- 总结
- 思考
- 留言
业务场景
正常项目开发有:开发环境、测试环境、预生产环境,正式环境。存在一个套代码,运行多套环境需求,比较极端情况是,一套代码被销售很多套,部署很多套,存在很多套线上环境,需要打包部署, 这里讨论是,不使用三方的配置中间件,比如Nacos,Eureka等,想实现一套比较优秀【安全,方便兼顾】解决方案.
方案讨论
方案1: 启动指定配置
通过springboot提供的配置spring.profiles.actvie,在项目启动的时候,指定环境启动, 例子:java -jar -Dspring.profiles.active=pro demo.jar
方案2: 打包指定配置
通过maven profiles实现,打包的时候指定环境打包,并且过滤掉其他环境配置,打包命令: mvn clean package -P pro
实现方案1
- 打包springboot项目:
mvn clean package
- 将打好的包上传服务器
- 通过命令行启动jar包:
java -jar -Dspring.profiles.active=pro xxx.jar
实现方案2
配置POM
- 项目继承spring-boot-starter-parent, pom配置:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.0.RELEASE</version>
</parent>
- 配置profiles
<profiles>
<profile>
<!-- 测试环境 -->
<id>dev</id>
<properties>
<profiles.active>dev</profiles.active>
<modifier>-dev</modifier>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<!-- 测试环境 -->
<id>test</id>
<properties>
<profiles.active>test</profiles.active>
<modifier>-test</modifier>
</properties>
</profile>
<profile>
<!-- 生产环境 -->
<id>pro</id>
<properties>
<profiles.active>pro</profiles.active>
<modifier>-pro</modifier>
</properties>
</profile>
</profiles>
- 打包过滤文件
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<excludes>
<exclude>application-*.yml</exclude>
</excludes>
</resource>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>application-${profiles.active}.yml</include>
</includes>
</resource>
</resources>
</build>
配置application.yml
spring:
profiles:
active: @profiles.active@
打包验证
- 执行打包命令:
mvn clean package -P pro
- 检查:
target/classes
目录下是否只有对应的环境配置
总结
- 方案1:
- 优点:只需要打包一次,可以实现动态切换环境运行。
- 缺点:打包的时候,会把多套环境配置,带到jar,存在数据泄露的分险
- 方案2:
- 优点:一套代码,可以实现动态切换运行,并且每次打包只有自己当前环境配置存在jar里面,保证配置数据安全
- 缺点:切换环境,需要重新打包
思考
- 如果公司有运维,正常情况下,线上的配置,不会写在代码里面,但是本地开发、测试,还是可以使用两套方案隔离开
- 如果公司比较小,没有运维,后台开发人员很少,可能一个,后台程序员充当运维,那就可以把线上环境配置到代码里面
留言
欢迎大家,留言讨论,记住前提是不使用三方的配置中间件,轻量级解决方案,能做到动态切换环境,且保证配置安全性的方案,目前我觉得方案比较完美,多次打包的缺点,可以通过构建工具【jenkins】解决痛点