首页 > 其他分享 >系统架构设计——DDD设计框架基本学习

系统架构设计——DDD设计框架基本学习

时间:2023-04-04 18:08:27浏览次数:52  
标签:架构设计 服务 business 框架 xjl 领域 com DDD


摘要

最近DDD设计很火,但是刚刚入门还是很懵,通过的学习DDD项目设计的结构目录来实现对DDD设计理解同时也是为大家在公司能够看懂公司的DDD项目结构目录做一个参考和学习。同时后期本人将推出更多的对DDD设计的理解。同时提供一个DDD设计的模板框架:https://github.com/2462612540/Senior-Architect/tree/a_1.0/Springcloud_microservice_ddd

DDD设计的四层

参考官方架构草图,DDD总体结构分为四层  :  Infrastructure(基础实施层),Domain(领域层),Application(应用层),Interfaces(表示层,也叫用户界面层或是接口层)。

系统架构设计——DDD设计框架基本学习_业务逻辑

系统架构设计——DDD设计框架基本学习_业务逻辑_02

 对于DDD的设计而言,最重要的是如何去划分领域,划分好边界。在代码设计上,之前有看到过大佬用模块(Modules)来进行上下文界定和划分。而对于微服务而言,就非常适合从业务上去划分以上的各个Modules,划分好各个业务板块。

在实际开发中,我们一般会采用模块来表示一个领域的界限上下文,比如:

抽奖上下文:com.xjl.business.lottery.*

风控上下文:com.xjl.business.riskcontroller.*

奖品上下文:com.xjl.business.prize.*

活动资格上下文:com.xjl.business.qualification.*

库存上下文:com.xjl.business.stock.*


对于模块内的组织结构,一般情况下我们是按照领域对象、领域服务、领域资源库、防腐层等组织方式定义的。

领域对象-值对象:com.xjl.business.lottery.domain.valobj.*

领域对象-实体:com.hafiz.business.lottery.domain.entity.*

领域对象-聚合根: com.xjl.business.lottery.domain.aggregate.*

领域服务:com.xjl.business.lottery.domain.service.*

领域资源库:com.xjl.business.lottery.domain.repo.*

领域防腐层:com.xjl.business.lottery.domain.facade.*

 微服务 + DDD,首先是从微服务的角度(如何划分微服务)考虑去划分大的业务模块,每一个微服务都应该是一个可以单独部署,各司其职的模块;而在微服务实际开发中,结合DDD的思想去划分所有属于自己的领域。

项目框架总体设计

系统架构设计——DDD设计框架基本学习_应用层_03

Infrastructure(基础实施层)

Infrastructure 层 :  基础实施层,向其他层提供通用的技术能力(比如工具类,第三方库类支持,常用基本配置,数据访问底层实现).基础实施层主要包含以下的内容:

  • 为应用层传递消息(比如通知)
  • 为领域层提供持久化机制(最底层的实现)为用户界面层提供组件配置)
  • 基础设施层还能够通过架构框架来支持四个层次间的交互模式。

系统架构设计——DDD设计框架基本学习_应用层_04

Domain(领域层)

Domain层 : 主要负责表达业务概念,业务状态信息和业务规则;是整个系统的核心层,几乎全部的业务逻辑会在该层实现。Domain层是整个系统的核心层,几乎全部的业务逻辑会在该层实现。领域模型层主要包含以下的内容:

  • 实体(Entities):具有唯一标识的对象
  • 值对象(value objects):无需唯一标识的对象
  • 领域服务(Domain Services):一些行为无法归类到实体对象或值对象上,本质是一些操作,而非事物聚合/聚合根(Aggregates,Aggregate Roots):
  • 聚合是指一组具有内聚关系的相关对象的集合,每个聚合都有一个root和boundary工厂(Factories):创建复杂对象,隐藏创建细节
  • 仓储(Repository):提供查找和持久化对象的方法

Application(应用层)

Application层 :  相对于领域层,应用层是很薄的一层,应用层定义了软件要完成的任务,要尽量简单。它不包含任务业务规则或知识,为下一层的领域对象协助任务、委托工作。它没有反映业务情况的状态,但它可以具有反映用户或程序的某个任务的进展状态。对外为展现层提供各种应用功能(service)。对内 调用领域层(领域对象或领域服务)完成各种业务逻辑任务(task)。这一层也很适合写一些任务处理,日志监控。

注 : 这里图里面所说的对内对外,对程序而言,事实上是从展现层调用应用层,应用层调用领域层,领域层或调用基础设施层。

系统架构设计——DDD设计框架基本学习_应用层_05

Interfaces(表示层,也叫用户界面层或是接口层)

Interfaces层 : 负责向用户显示信息和解释用户命令,请求应用层以获取用户所需要展现的数据(比如获取首页的商品数据)。发送命令给应用层要求其执行某个用户命令(实现某个业务逻辑,比如用户要进行转账)用户界面层应该包含以下的内容:

  • 数据传输对象(Data Transfer 0bject):DTO也常被称作值对象,Vo,实质上与领域层的vO并不相同
  • DTo是数据传输的载体,内部不应该存在任何业务逻辑,通过DTO把内部的领域对象与外界隔离。
  • 装配(Assembler):实现DTO与领域对象之间的相互转换,数据交换,因此Assembler几乎总是同DTO一起出现。
  • 表面,门面(Facade): facade的用意在于为远程客户端提供湘粒度的调用接口。它的主要工作就是将一个用户请求委派给一个或多个Service进行处理,也就是我们常说的Controller

系统架构设计——DDD设计框架基本学习_业务逻辑_06

总结

