在我的博客阅读本文

1. 传统做法

2. DDD的一种实现

代码结构:

一图流:

  • 将业务决策从庞大的service中剥离出来,拆分为若干领域实体,将业务决策交给一个个的领域实体,由application层进行统一的委派,有效梳理业务,结构分明,降低代码维护难度,新同学更易上手。
  • 防腐层设计,业务与技术解耦,引导系统逐渐走上业务与技术分离的架构路线,保证业务逻辑在领域模型中得到不断重构和发展,成为系统的核心资产

3. COLA的做法

模块划分:

adapter模块 定于对外透出服务的方式,gPPC,Http等
client模块 定义对外透出服务的API
app模块 实现client模块中定义的对外提供的API
domain模块 领域服务 & 领域网关
infrastructure模块 具体技术实现

一图流:

3.1. adapter模块代码结构

adapter模块承载了系统对外提供服务的适配类,如果当前服务提供Restful,可以定义在这里。

3.2. client模块代码结构

client模块定义了对外透出的接口,可以作为SDK提供出去。

这里进一步划分了几个包:

api 服务对外透出的接口
convert 转换类
dto.command 新增,修改,删除操作参数
dto.data 查询回调参数
dto.event 事件相关参数
dto.query 查询操作参数

3.3. app模块代码结构

app模块实现了client模块定义的接口,也就是对外提供的api的具体实现。

这里进一步划分了几个包:

consumer 消息消费
convert 转换类
executor 命令模型,所有增删改操作
executor.query 查询模型,所有查询操作

每一个实现(图中的xxxServiceImpl),都是委派若干executor来完成,这样做可以将一个庞大的service解耦成若干小类和方法,避免大而全的一个类。

executor按照CQRS的思想,进一步划为“命令模型”与“查询模型”。

3.3.1. 关于CQRS架构

CQRS从读写职责角度对请求的功能进行分类。

  • Command命令模型

当界面的表单数据提交到后端时就会有写入表单数据的命令,之后将命令中的DTO提取出来,进行业务逻辑检查或计算,持久化。这条路线称为Command模型路线。

命令是客户端让服务器做事情,是从客户端向服务器后端发出写入操作命令,通常会改变后端模型的状态。

  • Query查询模型

搜索只是从搜索库中获取搜索的结果,并没有任何复杂的业务逻辑计算。

查询是服务器后端向客户端返回结果。

这样划分的好处:

  • 在DDD中,领域模型可以根据DDD原则进行建立,而查询模型则根据数据查询要求进行建立,二者模型设计依据不同,应该区分开,也就是区分开领域驱动设计&数据驱动设计
  • 在分开设计后,可以单独针对查询模型使用与命令模型不一样的存储引擎,比如命令模型使用MySQL,查询模型使用ElasticSearch,Redis等,这里需要注意不同存储引擎的同步。

3.4. domain模块代码结构

domain模块定义了当前领域服务的能力,模型,与领域网关。

领域网关这个概念是指当前服务的所有持久化以及查询的接口,有点类似DDD的仓储接口。

这里进一步划分了几个包:

gateway 领域网关接口
model 领域模型实体
ability 领域服务(能力),是一个可选项,非DDD工程可以没有

3.5. infrastructure模块代码结构

infrastructure定义了当前服务所有具体的技术实现,主要是domain模块中定义的gateway的实现。

按照网关实现不同,这里进一步划分了几个包:

database 数据库网关相关实现
rpc 远程过程调用网关相关实现
xxx.dataobject 数据库/RPC调用需要用到的类

这样,对于domain层定义了网关接口来讲,它并不关心具体的技术实现;对于infrastructure基础设施层来讲,分为多种技术实现。

这里的防腐层设计,业务与技术解耦,引导系统逐渐走上业务与技术分离的架构路线,保证业务逻辑在领域模型中得到不断重构和发展,成为系统的核心资产
除此以外,服务暴露的RPC服务,也是写在这里。

3.6. DDD与非DDD在COLA中的差异

差异主要在与Domain模块:

  • DDD的Domain模块应该有对应的领域服务,系统的核心在这一块
  • 非DDD的Domain模块比较弱,只有一些基本职能,包括定义一些上层接口来对基础设施层做防腐,主要业务资产在App模块。

参考资料

COLA 4.0:应用架构的最佳实践

