如何做微网站,重庆铜梁网站建设价格,好看的公司logo图片,wordpress 4.4.2漏洞为了更好地理解 DDD 的设计流程#xff0c;这篇文章会用一个项目来带你了解 DDD 的战略设计和战术设计#xff0c;走一遍从领域建模到微服务设计的全过程#xff0c;一起掌握 DDD 的主要设计流程和关键点。
项目基本信息
项目的目标是实现在线请假和考勤管理。功能描述如下…为了更好地理解 DDD 的设计流程这篇文章会用一个项目来带你了解 DDD 的战略设计和战术设计走一遍从领域建模到微服务设计的全过程一起掌握 DDD 的主要设计流程和关键点。
项目基本信息
项目的目标是实现在线请假和考勤管理。功能描述如下
请假人填写请假单提交审批根据请假人身份、请假类型和请假天数进行校验根据审批规则逐级递交上级审批逐级核批通过则完成审批否则审批不通过退回申请人。根据考勤规则核销请假数据后对考勤数据进行校验输出考勤统计。
战略设计
战略设计是根据用户旅程分析找出领域对象和聚合根对实体和值对象进行聚类组成聚合划分限界上下文建立领域模型的过程。
战略设计采用的方法是事件风暴包括产品愿景、场景分析、领域建模和微服务拆分等几个主要过程。
战略设计阶段建议参与人员领域专家、业务需求方、产品经理、架构师、项目经理、开发经理和测试经理。
1. 产品愿景
产品愿景是对产品顶层价值设计对产品目标用户、核心价值、差异化竞争点等信息达成一致避免产品偏离方向。事件风暴时所有参与者针对每一个要点在贴纸上写出自己的意见贴到白板上。事件风暴主持者会对每个贴纸讨论并对发散的意见进行收敛和统一形成下面的产品愿景图。 我们把这个产品愿景图整理成一段文字就是为了满足内外部人员他们的在线请假、自动考勤统计和外部人员管理的需求我们建设这个在线请假考勤系统它是一个在线请假平台可以自动考勤统计。它可以同时支持内外网请假同时管理内外部人员请假和定期考勤分析而不像 HR 系统只管理内部人员且只能内网使用。我们的产品内外网皆可使用可实现内外部人员无差异管理。
通过产品愿景分析项目团队统一了系统名称——在线请假考勤系统明确了项目目标和关键功能与竞品HR的关键差异以及自己的优势和核心竞争力等。
产品愿景分析对于初创系统明确系统建设重点统一团队建设目标和建立通用语言是很有价值的。但如果你的系统目标和需求非常清晰这一步可以忽略。
2. 场景分析
场景分析是从用户视角出发探索业务领域中的典型场景产出领域中需要支撑的场景分类、用例操作以及不同子域之间的依赖关系用以支撑领域建模。
项目团队成员一起用事件风暴分析请假和考勤的用户旅程。根据不同角色的旅程和场景分析尽可能全面地梳理从前端操作到后端业务逻辑发生的所有操作、命令、领域事件以及外部依赖关系等信息。
下面我就以请假和人员两个场景作为示例。
第一个场景请假
用户请假人
请假人登录系统从权限微服务获取请假人信息和权限数据完成登录认证。创建请假单打开请假页面选择请假类型和起始时间录入请假信息。保存并创建请假单提交请假审批。修改请假单查询请假单打开请假页面修改请假单提交请假审批。提交审批获取审批规则根据审批规则从人员组织关系中获取审批人给请假单分配审批人。
第二个场景审批
用户审批人
审批人登录系统从权限微服务获取审批人信息和权限数据完成登录认证。获取请假单获取审批人名下请假单选择请假单。审批填写审批意见。逐级审批如果还需要上级审批根据审批规则从人员组织关系中获取审批人给请假单分配审批人。重复以上 4 步。最后审批人完成审批。
完成审批后产生请假审批已通过领域事件。后续有两个进一步的业务操作发送请假审批已通过的通知通知邮件系统告知请假人将请假数据发送到考勤以便核销。 下面这个图是人员组织关系场景分析结果图详细的分析过程以及考勤的场景分析就不描述了。 3. 领域建模
领域建模是通过对业务和问题域进行分析建立领域模型。向上通过限界上下文指导微服务边界设计向下通过聚合指导实体对象设计。
领域建模是一个收敛的过程分三步
第一步找出领域实体和值对象等领域对象第二步找出聚合根根据实体、值对象与聚合根的依赖关系建立聚合第三步根据业务及语义边界等因素定义限界上下文。
下面我们就逐步详细讲解一下。
第一步找出实体和值对象等领域对象
根据场景分析分析并找出发起或产生这些命令或领域事件的实体和值对象将与实体或值对象有关的命令和事件聚集到实体。下面这个图是分析后的实体与命令的关系。通过分析我们找到了请假单、审批意见、审批规则、人员、组织关系、刷卡明细、考勤明细以及考勤统计等实体和值对象。 第二步定义聚合
定义聚合前先找出聚合根。从上面的实体中我们可以找出“请假单”和“人员”两个聚合根。然后找出与聚合根紧密依赖的实体和值对象。我们发现审批意见、审批规则和请假单紧密关联组织关系和人员紧密关联。
找出这些实体的关系后我们发现还有刷卡明细、考勤明细和考勤统计这几个实体没有聚合根。这种情形在领域建模时你会经常遇到对于这类场景我们需要分情况特殊处理。
刷卡明细、考勤明细和考勤统计这几个实体它们之间相互独立找不出聚合根不是富领域模型但它们一起完成考勤业务逻辑具有很高的业务内聚性。我们将这几个业务关联紧密的实体放在一个考勤聚合内。在微服务设计时我们依然采用 DDD 的设计和分析方法。由于没有聚合根来管理聚合内的实体我们可以用传统的方法来管理实体。
经过分析我们建立了请假、人员组织关系和考勤三个聚合。其中请假聚合有请假单、审批意见实体和审批规则等值对象。人员组织关系聚合有人员和组织关系等实体。考勤聚合有刷卡明细、考勤明细和考勤统计等实体。 第三步定义限界上下文
由于人员组织关系聚合与请假聚合共同完成请假的业务功能两者在请假的限界上下文内。考勤聚合则单独构成考勤统计限界上下文。因此我们为业务划分请假和考勤统计两个限界上下文建立请假和考勤两个领域模型。
4. 微服务的拆分
理论上一个限界上下文就可以设计为一个微服务但还需要综合考虑多种外部因素比如职责单一性、敏态与稳态业务分离、非功能性需求如弹性伸缩、版本发布频率和安全等要求、软件包大小、团队沟通效率和技术异构等非业务要素。
在这个项目我们划分微服务主要考虑职责单一性原则。因此根据限界上下文就可以拆分为请假和考勤两个微服务。其中请假微服务包含人员组织关系和请假两个聚合考勤微服务包含考勤聚合。
到这里战略设计就结束了。通过战略设计我们建立了领域模型划分了微服务边界。下一步就是战术设计了也就是微服务设计。下面我们以请假微服务为例讲解其设计过程。
战术设计
战术设计是根据领域模型进行微服务设计的过程。这个阶段主要梳理微服务内的领域对象梳理领域对象之间的关系确定它们在代码模型和分层架构中的位置建立领域模型与微服务模型的映射关系以及服务之间的依赖关系。
战术设计阶段建议参与人员领域专家、产品经理、架构师、项目经理、开发经理和测试经理等。
战术设计包括以下两个阶段分析微服务领域对象和设计微服务代码结构。
1. 分析微服务领域对象
领域模型有很多领域对象但是这些对象带有比较重的业务属性。要完成从领域模型到微服务的落地还需要进一步的分析和设计。在事件风暴基础上我们进一步细化领域对象以及它们的关系补充事件风暴可能遗漏的业务和技术细节。
我们分析微服务内应该有哪些服务服务的分层应用服务由哪些服务组合和编排完成领域服务包括哪些实体和实体方法哪个实体是聚合根实体有哪些属性和方法哪些对象应该设计为值对象等。
服务的识别和设计
事件风暴的命令是外部的一些操作和业务行为也是微服务对外提供的能力。它往往与微服务的应用服务或者领域服务对应。我们可以将命令作为服务识别和设计的起点。具体步骤如下
根据命令设计应用服务确定应用服务的功能服务集合组合和编排方式。服务集合中的服务包括领域服务或其它微服务的应用服务。根据应用服务功能要求设计领域服务定义领域服务。这里需要注意应用服务可能是由多个聚合的领域服务组合而成的。根据领域服务的功能确定领域服务内的实体以及功能。设计实体基本属性和方法。
另外我们还要考虑领域事件的异步化处理。
我以提交审批这个动作为例来说明服务的识别和设计。
提交审批的大体流程是
根据请假类型和时长查询请假审批规则获取下一步审批人的角色。根据审批角色从人员组织关系中查询下一审批人。为请假单分配审批人并将审批规则保存至请假单。通过分析我们需要在应用层和领域层设计以下服务和方法。
应用层提交审批应用服务。
领域层领域服务有查询审批规则、修改请假流程信息服务以及根据审批规则查询审批人服务分别位于请假和人员组织关系聚合。请假单实体有修改请假流程信息方法审批规则值对象有查询审批规则方法。人员实体有根据审批规则查询审批人方法。下图是我们分析出来的服务以及它们之间的依赖关系。 服务的识别和设计过程就是这样了我们再来设计一下聚合内的对象。
聚合中的对象
在请假单聚合中聚合根是请假单。请假单经多级审核后会产生多条审批意见为了方便查询我们可以将审批意见设计为实体。请假审批通过后会产生请假审批通过的领域事件因此还会有请假事件实体。请假聚合有以下实体审批意见记录审批人、审批状态和审批意见和请假事件实体。
我们再来分析一下请假单聚合的值对象。请假人和下一审批人数据来源于人员组织关系聚合中的人员实体可设计为值对象。人员类型、请假类型和审批状态是枚举值类型可设计为值对象。确定请假审批规则后审批规则也可作为请假单的值对象。请假单聚合将包含以下值对象请假人、人员类型、请假类型、下一审批人、审批状态和审批规则。
综上我们就可以画出请假聚合对象关系图了。 在人员组织关系聚合中我们可以建立人员之间的组织关系通过组织关系类型找到上级审批领导。它的聚合根是人员实体有组织关系包括组织关系类型和上级审批领导其中组织关系类型如项目经理、处长、总经理等是值对象。上级审批领导来源于人员聚合根可设计为值对象。人员组织关系聚合将包含以下值对象组织关系类型、上级审批领导。
综上我们又可以画出人员组织关系聚合对象关系图了。 微服务内的对象清单
在确定各领域对象的属性后我们就可以设计各领域对象在代码模型中的代码对象包括代码对象的包名、类名和方法名建立领域对象与代码对象的一一映射关系了。根据这种映射关系相关人员可快速定位到业务逻辑所在的代码位置。在经过以上分析后我们在微服务内就可以分析出如下图的对象清单。 2. 设计微服务代码结构
根据 DDD 的代码模型和各领域对象所在的包、类和方法我们可以定义出请假微服务的代码结构设计代码对象。
应用层代码结构
应用层包括应用服务、DTO 以及事件发布相关代码。在 LeaveApplicationService 类内实现与聚合相关的应用服务在 LoginApplicationService 封装外部微服务认证和权限的应用服务。
这里提醒一下如果应用服务逻辑复杂的话一个应用服务就可以构建一个类这样可以避免一个类的代码过于庞大不利于维护。 领域层代码结构
领域层包括一个或多个聚合的实体类、事件实体类、领域服务以及工厂、仓储相关代码。一个聚合对应一个聚合代码目录聚合之间在代码上完全隔离聚合之间通过应用层协调。
请假微服务领域层包含请假和人员两个聚合。人员和请假代码都放在各自的聚合所在目录结构的代码包中。如果随着业务发展人员相关功能需要从请假微服务中拆分出来我们只需将人员聚合代码包稍加改造独立部署即可快速发布为人员微服务。到这里微服务内的领域对象分层以及依赖关系就梳理清晰了。微服务的总体架构和代码模型也基本搭建完成了。 后续的工作
1. 详细设计
在完成领域模型和微服务设计后我们还需要对微服务进行详细的设计。主要设计以下内容实体属性、数据库表和字段、实体与数据库表映射、服务参数规约及功能实现等。
2. 代码开发和测试
开发人员只需要按照详细的设计文档和功能要求找到业务功能对应的代码位置完成代码开发就可以了。代码开发完成后开发人员要编写单元测试用例基于挡板模拟依赖对象完成服务测试。
总结
今天我们通过在线请假考勤项目把 DDD 设计过程完整地走了一遍。
DDD 战略设计从事件风暴开始然后我们要找出实体等领域对象找出聚合根构建聚合划分限界上下文建立领域模型。
战术设计从事件风暴的命令开始识别和设计服务建立各层服务的依赖关系设计微服务内的实体和值对象找出微服务中所有的领域对象并建立领域对象与代码对象的映射关系。
这样就可以很好地指导项目团队进行微服务开发和测试了。