关于java:领域驱动实践总结基本理论总结与分析架构分析与代码设计具体应用设计分析V

30次阅读

共计 5265 个字符,预计需要花费 14 分钟才能阅读完成。

畛域驱动实际总结三: 具体利用设计剖析

畛域驱动设计 DDD 是一种设计思维,它能够同时领导中台业务建模和微服务设计(中台实质是业务模型,微服务是业务模型的零碎落地),畛域驱动设计强调畛域模型和微服务设计的一体性,先有畛域模型而后才有微服务,而不是脱离畛域模型来谈微服务设计。

微服务拆分窘境产生的根本原因: 不晓得业务或者微服务的边界到底在什么中央。

DDD 核心思想: 通过畛域驱动设计办法定义畛域模型,从而确定业务和利用边界,保障业务模型与代码模型的一致性。

对于畛域驱动设计的学习做的总结次要写三篇博客,次要包含三局部: 根本实践总结与剖析、架构剖析与代码设计、具体利用设计剖析,次要参考的材料为极客工夫的欧翻新架构师的《DDD》实战,其余参考书籍在文章下方的参考书籍中。

本次次要总结 DDD 具体利用设计剖析:

一、利用我的项目的根本背景

我的项目的指标是实现在线销假和考勤治理。性能形容如下:

  • 销假人填写请假单提交审批,依据销假人身份、销假类型和销假天数进行校验,依据审批规定逐级递交下级审批,逐级核批通过则实现审批,否则审批不通过退回申请人。
  • 依据考勤规定,核销销假数据后,对考勤数据进行校验,输入考勤统计。

备注:本想以大视频业务零碎为背景本人弄一个的,然而工夫太紧,临时还是以欧翻新架构师提供的案例做总结和剖析了解,前期有工夫会本人出一个对于视频零碎的。

二、针对我的项目进行畛域驱动的策略设计阶段

策略设计 * 采纳的办法是事件风暴 *,包含:* 产品愿景、场景剖析、领域建模和微服务拆分 * 等几个次要过程。

策略设计是依据用户旅程剖析,找出畛域对象和聚合根,对实体和值对象进行聚类组成聚合,划分限界上下文,建设畛域模型的过程。

策略设计阶段* 倡议参加人员 *:领域专家、业务需求方、产品经理、架构师、项目经理、开发经理和测试经理。

(一)事件风暴确定产品愿景

产品愿景是对产品顶层价值设计,对产品指标用户、外围价值、差异化竞争点等信息达成统一,防止产品偏离方向。

事件风暴时,所有参与者针对每一个要点,在贴纸上写出本人的意见,贴到白板上。

事件风暴主持者会对每个贴纸,探讨并对发散的意见进行收敛和对立,造成上面的产品愿景图。其实,也就是让所有人确定对立的大方向对立语言,咱们到底在干什么,目标和意义是什么等的根本问题。

产品愿景剖析对于初创零碎明确零碎建设重点,对立团队建设指标和建设通用语言是很有价值的。

针对本我的项目,最初确定的产品愿景图整顿成一段文字就是:

为了满足内外部人员,他们的在线销假、主动考勤统计和内部人员治理的需要,咱们建设这个在线销假考勤零碎,它是一个在线销假平台,能够主动考勤统计。它能够同时反对内外网销假,同时治理内外部人员销假和定期考勤剖析,而不像 HR 零碎,只治理内部人员,且只能内网应用。咱们的产品内外网皆可应用,可实现内外部人员无差别治理。

达到的目标与意义:

通过产品愿景剖析,我的项目团队对立了零碎名称——在线销假考勤零碎,明确了我的项目指标和要害性能,与竞品(HR)的要害差别以及本人的劣势和外围竞争力等。

(二)事件风暴进行业务场景剖析

场景剖析是* 从用户视角登程 *,摸索业务畛域中的典型场景,产出畛域中须要撑持的场景分类、用例操作以及不同子域之间的依赖关系,用以撑持领域建模。

我的项目团队成员一起用事件风暴剖析销假和考勤的用户旅程。

依据不同角色的旅程和场景剖析,尽可能全面地梳理从前端操作到后端业务逻辑产生的所有操作、命令、畛域事件以及内部依赖关系等信息。

以销假和人员场景作为示例 ————

场景剖析一:销假 用户:销假人

  • 销假人登录零碎:从权限微服务获取销假人信息和权限数据,实现登录认证。
  • 创立请假单:关上销假页面,抉择销假类型和起始工夫,录入销假信息。保留并创立请假单,提交销假审批。
  • 批改请假单:查问请假单,关上销假页面,批改请假单,提交销假审批。
  • 提交审批:获取审批规定,依据审批规定,从人员组织关系中获取审批人,给请假单调配审批人。