无论我们代码结构如何规划,也并非一成不变,应该从实际出发,去思考划分结构的意义。此例子是对于微服务+DDD反应到实际开发,代码的结构设计上的一种初步的思考与探索,一个样板工程,不应该成为我们对实际DDD思考与设计的限制。

  • 微服务架构设计,一个微服务应该就是一个可单独部署,可运行的应用,也就是微服务最小的运行单元。
  • 微服务本身内部高度内聚,微服务与微服务之间低耦合。
  • 首先对于应用划分上,就应该想清楚每个微服务的职责,每个微服务服务内部建立起自己的依赖,完成自己的职责和业务。
  • 微服务与微服务之间交互通过HTTP或RPC接口调用,降低微服务之间代码实现和业务的耦合。
  • 微服务的实现不应该受限某程序语言(或Java,或Go,或Python),不应该受限于某框架(或SpringCloud,或Dubbo,或各种RPC框架等等)。
  • 我的代码结构是对于一个微服务本身(即应用)划分的,领域是对于微服务内部本身而言的,即这个微服务涉及哪些领域。
  • 首先从大的方向去划分每一个微服务,然后再从每一个微服务确定所包含的领域,领域的边界,等等。
  • 比如划分了一个 认证授权服务,那么 领域可能有 用户,权限;实体可能有角色,资源等等。领域行为有授权登录,用户退出,授权等等。

 博文参考

一个微服务+DDD(领域驱动设计)的代码结构示例_如果频繁就私信一下呢-

DDD领域驱动设计实战-分层架构及代码目录结构_JavaEdge全是干货的技术号

标签:架构设计,服务,business,框架,xjl,领域,com,DDD
From: https://blog.51cto.com/u_13643065/6169207

相关文章

  • 基于AHB_BUS的eFlash控制器的架构设计
    eFlash控制器的架构设计1.架构设计思路分析1.1含有的模块分析eFlash控制器是一个基于AHB的slave,所以需要一个AHB_slave_if处理AHB的信号。AHB_slave_if与AHB总线进行交互,对主设备的请求进行处理,还可以设置一些内部的寄存器,对AHB发送过来的信号进行解析。AHB_slave_if除了处......
  • flask:Flask 和pythonweb框架介绍、flask快速使用、登录,显示用户信息小案例、配置文件
    目录一、Flask和pythonweb框架介绍1.1pythonweb框架介绍1.2flask介绍1.3wsgiref1.4用wsgirf和werkzeug写web二、flask快速使用三、登录,显示用户信息小案例3.1login.html3.2home.html3.3detail.html3.4py文件3.5知识点总结四、配置文件的使用方式1、设置方式一(测试中使用的......
  • flask框架03 蓝图的使用 g对象 数据库连接池
    今日内容目录今日内容1蓝图的使用2g对象3数据库连接池1蓝图的使用#blueprint翻译过来的,称之为蓝图#作用是:之前全在一个py中写flask项目,后期肯定要划分目录#不用蓝图,划分目录 no_blueprint_flask#项目名src#核心源码位置__i......
  • 4.4学习总结(虚拟试衣算法初步框架构思)
    昨天上台演示了项目框架并且讲述了未来对项目规划的构思,我们组是最后一组,整体等待过程还是很煎熬的比我们队优秀的作品有很多,所以还是很有压力的不过我们会尽力在接下来的时间内,争取完成所介绍的所有功能......
  • Flask 框架
    Flask和pythonweb框架介绍#pythonweb框架,本质其实都是一样的--django:大而全,它自身自带着很多的内置app,提供了很多的方法,第三方的app也很多--flask:小而精,没有过多的内置组件,只能完成web框架最基本的功能,需要借助于第三方,完成更加丰富的功能--web:是一个小巧的python框......
  • 领域驱动设计(DDD)实践之路(二):事件驱动与CQRS
    vivo互联网技术微信公众号 作者:wenbozhang【领域驱动设计实践之路】系列往期精彩文章:《领域驱动设计(DDD)实践之路(一)》主要讲述了战略层面的DDD原则。这是“领域驱动设计实践之路”系列的第二篇文章,分析了如何应用事件来分离软件核心复杂度。探究CQRS为什么广泛应用于DDD项......
  • 分布式定时任务调度框架实践
    vivo互联网技术微信公众号 作者:陈王荣分布式任务调度框架几乎是每个大型应用必备的工具,本文介绍了任务调度框架使用的需求背景和痛点,对业界普遍使用的开源分布式任务调度框架的使用进行了探究实践,并分析了这几种框架的优劣势和对自身业务的思考。一、业务背景1.1为什么需要使......
  • 领域驱动设计(DDD)实践之路(一)
    vivo互联网技术微信公众号 作者:张文博领域驱动设计(DomainDrivenDesign,DDD)其实并非新理论,大家可以看看EricEvans编著的《领域驱动设计》原稿首版是2003年,距今已十余年时间。与现在的分布式、微服务相比,绝对是即将步入中年的“老家伙”了。直到近些年微服务理论被提出、被......
  • 高并发系统设计——RPC框架的技术选型
    摘要服务拆分单独部署后,引入的服务跨网络通信的问题;在拆分成多个小服务之后,服务如何治理的问题。如果想要解决这两方面问题,你需要了解,微服务化所需要的中间件的基本原理,和使用技巧,那么本节课,我会带你掌握,解决第一点问题的核心组件:RPC框架。你的垂直电商系统的QPS已经达到了每秒......
  • 全功能 HTML 框架 Framework7 发布 v8.0.0 版本
    全功能HTML框架Framework7发布v8.0.0版本来源:OSCHINA编辑: 罗奇奇2023-04-0407:07:28 0Framework7是一个开源框架,用于开发具有原生外观和感觉的移动端、桌面端或Web应用程序。它也是必不可少的原型设计工具,可在开发者需要时尽快显示可运行的应用......