网站邮箱配置,优秀app网站设计,高新区做网站的公司,网站撤销备案1.概要DDD#xff08;Domain-driven design#xff0c;模型驱动设计#xff09;是一种软件设计的指导思想#xff0c;而非固定的一套公式化开发模板#xff08;这样就会导致网络上出现各种基于自己或业务上的理解而产出的DDD落地的实现#xff0c;会让很想学习的开发者迷…1.概要DDDDomain-driven design模型驱动设计是一种软件设计的指导思想而非固定的一套公式化开发模板这样就会导致网络上出现各种基于自己或业务上的理解而产出的DDD落地的实现会让很想学习的开发者迷茫。在项目的全生命周期内所有岗位的人员都基于对业务的相同的理解来展开工作。所有人员站在用户的角度、业务的角度区思考问题而不是从一开始就站在技术的角度去思考。 在项目初期需要将领域专家引入到团队中。那什么是领域专家呢他应该是谁领域专家是指对业务领域非常熟悉或在该业务领域耕耘了很多年。他可以是团队中的任何人项目经理、产品经理、架构师等等都可以是领域专家在需求分析阶段大家都需要对需求整体进行评估。团队需要思考这几个问题是否需要使用DDD现有的团队人员是否能支撑起DDD任何技术或者设计都需要整体的评估而不是一味地去迎合。 接下来让我们看看什么是领域驱动设计。1.1需求分析需求分析的方式有很多例如用例法四色建模法。其目的就是为了去建立领域模型的认知。以上两种方法可能会有些抽象在项目前期与客户沟通过程属于需求分析层面该如何去做。就需要一种统一的一种规则需要统一语言。接下来就是介绍Domain Story Telling这个概念这个概念是由domainstorytelling.org网站提出。包含下图的四个部分。由项目经理或产品经理通过这四种概念对需求进行梳理通过这种方式可以很清楚直白的表达出业务场景。那么这四个部分各代表什么含义呢Pictograms and Vocabulary(象形图和词汇)1.Actors(角色)故事场景的参与者故事指的是功能点。2.WorkObjects参与者与参与者之间传递的内容或需要呈现的内容称为工作对象。3.Acivities代表的Actors和WorkObjects之间关系用线的方式来表示。4.Annotations所有流程的注解。基于以上概念画出来的图大概是这样图中大致描述的是电商购物的一个流程分析。以商城购物系统为例。1用户查看商品向购物网站发送商品列表请求信息。2购物网站响应商品信息给客户。3用户选择商品、购买发送购买商品请求4购物网站响应订单信息给客户。此时订单是未支付的。4.1用户拿到订单信息之后开始支付。发送支付请求。5购物网站根据用户提供的支付信息去银行系统对应的银行账户中进行扣款。5.1扣款成功之后再将扣款成功的订单信息返回给购物网站。6购物网站拿到扣款成功的订单信息之后开始通知仓库管理员准备发货。6.1并且通知用户扣款成功购物网站准备发货了。7仓库管理员拿到货物之后打包发送给快递员。8快递员送货上门给客户。基于以上的分析大家可以清楚的了解到商城购物的整个环节。1.2领域分析领域Domain 一个组织做的事情举个比较狭隘的例子阿里这个组织做的事情就是做电商。子域核心域解决项目核心问题和组织业务紧密关联。支撑域解决项目的非核心问题则具有组织特性但不具有通用性。通用域通用特性没有组织特性。关心的业务重点不同领域的划分也不同。项目初期应考虑的是如何领域建模用业务语言去描述和构建系统。而不是用技术语言去思考代码怎么写。技术是服务于业务的脱离业务谈技术或者架构、设计都是空谈。1商品浏览核心域2选择购买商品、支付订单3订单支付银行交互4发货、仓库管理5配送目前我们暂时先把购物到配送整个过程划分为五个子域为什么不是四部分为什么不是三部分这个没有明确的标准取决于分析者的当前对业务的理解站在现有的角度去分析领域边界。并不是说谁做就会更好符合当前场景下的分析即可。那么划分领域的原则是什么呢原则是业务并不是功能围绕的是业务的走向划分而不是以业务的功能点划分。有了领域边界之后就开始绘制领域的边界图。那么又会引出新的问题边界和边界之间存在什么样的关系是如何交互的站在系统的角度从商品的查询到最终的发货是一个整体的流程。1查询商品的边界和订单的数据做交互2订单需要跟支付、仓库做交互3仓库跟物流送货做交互那么为了让领域的内聚性更强会需要去对领域做一个保护。保护手段有三种防腐层ACL、开放主机服务OHS、发布语言PL。防腐层ACL通过适配器桥接模式、外观模式对于访问操作的一种保护。查询商品和订购商品之间的交互是通过一个接口来实现的。定义这个接口是为了不影响别人是需要做一个处理这个接口不会因为你的领域类的变化而影响接口的定义我就不会去关心你的内部实现了只考虑在接口层面怎么去交互。接口的表现形式有很多种在项目中可以是一个接口在多个项目中可以是一个协议。例如reset api也是一种接口的实现OSH/OL相当于就是做两个根本不在一起的服务进行交互的一种方式。ACL可以理解为它是一种接口Interface层面的定义D和U就是Down和UP用于区分上下级的关系。以查询商品和订购商品订单举例如果需要做防腐层应该在哪个边界中去做呢答案是在查询商品因为不管你商品是什么样的对于订单来说查询商品属于低层。而对于PL订购支付来说就不是了订购支付属于高层所以订购商品需要主动去做防腐处理。1.3 Domain Design领域建模工具推荐使用StarUML或微软的VisoBoundedContext界限上下文https://thedomaindrivendesign.io/bounded-context/Aggregate聚合根聚合根相当于领域中的一个大对象它其实是由多个Entities和多个Value Obiect组成。它是操作具体业务流程中的关键点它会由创建它的方法比如说Factories当然也可以去new。EntitiesEntities是有id的唯一标识的有状态的对象。比如说商城中订单就是这样一个概念。Value Obiect是一个无状态的值对象订单中包含的那些数据可以看作成值对象例如收货信息address无论这些字段的数值如何改变都不会影响订单的状态而发生改变只会影响数据不会影响状态。Services在Entities满足不了需要的情况下它操作的都是无状态的数据对象和逻辑。需要先考虑这两条规则。例如转账功能有AB两个账户AB都有一个Entities对象那么谁转账给谁呢如果在Entities做一个转账好像又不是那么合理所以会提出一个转账的Services需要传递两个账户的Content来完成转账的服务。不能在Entities体现这个业务这个业务是无状态的这个业务不会去影响Entities的状态只是去做了一个业务逻辑的处理。这种情况下是可以用Services去做的。在DDD中需要弱化Services大家不要把领域模型花了那么大心思去分析的业务又大部分通过Services去实现成为了一个数据驱动的开发方式上。所以在做领域设计的时候大家一定要想清楚当时定义的意思和作用。DomainEvents因为Entities是有生命周期的且有状态改变的它很多业务的一些触发条件都是因为这些状态改变而触发的所以这个领域事件可以关联很多业务的执行逻辑。例如订单支付完成付款之后是需要根银行进行交互的当银行将订单数据返回给商城之后。需要触发两个事件第一个通知用户第二个通知仓库管理员。这两件事情的完成都是需要基于支付完订单之后通知给下游的两个领域。所以我们就需要知道领域事件可以作为领域边界触发的一种行为也可以立即为是解耦的一种方式。如果用领域事件的方式去实现业务那么可以拆分的更细。DomainEvents结合事务的一个分享。分布式事务里的事务消息问题我们是把一个业务划分为主次的这个业务关系是相对的。以银行扣款支付成功之后触发两条业务线为例子什么是主呢银行的消息提醒给你已经支付成功了这个业务这是一个主业务那么它的延申业务有两个1通知仓库管理员去发货2通知用户支付成功。在实现业务的时接收银行返回支付状态改变的时候去触发两个事件给延申业务。站在事务的角度上来说需要满足主线的业务事务提交两个延申的业务提交之后就不做管理了成功就成功失败就失败主线就是主线延申就是延申。本地事务提交了才会发送事务消息。事务消息发送完成之后由两个订阅者去完成各自的业务逻辑如果失败了也可以通过事务消息来做重复的事务补偿。Factories是为了创建Entities和Aggregate的对象Aggregate实际上也是一个Entities对象Aggregate只是一个概念实际对应的还是一个对象。具体的实现是Entities、Value Obiect、Services、DomainEvents、Factories、Repositories。而BoundedContext、Aggregate是抽象的概念。Repositories代表的是数据操作的资源和方法。比如说订单信息最终还是要落库的那么就会涉及到数据库操作那么就需要一个数据库操作的对象。让领域不关心数据的操作。1.4UML统一语言看字面意思就能懂的直接略过...组合两个类的对象生命周期是关联的。聚合其他业务也可能包含同样的对象。1.5 实践COLACOLA是阿里巴巴基于领域模型实现的一套服务端的框架1.6 Specification introduction(规范介绍)1.7GIT ManagerGit代码库版本管理1.8Test测试环节单元测试主要测试的是业务领域模型的逻辑。为什么要测试它呢因为在做的时候我们的领域是不需要数据的只要测试通过表示系统的关键业务没有出问题。性能测试根据在设计系统的时候需要设置指标比如系统支撑的最大上限是多少检测是否满足性能指标。性能测试的前提是在一定的资源下去做的如果不断的增加服务器数量也是能达到性能指标的。功能测试大部分项目中的常见的测试通过测试用例来验证功能是否可用。还有集成测试和回归测试。2.Refhttps://domainstorytelling.org/#dst-dddhttps://www.wps.de/modeler/index.html