Spring 配置文件的炼金术:如何制造容器化时代的完美配方( 二 )

  • spring 文件夹: 下存放 xml 配置信息 , 比如常见的 JSF 配置 (jsf.xml), 以及其他需要通过 xml 配置注入的业务场景 。当然基于 springboot 官网建议,大家尽量用注解代码方式实现 bean 注入,尽量减少 xml 的方式 。
  • application.properties 文件: 该文件里通过核心的配置 spring.profiles.active=** 来标识当前是哪个 profile 环境 。当然一些其他全局类配置也可以放在此处 。需要注意 application.properties 文件需要配置在行云部署中分组配置里 , 因为此文件需要基于不同的部署分组进行文件覆盖,以改变 spring.profiles.active 的值,如下图所示 。当然,也可以通过运行时启动指令,进行不同的 profile 选择 。
  • important.properties 文件: 该文件为京东行云部署规约 , 把秘钥等安全性高的文件以加密存储的方式存放在该文件中,并部署到行云部署分组的远程配置里 。
  • 具体行云部署里的配置如下:
    Spring 配置文件的炼金术:如何制造容器化时代的完美配方

    文章插图
    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 转载请注明来源

    【Spring 配置文件的炼金术:如何制造容器化时代的完美配方】


    推荐阅读