全程干貨分享:四個方法學會高效率配置管理!
作者:積墨開源
好的配置管理 是部署的第一步,通常,應用的 配置 在不同 部署 (預發(fā)布、生產環(huán)境、開發(fā)環(huán)境等等)間會有很大差異。
Spring-boot 基于數據庫的配置管理
好的配置管理 是部署的第一步。
配置管理 做了什么
通常,應用的 配置 在不同 部署 (預發(fā)布、生產環(huán)境、開發(fā)環(huán)境等等)間會有很大差異
這其中包括:
- 數據庫,Redis,以及其他 后端服務 的配置
- 第三方服務的Key,如 存儲、推送等
- 每份部署特有的配置,如域名等
配置管理的 目標
- 一份基準代碼,多份部署,在環(huán)境中存儲配置
配置文件隨著納入版本控制系統(tǒng)提交,引起多個版本Profile
管理。 - 統(tǒng)一管理
如果不統(tǒng)一管理,需要在多處修改配置,容易造成遺忘,也增加學習成本。 - 密鑰(配置)安全
判斷一個應用是否正確地將配置排除在代碼之外,一個簡單的方法是看該應用的基準代碼是否可以立刻開源,而不用擔心會暴露任何敏感的信息。
配置管理的現行方案
方案 | 理由 | 可行性 |
---|---|---|
Configuration 代碼文件 |
代碼和配置混在一起,打包后,無法適配多個部署環(huán)境。 | × |
配置文件 | 例如 Spring-boot . profile 管理, node.js 的 .env |
√ |
基于數據庫管理 | 非常適用于第三方 key 的配置,內部配置 并不便捷 |
√ |
基于配置服務 | Spring Cloud Config , nacos 等配置服務 |
√ |
基于數據庫的配置管理
Spring-boot 應用配置管理方案(優(yōu)化版)
- 配置 Application.yml
配置DB 連接的環(huán)境變量 覆蓋 原Application.yml 的數據庫連接變量。
摘自: 12-Factor推薦將應用的配置存儲于 環(huán)境變量 中( env vars, env )。環(huán)境變量可以非常方便地在不同的部署間做修改,卻不動一行代碼;與配置文件不同,不小心把它們簽入代碼庫的概率微乎其微;與一些傳統(tǒng)的解決配置問題的機制(比如 Java 的屬性配置文件)相比,環(huán)境變量與語言和系統(tǒng)無關。
-
基于數據庫管理(jm-settings)
2.1 設計 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 '關鍵詞, PAY.ALI PAY.MP',
- `content` text COLLATE utf8mb4_unicode_ci COMMENT '配置內容',
- `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='設置表';
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;
- /**
- * 失效時間(分鐘)
- */
- 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 調用即可
- }
開源地址
項目名 | 描述 | 地址 |
---|---|---|
jm-settings |
基于 DB 的配置管理核心庫 | https://github.com/jimoos-cn/... |
huawei-obs |
基于 jm-settings 實現的華為obs 配置管理 |
https://github.com/jimoos-cn/... |
責任編輯:張燕妮
來源:
segmentfault.com