Spring配置文件的魔法炼金术:如何制造容器化时代的完美配方 | 京东物流技术团队
前言
基于现代服务的云原生十二要素理论,我们在采用容器化部署时,要保证同一个镜像可以满足不同环境的部署要求,而不是不同环境打包不同的景象。本文档主要介绍一种基于spring框架的满足不同环境配置的编译打包方案,满足同一个镜像可以在环境分组下通过启动项配置实现不同环境的部署。
现有方案及问题
我们见过最常见的配置文件管理方案,是基于Maven的profile配置来实现多环境切换的,它的弊端在于,我们将profile配置在pom.xml中,每次编译打包时,需要通过编译指令-P来标识当前环境配置。这样导致的问题是,我们打包的镜像具有了环境属性,不符合一个镜像多环境部署的要求。
还有一种配置方案,就是基于Spring profile进行配置文件管理。针对这两种方案,我接下来会进行一些分析和对比。
两种profiles配置的不同和优劣对比
a. 两种profiles方案对比
pom.xml
文件中定义多个 profile,并使用 Maven 命令行参数或其他配置来激活特定的 profile。 pom.xml
文件中定义和管理多个 profile。 application.properties
的 profile 配置: application.properties
文件可以根据激活的 profile 来加载不同的配置。可以在application.properties
文件中定义多个 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。 - 容器友好性:在容器化的部署场景中,通常使用容器编排工具(如 Kubernetes)来管理应用程序的配置和部署。使用
application.properties
的 profile 配置方式,可以通过环境变量或配置文件中的属性来指定激活的 profile,从而实现与容器编排工具的集成。
综上所述,使用 Spring 的 application.properties 的 profile 配置方式更适合云原生和容器化的部署场景,因为它提供了环境无关性、配置集中化和容器友好性的优势。
基于properties的多环境配置方案实践
以下方案以springboot为例,当然springMVC方案也是可以适配,只是需要额外配置一下,介于我们新项目基本都是基于springboot搭建,此处不展开springMVC的实线方案,如有需要,我再额外提供mvc的配置方案。
a. 配置文件树
如上图所示
- properties文件夹:我们在properties文件夹下,基于不同的环境,简历单独文件夹,比如dev,online, test, uat等,每个文件夹下存放当前环境的配置信息。
- spring文件夹: 下存放xml配置信息,比如常见的JSF配置(jsf.xml),以及其他需要通过xml配置注入的业务场景。当然基于springboot官网建议,大家尽量用注解代码方式实现bean注入,尽量减少xml的方式。
- application.properties文件: 该文件里通过核心的配置spring.profiles.active=**来标识当前是哪个profile环境。当然一些其他全局类配置也可以放在此处。需要注意application.properties文件需要配置在行云部署中分组配置里,因为此文件需要基于不同的部署分组进行文件覆盖,以改变spring.profiles.active的值,如下图所示。当然,也可以通过运行时启动指令,进行不同的profile选择。
- important.properties文件: 该文件为京东行云部署规约,把秘钥等安全性高的文件以加密存储的方式存放在该文件中,并部署到行云部署分组的远程配置里。
具体行云部署里的配置如下:
b. properties文件加载
正常情况下,properties/**/*.properties下的配置文件是不会自动加载到启动项里的。所以需要通过额外的方式动态加载,具体方法是通过spring框架下的PropertySourcesPlaceholderConfigurer的类属性,结合环境变量,动态批量加载配置文件。(额外说明,如果是springMVC框架,也可以通过xml配置context:property-placeholder属性来实现。)
具体代码如下:
/** * 配置文件环境配置 * * @Author zhaoyongping * @date 2023/7/10 15:13 * @ClassName EnvPropertiesConfig * @Descripiton 配置文件环境配置 **/ @Configuration public class EnvPropertiesConfig { /** * 加载属性配置 * * @param environment 环境属性 * @return PropertySourcesPlaceholderConfigurer * @author zhaoyongping * @date 2023/7/10 15:13 * @description 加载属性配置 */ @Bean public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfig(Environment environment) throws IOException { PropertySourcesPlaceholderConfigurer config = new PropertySourcesPlaceholderConfigurer(); String[] activeProfiles = environment.getActiveProfiles(); if (activeProfiles.length > 0) { String resourceUrl = "classpath:properties/" + environment.getActiveProfiles()[0] + "/*.properties"; config.setLocations( new PathMatchingResourcePatternResolver().getResources(resourceUrl)); } else { //兜底策略 config.setLocations( new PathMatchingResourcePatternResolver() .getResources("classpath:properties/dev/*.properties")); } return config; } }
总结
通过以上步骤,我们可以实现编译打包镜像不需要跟环境变量绑定,而只需要在启动运行时基于不同的分组动态配置的applicaiton.properties文件,来实现不同环境的适配。这种可以在运行时变更配置文件的机制,更适合在云原生时代下的容器化部署方案,也利于我们的服务的可移植性。当然,以上只是笔者个人的一个实践经验,并不能代表它是最优实践方案。
作者:京东物流 赵勇萍
来源:京东云开发者社区 自猿其说Tech 转载请注明来源

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
UData+StarRocks在京东物流的实践 | 京东物流技术团队
1 背景 数据服务与数据分析场景是数据团队在数据应用上两个大的方向,行业内大家有可能会遇到下面的问题: 1.1 数据服务 烟囱式开发模式:每来一个需求开发一个数据服务,数据服务无法复用,难以平台化,技术上无法积累 服务维护难度大:当开发了大量数据服务后,后期维护是大问题,尤其是618、双11大促期间,在没有统一的监控、限流、灾备方案的情况下一个人维护上百个数据服务是一件很痛苦的事,也造成了很大的安全隐患 业务需求量大:数据开发的同学常常会被大量重复枯燥的数据服务开发束缚,大量的时间投入在业务数据服务开发中 1.2 数据分析 找数据难:用户难以找到自己想要,即便找到名称相近的指标或数据,由于指标口径不明确也不统一也无法直接使用 用数难:由于目前数据分布在各个系统中,用户无法用一个系统满足所有的数据需求。特别是一线运营人员要通过每个从各个系统导出大量Excel的方式做数据分析,费时费力,同时也造成数据安全隐患 查询慢:用传统的Olap引擎,用户跑SQL往往需要几分钟才出结果,大大降低了分析人员的效率。 查询引擎不统一:系统可能有多种查询引擎组成,每一种查询引擎都有自己的DSL,增大了用户的...
- 下一篇
京东广告研发近期入选国际顶会文章系列导读——CIKM 2023篇
近年来,放眼业界广告推荐领域的算法获得了长足的发展,从几篇奠定基础的序列学习、大规模图学习、在线学习&增强学习、多模态推荐问题等起步,业内算法不断迭代发展并在学术和工业场景上取得不错的应用。 京东广告团队不仅在工业场景上非常重视实践,并不断为由“广告主”、“消费者”、“京东”三方的生态正循环中进行技术加码,提供更优的匹配效率、更好的用户体验、更健康的广告生态建设。此外,在近期的学术会议CIKM 2023 (Conference on Information and Knowledge Management )上也在这几个领域发表了学术论文,获得了学术领域的认可。 一、近年来广告算法发展及要突破的问题 排序算法、多模态算法是推荐系统中的关键组成部分,用于根据用户的兴趣和历史行为来推荐个性化内容。以下是近年来的演进: 1. 深度学习方法的兴起: 近年来,深度学习在排序算法中的应用迅速增加。通过使用深度神经网络来建模用户和物品之间的复杂关系,推荐系统能够更准确地理解用户的兴趣。这些方法包括各种神经网络架构,如卷积神经网络(CNN)、循环神经网络(RNN)和自注意力机制(Transfo...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS7安装Docker,走上虚拟化容器引擎之路
- Linux系统CentOS6、CentOS7手动修改IP地址
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS关闭SELinux安全模块
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Hadoop3单机部署,实现最简伪集群
- CentOS6,7,8上安装Nginx,支持https2.0的开启