Spring-boot 基于数据库的配置管理
好的配置管理 是部署的第一步。
配置管理 做了什么
通常,应用的 配置 在不同 部署 (预发布、生产环境、开发环境等等)间会有很大差异
这其中包括:
- 数据库,Redis,以及其他 后端服务 的配置
- 第三方服务的Key,如 存储、推送等
- 每份部署特有的配置,如域名等
配置管理的 目标
- 一份基准代码,多份部署,在环境中存储配置
配置文件随着纳入版本控制系统提交,引起多个版本
Profile管理。
- 统一管理 如果不统一管理,需要在多处修改配置,容易造成遗忘,也增加学习成本。
- 密钥(配置)安全 判断一个应用是否正确地将配置排除在代码之外,一个简单的方法是看该应用的基准代码是否可以立刻开源,而不用担心会暴露任何敏感的信息。
配置管理的现行方案
方案 | 理由 | 可行性 |
---|---|---|
Configuration代码文件 |
代码和配置混在一起,打包后,无法适配多个部署环境。 | × |
配置文件 | 例如Spring-boot. |
√ |
基于数据库管理 | 非常适用于第三方key的配置,内部配置 并不便捷 |
√ |
基于配置服务 | Spring Cloud Config, |
√ |
基于数据库的配置管理
Spring-boot 应用配置管理方案(优化版)
- 配置 Application.yml
配置DB 连接的环境变量 覆盖 原Application.yml 的数据库连接变量。
摘自: 12-Factor推荐将应用的配置存储于 环境变量 中( env vars, env )。环境变量可以非常方便地在不同的部署间做修改,却不动一行代码;与配置文件不同,不小心把它们签入代码库的概率微乎其微;与一些传统的解决配置问题的机制(比如 Java 的属性配置文件)相比,环境变量与语言和系统无关。
-
基于数据库管理(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/…
-
转载请注明:IT运维空间 » 运维技术 » 全程干货分享:四个方法学会高效率配置管理!
发表评论