遗留系统现代化
引言: 遗留系统 遗留系统的一些明显特征 代码质量一言难尽 架构混乱,模块之间职责不明,改一个简单的功能也会改到几个服务 缺乏单元测试,集成测试 老旧的技术和工具 上手难度高,业务知识难以获取 缺乏CI/CD 为什么对遗留系统现代化? 业务价值层面 遗留系统蕴含了大量的数据资产 遗留系统中还藏匿着丰富的业务知识 仍然有大量用户在使用,为公司带来收益 业务交付层面 缩短需求交付周期 增加需求交付质量 减少系统故障的概率 减少线上工单数量 遗留系统现代化的技术建设 代码现代化,对遗留系统的代码进行安全的可测试化重构 架构现代化,微服务架构或云原生架构,通常和代码现代化并行进行。对遗留系统内部改造的同时,将内部模块拆分到外面,或者将新需求实现到遗留系统外部 DevOps现代化以应对频繁的迭代/hotfix(我们系统里面argodeploy已解决) 监控告警现代化,增加系统的可观测性 对老旧的技术/工具进行升级 DDD 为什么选择DDD重构老架构 方法 优势 劣势 适用场景 传统分层架构 简单直观 容易产生大泥球 简单业务 DDD 业务驱动 学习成本高 复杂业务领域 什么是DDD(领域驱动设计) DDD 是一种架构设计方法论,的核心思想是通过领域驱动设计方法定义领域模型,从而确定业务和应用边界,保证业务模型与代码模型的一致性。 DDD为什么适合微服务/复杂业务 它可以帮我我们设计出清晰的领域和应用边界, 更容易实现业务和架构上的演进, 当然DDD实际上也被广泛适用于单体应用 DDD的战术设计和战略设计 DDD的战略设计 战略设计主要从业务视角出发,建立业务领域模型,划分领域边界。使用限界上下文确定业务边界 DDD的战术设计 战术设计则从技术视角出发,侧重于领域模型的技术实现,完成软件开发和落地,包括:聚合根、实体、值对象、领域服务、应用服务和资源库等代码逻辑的设计和实现。 DDD核心概念 领域:限定业务范围,比如观麦业务领域有毛菜,净菜,央厨等子领域,这些子领域还可以更近一步细化 子领域:领域可以划分成为多个子领域,每个子域对应一个更小的问题域或更小的业务范围 核心域:公司核心竞争力的子域,对于观麦来说,就是进销存,订单,采购等领域 通用域:多个子域使用的通用功能子域是通用域,比如商品服务,账户服务,短信服务等 支撑域:为核心业务提供辅助功能的子域,比如openAPI,openMsg,营销交互层等 事件风暴:事件风暴是一项团队活动,领域专家与项目团队通过头脑风暴的形式,罗列出领域中所有的领域事件,整合之后形成最终的领域事件集合,然后对每一个事件,标注出导致该事件的命令,再为每一个事件标注出命令发起方的角色。命令可以是用户发起,也可以是第三方系统调用或者定时器触发等,最后对事件进行分类,整理出实体、聚合、聚合根以及限界上下文。 限界上下文:保证在领域之内的一些术语、业务相关对象有一个确切的含义,没有二义性。确保通用语言语义的唯一性。 实体:拥有唯一标识符,且标识符在历经各种状态变更后仍能保持一致, 比如订单,商品,实体上通常挂有很多的业务逻辑 值对象:值对象是描述事物的状态或属性的对象,它没有唯一标识,并且通常是不可变的,值对象上不会挂复杂业务逻辑 聚合:而能让实体和值对象协同工作的组织就是聚合 聚合根:聚合不仅是实体,也是聚合的入口点和管理者 仓储:又称repo, 一个聚合对应一个repo, 你可以理解为实现了领域对象到数据库对象转换的dao层。 领域服务:当业务逻辑在单一聚合无法实现的时候需要,组合多个聚合实现业务逻辑。 领域事件:领域模型中发生的事件,用于减少领域之间的耦合,通过发布订阅模式发布领域事件,让订阅者自行订阅 防腐层(ACL): 使用防腐层来隔离新旧系统,做一些协议/命名的转换,防止遗留系统的接口schema变更影响到新的领域服务 毛菜DDD战略设计 按战略设计思想基本划分毛菜的核心,通用,支撑域 ...