场景剖析二:审批 用户:审批人

  • 审批人登录零碎:从权限微服务获取审批人信息和权限数据,实现登录认证。
  • 获取请假单:获取审批人名下请假单,抉择请假单。
  • 审批:填写审批意见。
  • 逐级审批:如果还须要下级审批,依据审批规定,从人员组织关系中获取审批人,给请假单调配审批人。反复以上 4 步。最初审批人实现审批。

备注:实现审批后,产生销假审批已通过畛域事件。后续有两个进一步的业务操作:发送销假审批已通过的告诉,告诉邮件系统告知销假人;将销假数据发送到考勤以便核销。

场景剖析三:人员组织关系 具体的剖析过程以及考勤的场景剖析就不形容了

(三)事件风暴进行领域建模

领域建模是通过对业务和问题域进行剖析,建设畛域模型。

向上通过限界上下文领导微服务边界设计,向下通过聚合领导实体对象设计。

领域建模是一个收敛的过程,分三步:

第一步:找出畛域实体和值对象等畛域对象

依据场景剖析,剖析并找出发动或产生这些命令或畛域事件的实体和值对象,将与实体或值对象无关的命令和事件汇集到实体。

依据场景剖析,剖析并找出发动或产生这些命令或畛域事件的实体和值对象,将与实体或值对象无关的命令和事件汇集到实体。

(留神表白中的名词和动词等,名词往往是实体、值对象等,动词往往对应着命令的相干行为)

第二步:找出聚合根,依据实体、值对象与聚合根的依赖关系,建设聚合

定义聚合前,先找出聚合根。

从下面的实体中,咱们能够找出“请假单”和“人员”两个聚合根。而后找出与聚合根严密依赖的实体和值对象。咱们发现审批意见、审批规定和请假单严密关联,组织关系和人员严密关联。

找出这些实体的关系后,咱们发现还有 刷卡明细、考勤明细和考勤统计,这几个实体没有聚合根。这种情景在领域建模时你会常常遇到,对于这类场景咱们须要分状况非凡解决:

  • 刷卡明细、考勤明细和考勤统计这几个实体,它们之间互相独立,找不出聚合根,不是富畛域模型,但它们一起实现考勤业务逻辑,具备很高的业务内聚性。
  • 咱们将这几个业务关联严密的实体,放在一个考勤聚合内。
  • 在微服务设计时,咱们仍然采纳 DDD 的设计和分析方法。因为没有聚合根来治理聚合内的实体,咱们能够用传统的办法来治理实体。

通过剖析,咱们建设了销假、人员组织关系和考勤三个聚合。其中销假聚合有请假单、审批意见实体和审批规定等值对象。人员组织关系聚合有人员和组织关系等实体。考勤聚合有刷卡明细、考勤明细和考勤统计等实体。

第三步:依据业务及语义边界等因素,定义限界上下文

因为人员组织关系聚合与销假聚合,共同完成销假的业务性能,两者在销假的限界上下文内。

考勤聚合则独自形成考勤统计限界上下文。

因而咱们为业务划分销假和考勤统计两个限界上下文,建设销假和考勤两个畛域模型。

(四)事件风暴进行微服务的拆分

实践上一个限界上下文就能够设计为一个微服务,但还须要综合思考多种内部因素,比方:职责单一性、敏态与稳态业务拆散、非功能性需要(如弹性伸缩、版本公布频率和平安等要求)、软件包大小、团队沟通效率和技术异构等非业务因素。

在这个我的项目,咱们划分微服务次要思考职责单一性准则。

因而依据限界上下文就能够拆分为销假和考勤两个微服务。其中销假微服务蕴含人员组织关系和销假两个聚合,考勤微服务蕴含考勤聚合。

三、针对我的项目进行畛域驱动的战术设计阶段

战术设计是* 依据畛域模型进行微服务设计的过程 *。这个阶段次要梳理微服务内的畛域对象,梳理畛域对象之间的关系,确定它们在代码模型和分层架构中的地位,建设畛域模型与微服务模型的映射关系,以及服务之间的依赖关系。

战术设计阶段* 倡议参加人员 *:领域专家、产品经理、架构师、项目经理、开发经理和测试经理等。战术设计包含以下阶段:

(一)剖析微服务畛域对象

在事件风暴根底上,咱们进一步细化畛域对象以及它们的关系,补充事件风暴可能脱漏的业务和技术细节:

  • 咱们剖析微服务内应该有哪些服务?
  • 服务的分层?
  • 应用服务由哪些服务组合和编排实现?
  • 畛域服务包含哪些实体和实体办法?
  • 哪个实体是聚合根?
  • 实体有哪些属性和办法?
  • 哪些对象应该设计为值对象等。

1. 具体服务的辨认和设计

事件风暴的命令是内部的一些操作和业务行为,也是微服务对外提供的能力。它往往与微服务的应用服务或者畛域服务对应。咱们* 能够将命令作为服务辨认和设计的终点 *

