全程干貨分享:四個(gè)方法學(xué)會(huì)高效率配置管理!
Spring-boot 基于數(shù)據(jù)庫(kù)的配置管理
好的配置管理 是部署的第一步。
配置管理 做了什么
通常,應(yīng)用的 配置 在不同 部署 (預(yù)發(fā)布、生產(chǎn)環(huán)境、開發(fā)環(huán)境等等)間會(huì)有很大差異
這其中包括:
- 數(shù)據(jù)庫(kù),Redis,以及其他 后端服務(wù) 的配置
 - 第三方服務(wù)的Key,如 存儲(chǔ)、推送等
 - 每份部署特有的配置,如域名等
 
配置管理的 目標(biāo)
- 一份基準(zhǔn)代碼,多份部署,在環(huán)境中存儲(chǔ)配置
配置文件隨著納入版本控制系統(tǒng)提交,引起多個(gè)版本Profile管理。 - 統(tǒng)一管理
如果不統(tǒng)一管理,需要在多處修改配置,容易造成遺忘,也增加學(xué)習(xí)成本。 - 密鑰(配置)安全
判斷一個(gè)應(yīng)用是否正確地將配置排除在代碼之外,一個(gè)簡(jiǎn)單的方法是看該應(yīng)用的基準(zhǔn)代碼是否可以立刻開源,而不用擔(dān)心會(huì)暴露任何敏感的信息。 
配置管理的現(xiàn)行方案
| 方案 | 理由 | 可行性 | 
|---|---|---|
Configuration 代碼文件 | 
            代碼和配置混在一起,打包后,無(wú)法適配多個(gè)部署環(huán)境。 | × | 
| 配置文件 | 例如 Spring-boot . profile 管理, node.js 的 .env | 
            √ | 
| 基于數(shù)據(jù)庫(kù)管理 | 非常適用于第三方 key 的配置,內(nèi)部配置 并不便捷 | 
            √ | 
| 基于配置服務(wù) | Spring Cloud Config , nacos 等配置服務(wù) | 
            √ | 
基于數(shù)據(jù)庫(kù)的配置管理
Spring-boot 應(yīng)用配置管理方案(優(yōu)化版)
- 配置 Application.yml
 
配置DB 連接的環(huán)境變量 覆蓋 原Application.yml 的數(shù)據(jù)庫(kù)連接變量。
摘自: 12-Factor推薦將應(yīng)用的配置存儲(chǔ)于 環(huán)境變量 中( env vars, env )。環(huán)境變量可以非常方便地在不同的部署間做修改,卻不動(dòng)一行代碼;與配置文件不同,不小心把它們簽入代碼庫(kù)的概率微乎其微;與一些傳統(tǒng)的解決配置問題的機(jī)制(比如 Java 的屬性配置文件)相比,環(huán)境變量與語(yǔ)言和系統(tǒng)無(wú)關(guān)。
- 
    
基于數(shù)據(jù)庫(kù)管理(jm-settings)
2.1 設(shè)計(jì) Key-Value 表
 - CREATE TABLE `t_base_settings` (
 - `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
 - `keyword` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '關(guān)鍵詞, PAY.ALI PAY.MP',
 - `content` text COLLATE utf8mb4_unicode_ci COMMENT '配置內(nèi)容',
 - `created` bigint(20) DEFAULT NULL,
 - `updated` bigint(20) DEFAULT NULL,
 - `deleted` int(1) DEFAULT '0',
 - PRIMARY KEY (`id`)
 - ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='設(shè)置表';
 
2.2 Spring-boot @Bean 注入
聲明 Property
- /**
 - * 華為 OBS 配置
 - * @author <a href="https://github.com/keepcleargas/">keepcleargas</a>
 - * @version 1.0 Created in 2021/03/23 10:56
 - */
 - @Data
 - public class HuaweiObsProperties {
 - public static final String KEY = "huawei.obs";
 - private String accessKey;
 - private String secretKey;
 - private String endPoint;
 - /**
 - * 失效時(shí)間(分鐘)
 - */
 - private Long duration = 3600L;
 - /**
 - * buckets
 - */
 - private List<Bucket> buckets;
 - @Data
 - public static final class Bucket {
 - private Integer type;
 - private String bucketName;
 - }
 - @JsonIgnore
 - public String getBucketNameByType(Integer type) {
 - for (Bucket bucket : buckets) {
 - if (type.equals(bucket.getType())) {
 - return bucket.getBucketName();
 - }
 - }
 - throw new IllegalArgumentException("Bucket配置不全!");
 - }
 - }
 
Bean 注入類
- /**
 - * HuaweiObsProperties Bean 配置類
 - * @author <a href="https://github.com/keepcleargas/">keepcleargas</a>
 - * @version 1.0 Created in 2021/03/23 11:01
 - */
 - @Slf4j
 - @Configuration
 - public class HuaweiObsConfiguration {
 - @Resource
 - BaseSettingsService baseSettingsService;
 - @Bean(name = "huaweiObsProperties")
 - public HuaweiObsProperties getHuaweiObsProperties() {
 - HuaweiObsProperties huaweiObsProperties = baseSettingsService.getObjectByKeyword(HuaweiObsProperties.KEY, HuaweiObsProperties.class);
 - return huaweiObsProperties == null ? new HuaweiObsProperties() : huaweiObsProperties;
 - }
 - }
 
Bean 注入使用
- @Slf4j
 - @Service
 - public class HuaweiObsService {
 - @Resource
 - HuaweiObsProperties huaweiObsProperties;
 - //todo 調(diào)用即可
 - }
 
開源地址
| 項(xiàng)目名 | 描述 | 地址 | 
|---|---|---|
jm-settings | 
            基于 DB 的配置管理核心庫(kù) | https://github.com/jimoos-cn/... | 
huawei-obs | 
            基于 jm-settings 實(shí)現(xiàn)的華為obs 配置管理 | 
            https://github.com/jimoos-cn/... | 
















 
 
 









 
 
 
 