保健励志美文体育育儿作文
投稿投诉
作文动态
热点娱乐
育儿情感
教程科技
体育养生
教案探索
美文旅游
财经日志
励志范文
论文时尚
保健游戏
护肤业界

从MVC到DDD的架构演进

  DDD这几年越来越火,资料也很多,大部分的资料都偏向于理论介绍,有给出的代码与传统MVC的三层架构差异较大,再加上大量的新概念很容易让初学者望而却步。本文从MVC架构角度来讲解如何演进到DDD架构。
  1
  从DDD的角度看MVC架构的问题
  代码角度:瘦实体模型:只起到数据类的作用,业务逻辑散落到service,可维护性越来越差;面向数据库表编程,而非模型编程;实体类之间的关系是复杂的网状结构,成为大泥球,牵一发而动全身,导致不敢轻易改代码;service类承接的所有的业务逻辑,越来越臃肿,很容易出现几千行的service类;对外接口直接暴露实体模型,导致不必要开放内部逻辑对外暴露,就算有DTO类一般也是实体类的直接copy;外部依赖层直接从service层调用,字段转换、异常处理大量充斥在service方法中。
  项目管理角度:交付效率:越来越低;稳定性差:不好测试,代码改动的影响范围不好预估;理解成本高:新成员介入成本高,长期会导致模块只有一个人最熟悉,离职成本很大。
  2
  第一层:初出茅庐
  以上的问题越来越严重,很多人开始把眼光转向DDD,于是埋头啃了几本大部头的书,对以下概念有了基本的了解:统一语言限界上下文领域、子域、支撑域聚合、实体、值对象分层:用户接口层、应用层、领域层、基础层
  于是把MVC架构进行了改造,演进成DDD的分层架构。
  DDD分层架构:
  MVC架构到DDD分层架构的映射:
  至此,算了基本入门了DDD架构,扩展性也得到了一定的提升。不过随着业务的发展,不断冒出新的问题:一段业务逻辑代码,到底应该放到应用层还是领域层?领域服务当成原来的MVC中的service层,随着业务不断发展,类也在不断膨胀,好像还是老样子啊?聚合包含多个实体类,这个接口用不到这么多实体,为了性能还是直接写个SQL返回必要的操作吧,不过这样貌似又回到了MVC模式既然实体类可以包含业务逻辑、领域服务也可以放业务逻辑,那到底放哪里?资料上说领域层不能有外部依赖,要做到100单测覆盖,可是我的领域服务中需要用到外部接口、中央缓存等等,那这不就有了外部依赖了吗?
  3
  第二层:草船借箭(战术设计)
  带着问题不断学习他人经验,并不断的尝试,逐渐get到以下技能:
  1、领域层
  领域(domain)是个模块,包含以下组成部分,传统的service按功能可能拆分到任何一个地方,各司其职。1个聚合1到多个实体若干值对象多个DomainService1个Factory:新建聚合1个Repository:聚合仓储服务
  聚合根(AggregateRoot):
  聚合本身也是一个实体,聚合可以包含其他实体,其他实体不能脱离聚合而单独提供服务,比如一篇文章下的评论,评论必须从属于文章,没有文章也就没有评论。仓库层(repository)也必须是以聚合为核心提供服务的。
  实体可以理解为一张数据库表,必须有主键。
  值对象没有主键,依附于实体而存在,比如用户实体下住址对象,一般在数据库中已json字符串的形式存在;最常见的值对象是枚举。
  仓库服务(repository):
  资源库是聚合的仓储机制,外部世界通过资源库,而且只能通过资源库来完成对聚合的访问。资源库以聚合的整体管理对象。因此,一个聚合只能有一个资源库对象,那就是以聚合根命名的资源库。除此之外的其他对象,都不应该提供资源库对象。仓储服务的实现一般有SpringDataJPA、Mybatis两种方式。
  如果是用SpringDataJPA实现,直接使用JPA注解OneToOne、OneToMany,配合fetch配置,即可一个方法查询出所有的关联实体。
  如果是用Mybatis实现,那么repository需要加入多个mapper的引用,再手动做拼装。
  这里有一个经典的Hibernate笛卡尔积问题,答案是在聚合根中,一般不会加在大量的关联实体对象。如果确实需要查询关联对象而关联对象又比较多怎么办呢?在DDD中有一个CQRS(CommandQueryResponsibilitySegregation)模式,是一种读写分离模式,在此场景中需要将查询操作放到查询命令中分页查询。
  当然CQRS也是一个很复杂模式,不应照搬他人方案,而是根据自己的业务场景选择适合自己的方案,以下列举了CQRS的几种应用模式:
  单服务跨服务
  共享模型不同模型
  共享存储不同存储
  适用场景
  单服务
  共享模型
  共享存储
  不算CQRS,但对于很多中小型项目已经足够
  单服务
  不同模型
  共享存储
  适用于查询比较复杂的场景
  单服务
  不同模型
  不同存储
  适用于查询比较复杂且对查询效率要求较高的场景
  跨服务
  不同模型
  不同存储
  主要用于微服务中需要对多个服务进行聚合查询的场景
  工厂服务(factory):
  作用是创建聚合,只传入必要的参数,工厂服务内部隐藏复杂的创建逻辑。简单的聚合可以直接通过new、静态方法等创建,不是必须由factory创建。
  领域服务:
  单个实体对象能处理的逻辑放到实体里,多个实体或有交互的场景放到领域服务里。
  领域服务可不可以调用仓储层或外部接口?可以,但不能直接和领域服务代码放一起,领域服务模块存放API,实现放基础层(infrastructure)。
  领域服务对象不建议直接以聚合名DomainService命名,而要以操作命令关联,比如用户保存服务命名为:UserSaveService,审核服务:UserAuditSerivce。
  2、应用层
  应用层通过应用服务接口来暴露系统的全部功能。在应用服务的实现中,它负责编排和转发,它将要实现的功能委托给一个或多个领域对象来实现,它本身只负责处理业务用例的执行顺序以及结果的拼装。通过这样一种方式,它隐藏了领域层的复杂性及其内部实现机制。
  比如下订单服务的方法:publicvoidsubmitOrder(LongorderId){OrderorderOrderFetchService。fetchById(orderId);获取订单对象OrderCheckSerivce。check(order);验证订单是否有效OrderSubmitSerivce。submit(order);提交订单ShoppingCartClearService。clear(order);移除购物车中已购商品NotifySerivce。emailNotify(order。getUser());发送邮件通知买家}
  对于复杂的业务来说,应用层也有几种模式:编排服务:最典型比如Drools;Command、Query命令模式;业务按Rhase、Step逐层拆分模式;
  3、Maven模块划分
  基础层是比较简单一层,不过这里还有个比较疑惑的问题:按照DDD的四层架构图去划分Maven模块,基础层是最上的一层,但是基础层也要包含基础组件供其他层使用,这时基础层应该是放到最下层,直接按照这样构建Maven模块会造成循环依赖。
  相比来说,另一个架构图更准确一些,不过依然没有直观体现Maven模块如何划分。
  我的最佳实践是将基础层拆分两部分,一部分是基础的组件仓储API,一部分是实现,maven模块划分图如下所示:
  4
  第三层:运筹帷幄(战略设计)
  经过以上的两层的磨炼,恭喜你把DDD战术都学习完了,应付日常的代码开发也够了,不过作为架构师来说,探索的道路还不能止步于此,接下来会DDD战略部分。战略部分关注点有3个:
  1、统一语言
  统一语言的重要性可以根据JeffPatton在《用户故事地图》中给出的一副漫画来直观的描述:
  统一语言是提炼领域知识的输出结果,也是进行后续需求迭代及重构的基础,统一语言的建立有以下几个要点:统一语言必须以文档的形式提供出来,并且在整个项目组的各团队达成共识;统一语言必须每个中文名有对应的英文名,并且在整个技术栈保持一致;统一语言必须是完整的,包含以下要素:领域模型的概念与逻辑;界限上下文(BoundedContext);系统隐喻;职责的分层;模式(patterns)与惯用法。
  2、领域划分
  以事件风暴的形式(EventStorming),列出所有的用户故事(UseStory),用户故事可通过6W模型来构建,即描写场景的Who、What、Why、Where、When与hoW六个要素。然后圈选功能相近的部分,就形成了领域,领域又根据职能不同划分为:核心域、支撑域、通用域。
  具体的过程有很多参考资料,这里不再细讲,最终的输出是领域划分图,以下是一个保险业务示例:
  3、限界上下文
  限界上下文包含两部分:上下文(Context)是业务目标,限界(Bounded)则是保护和隔离上下文的边界。
  比如上图中的实现部分即是限界上下文的边界,虚线部分代表了领域的边界。限界上下文没有统一的划分标准,需要的读者根据自己的业务场景来甄别如何划分。
  一个上下文中包含了相同的领域知识,角色在上下文中完成动作目标。
  边界体现在以下几方面:领域逻辑层:确定了领域模型的业务边界,维护了模型的完整性与一致性,从而降低系统的业务复杂度;团队合作层:限界上下文一般也是用户换分团队的依据;技术实现层:限界上下文可当成是微服务的划分边界。
  5
  DDD的不足
  DDD架构作为一套先进的方法论,在很多场景能发挥很大价值,但是DDD也不是银弹。高级的架构师把DDD架构当成一种工具,结合其他架构经验一起为业务服务。
  DDD的不足有几个方面:性能:DDD是基于聚合来组织代码,对于高性能场景下,加载聚合中大量的无用字段会严重影响性能,比如报表场景中,直接写SQL会更简单直接;事务:DDD中的事务被限定在限界上下文中,跨多个限界上下文的场景需要开发者额外考虑分布式事务问题;难度系数高,推广成本大:DDD项目需要领域专家专家,且需要特别熟悉业务、建模、OOP,对于管理者来说评估一个人是否真的能胜任也是一件困难的事情。
  6
  总结
  本文从MVC架构开始讲述了如何从演进到DDD架构,限于篇幅很多DDD的知识点没有讲到,希望大家在实践过程中能灵活运用,尽享DDD给业务带来的价值。本文如有不足之处敬请反馈。总结了很多有关于java面试的资料,希望能够帮助正在学习java的小伙伴。由于资料过多不便发表文章,创作不易,望小伙伴们能够给我一些动力继续创建更好的java类学习资料文章,
  请多多支持和关注小作,别忘了点赞评论转发。右上角私信我回复【03】即可领取免费学习资料谢谢啦!
  原文出处:https:mp。weixin。qq。coms653gRnwsIVEYTApNWHsyg

