king

全程干货分享:四个方法学会高效率配置管理!

king 运维技术 2022-11-11 451浏览 0

全程干货分享:四个方法学会高效率配置管理!

Spring-boot 基于数据库的配置管理

好的配置管理 是部署的第一步。

配置管理 做了什么

通常,应用的 配置 在不同 部署 (预发布、生产环境、开发环境等等)间会有很大差异

这其中包括:

  • 数据库,Redis,以及其他 后端服务 的配置
  • 第三方服务的Key,如 存储、推送等
  • 每份部署特有的配置,如域名等

配置管理的 目标

  • 一份基准代码,多份部署,在环境中存储配置 配置文件随着纳入版本控制系统提交,引起多个版本Profile管理。
  • 统一管理 如果不统一管理,需要在多处修改配置,容易造成遗忘,也增加学习成本。
  • 密钥(配置)安全 判断一个应用是否正确地将配置排除在代码之外,一个简单的方法是看该应用的基准代码是否可以立刻开源,而不用担心会暴露任何敏感的信息。

配置管理的现行方案

方案 理由 可行性
Configuration代码文件 代码和配置混在一起,打包后,无法适配多个部署环境。 ×
配置文件 例如Spring-boot.profile管理,node.js的.env
基于数据库管理 非常适用于第三方key的配置,内部配置 并不便捷
基于配置服务 Spring Cloud Config,nacos等配置服务

基于数据库的配置管理

Spring-boot 应用配置管理方案(优化版)

  1. 配置 Application.yml

    配置DB 连接的环境变量 覆盖 原Application.yml 的数据库连接变量。

    摘自: 12-Factor推荐将应用的配置存储于 环境变量 中( env vars, env )。环境变量可以非常方便地在不同的部署间做修改,却不动一行代码;与配置文件不同,不小心把它们签入代码库的概率微乎其微;与一些传统的解决配置问题的机制(比如 Java 的属性配置文件)相比,环境变量与语言和系统无关。

    1. 基于数据库管理(jm-settings)

      2.1 设计 Key-Value 表

      CREATETABLE`t_base_settings`(
      `id`int(11)unsignedNOTNULLAUTO_INCREMENT,
      `keyword`varchar(255)COLLATEutf8mb4_unicode_ciDEFAULTNULLCOMMENT'关键词,PAY.ALIPAY.MP',
      `content`textCOLLATEutf8mb4_unicode_ciCOMMENT'配置内容',
      `created`bigint(20)DEFAULTNULL,
      `updated`bigint(20)DEFAULTNULL,
      `deleted`int(1)DEFAULT'0',
      PRIMARYKEY(`id`)
      )ENGINE=InnoDBDEFAULTCHARSET=utf8mb4COLLATE=utf8mb4_unicode_ciCOMMENT='设置表';
      

      2.2 Spring-boot @Bean 注入

      声明Property

      /**
      *华为OBS配置
      *@author<ahref="https://github.com/keepcleargas/">keepcleargas</a>
      *@version1.0Createdin2021/03/2310:56
      */
      @Data
      publicclassHuaweiObsProperties{
      publicstaticfinalStringKEY="huawei.obs";
      privateStringaccessKey;
      privateStringsecretKey;
      privateStringendPoint;
      /**
      *失效时间(分钟)
      */
      privateLongduration=3600L;
      /**
      *buckets
      */
      privateList<Bucket>buckets;
      
      @Data
      publicstaticfinalclassBucket{
      privateIntegertype;
      privateStringbucketName;
      }
      
      @JsonIgnore
      publicStringgetBucketNameByType(Integertype){
      for(Bucketbucket:buckets){
      if(type.equals(bucket.getType())){
      returnbucket.getBucketName();
      }
      }
      thrownewIllegalArgumentException("Bucket配置不全!");
      }
      }
      

      Bean注入类

      /**
      *HuaweiObsPropertiesBean配置类
      *@author<ahref="https://github.com/keepcleargas/">keepcleargas</a>
      *@version1.0Createdin2021/03/2311:01
      */
      @Slf4j
      @Configuration
      publicclassHuaweiObsConfiguration{
      @Resource
      BaseSettingsServicebaseSettingsService;
      
      @Bean(name="huaweiObsProperties")
      publicHuaweiObsPropertiesgetHuaweiObsProperties(){
      HuaweiObsPropertieshuaweiObsProperties=baseSettingsService.getObjectByKeyword(HuaweiObsProperties.KEY,HuaweiObsProperties.class);
      returnhuaweiObsProperties==null?newHuaweiObsProperties():huaweiObsProperties;
      }
      }
      

      Bean注入使用

      @Slf4j
      @Service
      publicclassHuaweiObsService{
      
      @Resource
      HuaweiObsPropertieshuaweiObsProperties;
      //todo调用即可
      }
      

      开源地址

      项目名 描述 地址
      jm-settings 基于 DB 的配置管理核心库 https://github.com/jimoos-cn/…
      huawei-obs 基于jm-settings实现的华为obs 配置管理 https://github.com/jimoos-cn/…

继续浏览有关 数据库运维 的文章
发表评论