具体步骤如下:

  • 依据命令设计应用服务,确定应用服务的性能,服务汇合,组合和编排形式。服务汇合中的服务包含畛域服务或其它微服务的应用服务。
  • 依据应用服务性能要求设计畛域服务,定义畛域服务。这里须要留神:应用服务可能是由多个聚合的畛域服务组合而成的。
  • 依据畛域服务的性能,确定畛域服务内的实体以及性能。
  • 设计实体根本属性和办法。
  • 思考畛域事件的异步化解决。

* 以提交审批这个动作为例 *,来阐明服务的辨认和设计。提交审批的大体流程是:

  • 依据销假类型和时长,查问销假审批规定,获取下一步审批人的角色。
  • 依据审批角色从人员组织关系中查问下一审批人。
  • 为请假单调配审批人,并将审批规定保留至请假单。

通过剖析,咱们须要在应用层和畛域层设计以下服务和办法。

  • 应用层:提交审批应用服务。
  • 畛域层:畛域服务有查问审批规定、批改销假流程信息服务以及依据审批规定查问审批人服务,别离位于销假和人员组织关系聚合。请假单实体有批改销假流程信息办法,审批规定值对象有查问审批规定办法。人员实体有依据审批规定查问审批人办法。下图是咱们剖析进去的服务以及它们之间的依赖关系。

2. 聚合中的对象剖析

请假单聚合中,聚合根是请假单。

  • 请假单经多级审核后,会产生多条审批意见,为了不便查问,咱们能够将审批意见设计为实体。
  • 销假审批通过后,会产生销假审批通过的畛域事件,因而还会有销假事件实体。

销假聚合有以下* 实体 *:审批意见(记录审批人、审批状态和审批意见)和销假事件实体。

再来剖析一下请假单聚合的值对象。

  • 销假人和下一审批人数据来源于人员组织关系聚合中的人员实体,可设计为值对象。
  • 人员类型、销假类型和审批状态是枚举值类型,可设计为值对象。
  • 确定销假审批规定后,审批规定也可作为请假单的值对象。

请假单聚合将蕴含以下* 值对象 *:销假人、人员类型、销假类型、下一审批人、审批状态和审批规定。

—————————————————————————————————————————————————–

* 人员组织关系聚合 *中,咱们能够建设人员之间的组织关系,通过组织关系类型找到下级审批领导。

它的聚合根是人员,实体有组织关系(包含组织关系类型和下级审批领导),其中组织关系类型(如项目经理、处长、总经理等)是值对象。下级审批领导来源于人员聚合根,可设计为值对象。人员组织关系聚合将蕴含以下 值对象:组织关系类型、下级审批领导。

3. 微服务内的对象清单

在确定各畛域对象的属性后,咱们就能够设计各畛域对象在代码模型中的代码对象(包含代码对象的包名、类名和办法名),建设畛域对象与代码对象的一一映射关系了。

依据这种映射关系,相干人员可疾速定位到业务逻辑所在的代码地位。

(二)设计微服务代码构造

依据 DDD 的代码模型和各畛域对象所在的包、类和办法,能够定义出销假微服务的代码构造,设计代码对象。

1. 应用层代码构造

应用层包含:应用服务、DTO 以及事件公布相干代码。

在 LeaveApplicationService 类内实现与聚合相干的应用服务,在 LoginApplicationService 封装内部微服务认证和权限的应用服务。

(揭示一下:如果应用服务逻辑简单的话,一个应用服务就能够构建一个类,这样能够防止一个类的代码过于宏大,不利于保护。)

2. 畛域层代码构造

畛域层包含一个或多个聚合的实体类、事件实体类、畛域服务以及工厂、仓储相干代码。

* 一个聚合对应一个聚合代码目录,聚合之间在代码上齐全隔离,聚合之间通过应用层协调 *

销假微服务畛域层蕴含销假和人员两个聚合。人员和销假代码都放在各自的聚合所在目录构造的代码包中。

如果随着业务倒退,人员相干性能须要从销假微服务中拆分进去,咱们只需将人员聚合代码包稍加革新,独立部署,即可疾速公布为人员微服务。

(三)后续的工作:具体设计 + 代码开发和测试

1. 具体设计

在实现畛域模型和微服务设计后,咱们还须要对微服务进行具体的设计。

次要设计以下内容:实体属性、数据库表和字段、实体与数据库表映射、服务参数规约及性能实现等。

2. 代码开发和测试

开发人员只须要依照具体的设计文档和性能要求,找到业务性能对应的代码地位,实现代码开发就能够了。

代码开发实现后,开发人员要编写单元测试用例,基于挡板模仿依赖对象实现服务测试。

起源:https://zyfcodes.blog.csdn.ne…
欢送关注公众号【码农开花】一起学习成长
我会始终分享 Java 干货,也会分享收费的学习材料课程和面试宝典
回复:【计算机】【设计模式】【面试】有惊喜哦

正文完
 0