姐姐写给小狗的作文范文bubble是一条可爱的狗,是一条得到家里所有人喜爱的狗。从没想过自己会养一只黑色的狗,可是bubble出现时我们还是喜欢上了他。他刚来姑姑家时,晚上一直小声地哼哼……三株野菊八年级作文700字三株野菊八年级作文700字在这些年的风吹雨打中,院子里的三株野菊依旧和往常一样长着翠绿的枝叶。每当放学回家,我总会走进寂静的小院,看看那三株野菊花。不是因为它显眼,……怀念曾经的温馨初中作文窗外,月影婆娑,夜风凄凉,随着一声声婉转的喵喵声,我的思绪又回到了我们一年前的欢乐时光。那时的我们是同桌,那是我的幸福在你的兜里(我以前说过:最幸福的事莫过于把手插在同桌……小草赞作文范例导语:我家门前有一块草坪,上面种着小草。它们是那样富有生机,春天一到,它们一下子就铺开了一片绿色的大地,细看,它们是嫩绿色的,水灵灵的,多么喜人。下面由小编为大家整理的小草赞作……股票分红买来划算吗?很多新股民觉得股票分红就是赚到了,刚买到股票就有分红不是马上就可以赚钱吗?也有一部分投资者认为分红就是拿自己的钱在分红送股,拿到分红了,股价降低了,股份增加了股价变低了,就等于……信用卡呆账会涨利息吗?一招教你解决呆账信用卡呆账有两种情况:一、长期欠钱不还,逾期时间久,银行觉得欠款长时间无法收回,就会做呆账处理,也就是逾期呆账;逾期呆账时间久了的话,再加上利息每天都在涨,所以可能……3条经典阿里环线,哪条是你走过的呢?3条经典阿里环线,哪条是你走过的呢?说到阿里环线,很多人对这个名词熟悉,毕竟只要喜欢西藏,就会有所了解。但如果说到具体哪条线路,可能大家还是会有些迷糊。其实阿里线路总分为……自动驾驶科技公司获战略融资健身食品品牌完成数千万元A轮融资投TIPS1、下载IT桔子APP,实时跟踪国内外一级市场投融资事件。2、转载请注明来源自IT桔子(itjuzi521),侵权必究。3、建立投资速递长……面目全非的公司之TCL鹰的重生大家好,我是水皮,欢迎来到ESG会客厅,我们今天的话题是面目全非的上市公司之TCL。那么,说起TCL,很多人就会想到李东生,李东生在水皮的印象中,是他那一代企业家中间硕果……C罗女友突然老好多!产后1月公开首秀,拎60万包却被发际线抢产后才1月,C罗女友乔治娜就着急开工了,再次蹭戛纳红毯,这是她生娃后的公开首秀,全程冷脸显然还未从失去龙凤胎男宝的悲痛中完全走出来,情绪明显特别低落。而向来热爱秀身材的她,这次……撞衫不可怕,谁丑谁尴尬!乔治和莺歌穿同款卫衣,科比詹姆斯撞衫俗话说得好撞衫不可怕,谁丑谁尴尬,想必大家在平日生活中,都遇到过和其他人撞衫的窘境吧,如果对方和你穿的一样,还比你高和帅,那就真的想立刻找个地缝钻进去了!而即便是腰缠万贯的NB……中超美职联抢俄超第一中锋1米96适合泰山,欠薪冻结资产选哪个欧洲足坛本赛季只剩下欧冠决赛要踢,踢完欧冠本赛季就正式结束了,之后就将进入到让人期待的转会期。然而国内的中超联赛甚至还没有开赛,距离正常时期的开赛时间已经过去了整整3个月,眼看……
12岁韩昊霖现百花奖候选名单,个人票房高达78亿,与徐峥颇有演艺圈中不乏有知名童星出现,但能像韩昊霖这样,只有12岁,就取得了79亿个人票房成绩的小演员,还真是不多见,当然,他的傲人成绩与导演徐峥有莫大的关系!日前(10日)第26……亚洲锁定35人!中国27人泰国5人,亚太选拔落幕职业名单基本2022年6月11日,斯诺克亚太QSchool圆满落幕,4个职业名额全部诞生,东道主泰国成为最大赢家,有2名选手拿到职业资格,还有一位巴基斯坦选手一位印度选手,中国唯一报名参赛……早安云南西华列戟护金尊,峻峭诸峰万世痕如戟山峰数三元,悬崖峭壁笼彩烟。半山亭台半山树,碧藤紫花锦绣悬。抚今追昔,不由人欲将西华胜景前世今身追溯一番。西华盛景文山市西华公园,原名三元洞,天生三洞,形似三眼……中秋节征文有一种醉,叫团圆品学网专稿未经允许不得转载又到了今年的中秋节,去年的中秋节,我还是一边啃着月饼,一边吵着要灯笼的小女孩。回想起来,变化真是大。看着天空皎洁的月亮,又想起了儿时常常唱这样的……云视角文化和自然遗产日云南非遗,活起来,传下去今年6月11日是文化和自然遗产日。我国的文化和自然遗产包括文化遗产和自然遗产,而文化遗产又分为物质文化遗产和非物质文化遗产。在这些种类繁多的遗产中,非物质文化遗产(非遗)有其独……预告即将启幕!13日开始,和我们一起行走彩云南【来源:云南网络广播电视台】16周时间,16个州市,在行走中领略、在移动中饱览,梳理变化成就,感受时代变迁。打开网易新闻查看更多图片走进项目建设一……去云南7次后,熬夜总结!送给近期想去云南旅游的姐妹去云南旅游吧,有海、有满城的鲜花古镇,有治愈系的田园,有白雪皑皑的雪山,宛如人间仙境,有辽阔的森林和草原!看看不一样的彩云之南!出去玩,最关心的就是吃喝住行玩我整理了去云……天气真热夏天来了,天气越来越热了,大树上,知了在树上拼命地叫:ldquo;热死了,热死了hellip;hellip;rdquo;正午,太阳像个火球一样把大地烤焦了,空中没有一丝风……作文比赛初二作文导语:在台上领奖,接受全校人的鼓励,不禁让我回想起我在准备作文比赛的情形。下面是小编为大家带来的作文比赛初二作文,希望对大家有所帮助。作文比赛初二作文1星期四,语文老师发……从小使用尿不湿的孩子,长大后可能会有优势,年龄越大差距越大尿不湿的诞生解放了妈妈的双手,让妈妈有更多的精力去应对其他事情。可是有些上了年纪的老人,却不愿意给小宝宝使用尿不湿,当然因此而产生的婆媳矛盾也在增加。可事实上,使用尿不湿……呵护血管健康,平时需要做好这3件事,或许能降低患上脑梗的风险据相关统计,脑梗这一疾病在世界范围内的患者有数千万之多,而每年因此病辞世的人也不少,由此,说它是当代社会比较致命的病症之一也不为过。患上脑梗的原因有很多,像是大动脉粥样硬……三七和丹参都通血管?到底哪个效果好?可别吃错了现在的生活条件好了,很多小康家庭每顿饭大鱼大肉,正是因为不控制饮食,加上缺乏锻炼,才让许多人逐渐发胖。过度肥胖时体内脂肪物质堆积,会影响多个指标,有的人血清胆固醇,甘油三……
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网