前言基于现代服务的云原生十二要素理论,我们在采用容器化部署时,要保证同一个镜像可以满足不同环境的部署要求,而不是不同环境打包不同的景象 。本文档主要介绍一种基于 spring 框架的满足不同环境配置的编译打包方案 , 满足同一个镜像可以在环境分组下通过启动项配置实现不同环境的部署 。
现有方案及问题我们见过最常见的配置文件管理方案,是基于 Maven 的 profile 配置来实现多环境切换的 , 它的弊端在于 , 我们将 profile 配置在 pom.xml 中,每次编译打包时,需要通过编译指令 - P 来标识当前环境配置 。这样导致的问题是 , 我们打包的镜像具有了环境属性 , 不符合一个镜像多环境部署的要求 。
还有一种配置方案 , 就是基于 Spring profile 进行配置文件管理 。针对这两种方案,我接下来会进行一些分析和对比 。
两种 profiles 配置的不同和优劣对比a. 两种 profiles 方案对比
1. Maven 的 profiles:
? Maven 的 profiles 是在构建时根据环境或其他条件激活不同的配置集合 。可以在项目的pom.xml文件中定义多个 profile,并使用 Maven 命令行参数或其他配置来激活特定的 profile 。
? 优势:
? 灵活性高,可以根据不同的构建环境或条件激活不同的 profile 。
? 可以在构建过程中使用不同的依赖、插件配置等 。
? 劣势:
? 配置相对分散,需要在 Maven 的pom.xml文件中定义和管理多个 profile 。
? 配置与代码分离,不够直观 。
2. Spring 的Application.properties的 profile 配置:
? Spring 的application.properties文件可以根据激活的 profile 来加载不同的配置 。可以在application.properties文件中定义多个 profile 下的配置,并使用配置文件或环境变量来激活特定的 profile 。
? 优势:
? 配置集中,可以在一个文件中定义多个 profile 下的配置 , 更易于管理和维护 。
? 配置与代码相近 , 更直观易读 。
? 劣势:
? 激活 profile 的方式相对有限,通常需要通过配置文件或环境变量来指定 。
? 不适用于构建过程中的配置,主要用于应用程序的运行配置 。
总的来说,Maven profiles 更适用于构建过程中的配置,可以根据构建环境或条件激活不同的 profile,而 Spring 的application.properties的 profile 配置更适用于应用程序的运行配置,可以根据不同的 profile 加载不同的配置 。具体选择哪种方式取决于你的需求和偏好 。
b. 在云原生和容器化的部署场景分析
在云原生和容器化的部署场景下,我更倾向使用 Spring 的application.properties的 profile 配置方式 。
以下是在云原生和容器化部署场景下 , 使用application.properties的 profile 配置方式的优势:
- 环境无关性:application.properties可以根据激活的 profile 加载不同的配置,使得应用程序在不同的环境中运行时具有一致的行为 。这对于云原生和容器化的部署非常重要,因为应用程序可能需要在不同的环境(例如开发、测试、生产)中运行 。
- 配置集中化:使用application.properties的 profile 配置方式 , 可以在一个文件中定义多个 profile 下的配置,使得配置管理更加集中和方便 。这对于云原生和容器化的部署场景非常有帮助,因为可以根据不同的 profile 加载适当的配置,而无需分散地管理多个 Maven profiles 。
- 容器友好性:在容器化的部署场景中 , 通常使用容器编排工具(如 Kube.NETes)来管理应用程序的配置和部署 。使用application.properties的 profile 配置方式,可以通过环境变量或配置文件中的属性来指定激活的 profile,从而实现与容器编排工具的集成 。
基于 properties 的多环境配置方案实践以下方案以 springboot 为例,当然 springMVC 方案也是可以适配,只是需要额外配置一下,介于我们新项目基本都是基于 springboot 搭建,此处不展开 springMVC 的实线方案 , 如有需要,我再额外提供 mvc 的配置方案 。
a. 配置文件树
文章插图
如上图所示
- properties 文件夹:我们在 properties 文件夹下,基于不同的环境 , 简历单独文件夹,比如 dev , online, test, uat 等,每个文件夹下存放当前环境的配置信息 。
推荐阅读
- 事务管理 vs. 锁控制:你真的分得清吗?
- 彻底解决Spring Cloud Gateway中Body读取问题
- 优雅实现API接口开关:让你的应用更可控
- 聊聊常见的限流算法有哪些?
- 网络故障的隐形元凶:MTU配置你了解吗?
- 一图看懂四种接收实时数据更新的设计
- 深入Rust的模式匹配与枚举类型
- 让你开发更舒适的 Tailwind 技巧
- 深入探索Python itertools库的五大常用方法
- Linux中sed命令的五个高级用法