记一次COLA架构的实践相关推荐

  1. 阿里DDD项目最佳实践-COLA 架构总览

    DDD分层架构.六边形架构.洋葱圈架构.以及 COLA 架构的核心职责就是要做核心业务逻辑和技术细节的分离和解耦. 在架构思想上,COLA 主张像六边形架构那样,使用端口-适配器去解耦技术细节:主张像 ...

  2. 天画-codeMaker组件化架构升级实践

    神帅 读完需要 11 分钟 速读仅需 4 分钟 1 背景 1.1 背景说明 在两个月前我扩展了基于调用时序的代码生成,将代码生成的粒度从代码方法级别提升到了代码行级别,从整个迭代过程来看也逐步积累了一 ...

  3. 达达O2O后台架构演进实践:从0到4000高并发请求背后的努力

    1.引言 达达创立于2014年5月,业务覆盖全国37个城市,拥有130万注册众包配送员,日均配送百万单,是全国领先的最后三公里物流配送平台. 达达的业务模式与滴滴以及Uber很相似,以众包的方式利用社 ...

  4. 如何保证同事的代码不会腐烂?一文带你了解 阿里巴巴 COLA 架构

    Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/cou ...

  5. 如何保证同事的代码不会腐烂?一文带你了解 Alibaba COLA 架构

    Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/cou ...

  6. 高并发、高性能下的 会员系统[同程艺龙] — 高可用架构设计实践

    目录 会员系统[同程艺龙] - 高可用架构设计实践 ES高可用方案 ES双中心主备集群架构 ES流量隔离三集群架构 ES集群深度优化提升 会员Redis缓存方案 Redis双中心多集群架构 高可用会员 ...

  7. 一套高可用、易伸缩、高并发的IM群聊、单聊架构方案设计实践

    本文原题为"一套高可用群聊消息系统实现",由作者"于雨氏"授权即时通讯网整理和发布,内容有些许改动,作者博客地址:alexstocks.github.io.应作 ...

  8. 基于AWS的云服务架构最佳实践

    近年来,对于打造高度可扩展的应用程序,软件架构师们挖掘了若干相关理念,并以最佳实践的方式加以实施.在今天的"信息时代",这些理念更加适用于不断增长的数据集,不可预知的流量模式,以及 ...

  9. 基于AWS的云服务架构最佳实践 #CSDN博文精选# #IT# #云服务实践#

    大家好,小C将继续与你们见面,带来精选的CSDN博文~ 在这里,你将收获: 将系统化学习理论运用于实践,系统学习IT技术 学习内容涵盖数据库.软件测试.主流框架.领域驱动设计和第三方生态等,离全栈工程 ...

最新文章

  1. centos6.5 VNC安装步骤
  2. Oracle 字符转date类型问题,未解决
  3. 推荐系统resys小组线下活动见闻2009-08-22
  4. Java 多线程Thread
  5. Bash脚本教程之脚本除错
  6. 正式请求:Could you...? May I...? _52
  7. ubuntu 14.04 linux下wifi驱动安装使用的一些笔记
  8. TensorFlow实现条件批归一化(Conditional Batch Normalization)
  9. 张樟兴策略分析:数据库营销顾客
  10. 使用企业邮箱的好处优点
  11. 微信小程序之去除抖音、快手等视频平台水印!
  12. 中继器,集线器,网桥的区别
  13. oracle数据库中的回收站,Oracle回收站的清理方法
  14. ftp客户端工具,几款优秀的ftp客户端工具
  15. Scrapy 规则化爬虫(1)——CrawlSpider及link_extractor
  16. android sdl,能通吃所有安卓手机的SDL究竟是何神通?
  17. 农总行计算机类,中国农业银行总行计算机类笔试经验【精选】
  18. FFmpeg 源码之分配与释放 AVPacket 常用函数
  19. 呦呦呦!SMS来个通俗点的小栗子!!!
  20. Math Program Big-man

热门文章

  1. 【Linux】Linux的管道
  2. D-HARRY2020春夏新品
  3. Keras BatchNormalization层
  4. 【一级讲解】韩信点兵——中国剩余定理
  5. 路由协议(实例讲解)
  6. anchor_free and anchor_based的简单理解
  7. linux查看mysql日志信息,Linux下查看mysql错误日志
  8. WinRAR 3.51 注册码
  9. Shiro logout302重定向问题
  10. 写一个php简单的递归函数