Su的技术博客

  • 首页
  • 原创
  • 视频
  • Java
  • MySQL
  • DDD
  • 事故复盘
  • 架构方案
  • AI
  • Other
  • 工具
    • AI工具集
    • 工具清单
    • JSON在线格式化
    • JSON在线比较
    • SQL在线格式化
  • 打赏
  • 关于
路很长,又很短
  1. 首页
  2. 架构方案
  3. 正文
                           

【转载】系统设计 | 如何管理应用系统中的配置?

2023-11-17 1258点热度 0人点赞 0条评论

系统设计 | 如何管理应用系统中的配置?


当一个应用系统演变的非常大时,配置会变得非常混乱。

有一些业务配置在数据库的配置表中,有一些又在配置中心,其它一些可能又在前端。

如何管理这些配置呢?我把项目上的一次技术例会整理出来如下。

首先配置管理需要考虑的一些问题和原则有:

  • 安全:配置可靠,不容易丢失配置导致不同环境逻辑出现差异,进而造成线上事故。
  • 透明:方便查找,当业务人员需要调查逻辑问题时,能快速找出配置。
  • 成本:不需要太多时间在不同环境的配置,以及时刻注意它们的差异。

经过分析,我们把常见的配置分为如下几类,并考虑其处理方式:

  • 通用应用程序配置:技术配置。例如端口号,数据库连接等和业务无关的配置。需要将其放到 application.yml 中,将其构建到软件包中,该配置文件不应该掺杂和环境有关的信息
  • 环境应用配置:和环境相关的通用配置信息。例如,开发环境和测试环境的数据库连接地址,应该存放到配置中心,环境相关信息如果存在密码凭证,需要加密处理
  • 通用业务规则:和技术无关的业务规则。例如,用户注册时的密码强度。这部分配置,前后端可能都会使用,我们需要想办法通过 API 将这些配置传递给前端。
  • 用户或者管理员需要维护的基础数据:例如行业、行政区划,这些视为系统资源使用,可能需要提供管理界面维护。

将这些配置分类后,为了避免通用业务规则在前后端定义两套,我们可以设计一个类似数据字典的通用接口,将后端的通用业务规则传递给前端。

基本设计思路很简单:

将通用业务规则放置到 resources/business-rules/ 目录中,约定使用 YAML 文件保存,并通过扫描目录的方式读取文件名。

我们可以定义 RESTFul API /business-rules/{name}。name 和业务规则名称同名。

接下来我们问下 ChatGPT 如何 实现。

问题:将一组 YAML 业务规则放到 Spring Boot 项目的资源目录下,并创建 business-rules 文件夹存放。实现一个 RESTFul API /business-rules/{name},扫描该目录并生成同名 API,以 JSON 的形式返回相关业务规则。

生成的 Demo 项目如下:

@RestController
    @RequestMapping("/business-rules")
    public class BusinessRulesController {
    
        private final ResourceLoader resourceLoader;
    
        @Autowired
        public BusinessRulesController(ResourceLoader resourceLoader) {
            this.resourceLoader = resourceLoader;
        }
    
        @GetMapping("/{name}")
        public ResponseEntity<String> getBusinessRule(@PathVariable String name) {
            try {
                String ruleFileName = name + ".yaml";
                Resource resource = resourceLoader.getResource("classpath:business-rules/" + ruleFileName);
                if (resource.exists()) {
                    String content = new String(Files.readAllBytes(Paths.get(resource.getURI())), StandardCharsets.UTF_8);
                    return ResponseEntity.ok().body(content);
                } else {
                    return ResponseEntity.notFound().build();
                }
            } catch (IOException e) {
                return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Error reading business rule");
            }
        }
    }

 

其生成的代码质量还不错,只是少了一步将 YAML 文件转换为 JSON 形式。一般可以通过 Spring 的 Properties 来实现,先将 YAML 转换为 Property,再输出为对象;也可以直接使用序列化工具直接将 YAML 文件翻译为 JSON。

如果需要在 Java 中使用这些配置,可以考虑前者,如果不需要可以直接使用后者,性能更高。

我们可以再次问 ChatGPT,将 YAML 文件转换为 JSON 形式。参考结果如下:

// 创建ObjectMapper实例,用于读取YAML和生成JSON
    ObjectMapper objectMapper = new ObjectMapper(new YAMLFactory());
    
    // 从YAML文件中读取数据并转换为Java对象
    Object yamlObject = objectMapper.readValue(new File(yamlFilePath), Object.class);
    
    // 将Java对象转换为JSON字符串
    String json = objectMapper.writeValueAsString(yamlObject);

 

也可以直接使用 YAMLMapper 实现。

// 创建 YAMLMapper 实例
    YAMLMapper yamlMapper = new YAMLMapper();
    
    // 从 YAML 文件中读取数据并转换为 Java 对象
    Object yamlObject = yamlMapper.readValue(new File(yamlFilePath), Object.class);
    
    // 创建 ObjectMapper 实例用于生成 JSON
    ObjectMapper objectMapper = new ObjectMapper();
    
    // 将 Java 对象转换为 JSON 字符串
    String json = objectMapper.writeValueAsString(yamlObject);

 

总结

整理了一个配置文件管理的表格方便在团队规约中使用。

数据类型 参考示例 处理方式
通用应用程序配置 端口、数据库配置 程序内 application.yml 文件
环境应用配置 数据库连接 配置中心配置或者凭证加密配置
通用业务规则 用户密码强度 一组程序内资源目录 YAML 文件
需维护基础数据 行政区划 数据库存储,专用 API 返回

 

文 | 少个分号 (转载请注明出处)

关注公众号:DDD和微服务

微信号:shaogefenhao

同名知乎:少个分号

 

本文仅供学习!所有权归属原作者。侵删!文章来源: DDD和微服务 -少个分号 :http://mp.weixin.qq.com/s?__biz=MzA4Mzc2MzcyMQ==&mid=2247484566&idx=1&sn=cc08578039f17005d61cbe81f01c276e&chksm=9ff033f0a887bae6c030b6c126340c47a888773434aee5338a65cda28bc96ce0c19cd534ce27&scene=21#wechat_redirect

更多文章:

  1. 全链路压测之影子库及ShardingSphere实现影子库源码剖析
  2. 手把手教你实战TDD
  3. 殷浩详解DDD系列 第一讲 - Domain Primitive
  4. 【进阶玩法】策略+责任链+组合实现合同签章
  5. Chrome插件(扩展)开发全攻略2.6w字,看这篇就够了!
  6. 殷浩详解DDD 第四讲:领域层设计规范
  7. DDD系列第五讲:聊聊如何避免写流水账代码
  8. 系统设计 | 哪些技术标准可以帮助系统设计?
  9. 系统设计 | 设计和解析 DSL
  10. 设计模式在外卖营销业务中的实践
标签: 转载 系统设计 方案设计 配置
最后更新:2023-11-17

coder

分享干货文章,学习先进经验。

打赏 点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

广告
文章目录
  • 总结
最新 热点 推荐
最新 热点 推荐
微服务架构:必懂的6大性能维度 Anthropic Code with Claude 开发者大会:开启 AI Agent 新时代 视频笔记-微服务架构P4:必懂5种设计模式 视频笔记:微服务架构P4 设计模式:每服务数据库、API 网关和事件驱动架构 干货 | 论Elasticsearch数据建模的重要性 马蜂窝消息总线——面向业务的消息服务设计 基于 MySQL Binlog 实现可配置的异构数据同步 视频笔记:Google发布Agent2Agent协议
视频笔记:微服务架构P4 设计模式:每服务数据库、API 网关和事件驱动架构干货 | 论Elasticsearch数据建模的重要性视频笔记-微服务架构P4:必懂5种设计模式Anthropic Code with Claude 开发者大会:开启 AI Agent 新时代微服务架构:必懂的6大性能维度
事件驱动架构(EDA) VS 请求响应架构(RR) Spring中@Autowired和@Inject注解的区别? 笔记 | JVM内存区域结构:一计两栈一堆一区 Elasticsearch基础但非常有用的功能之一:别名 Eureka源码之二:服务注册 Kafka如何选择合适的分区数,你选对了吗 Lombok:神奇的Java插件! ChatGPT之帮我找出Bug!

CRUD (1) Event Sourcing (1) graphql (1) id (1) NoSQL (1) quarkus (1) rest (1) RocketMQ (2) Spring Boot (1) zk (1) zookeeper (1) 上下文 (1) 事务消息 (1) 二级缓存 (1) 值对象 (1) 关系数据库 (1) 分布式缓存 (1) 原子性 (1) 唯一ID (1) 商品 (1) 多对多 (1) 子域 (1) 字符集 (1) 客户端心跳 (1) 幂等 (2) 干货 (1) 并发 (1) 应用场景 (1) 应用架构图 (1) 康威定律 (2) 异步复制 (1) 微服务架构 (3) 总体方案 (1) 技术方案 (2) 技术架构 (2) 技术架构图 (1) 技能 (1) 持续集成 (1) 支撑域 (1) 故障恢复 (1) 数据架构图 (1) 方案选型 (1) 日记 (1) 服务发现 (1) 服务治理 (1) 服务注册 (2) 机房 (1) 核心域 (1) 泄漏 (1) 洋葱架构 (1) 消息队列 (5) 源码剖析 (1) 灰度发布 (1) 熔断 (1) 生态 (1) 画图工具 (1) 研发团队 (1) 线程 (2) 组织架构 (1) 缓存架构 (1) 编码 (1) 视频 (20) 读写分离 (1) 贵州 (1) 软件设计 (1) 迁移 (1) 通用域 (1) 集群化 (1) 雪花算法 (1) 顺序消息 (1)

推荐链接🔗
  • AI工具集
  • 工具箱🛠️

COPYRIGHT © 2014-2025 verysu.com . ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

粤ICP备15033072号-2