尼恩说在前面:
在40岁老架构师 尼恩的读者交流群(50+)中,最近有小伙伴拿到了一线互联网企业如字节、阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格,遇到很多很重要的面试题:
DDD 的外部接口调用,应该放在哪一层?
DDD架构,如何落地?
谈谈你的DDD落地经验?
谈谈你对DDD的理解?
如何保证RPC代码不会腐烂,升级能力强?
微服务如何拆分?
微服务爆炸,如何解决?
你们的项目,DDD是怎么落地实操的?
所以,这里尼恩给大家做一下系统化、体系化的梳理,使得大家可以充分展示一下大家雄厚的 “技术肌肉”,让面试官爱到 “不能自已、口水直流”。
也一并把这个题目以及参考答案,收入咱们的 《尼恩Java面试宝典PDF》V155版本,供后面的小伙伴参考,提升大家的 3高 架构、设计、开发水平。
除了本文,尼恩输出了一个 《DDD学习圣经》系列,帮助大家彻底掌握DDD。
同时,尼恩持续输出最新的《尼恩 架构笔记》《尼恩高并发三部曲》《尼恩Java面试宝典》的PDF,请关注本公众号【技术自由圈】获取,后台回复:领电子书
问题1:DDD的外部接口调用,应该放在哪一层?(蚂蚁面试)
无论是RPC (如Feign),还是HTTPClient调用Rest API,具体的外部接口调用实现放在infrastructure 基础设施层。
在领域驱动设计(DDD)中,基础设施层负责处理与外部资源的交互,包括数据库、文件系统、消息队列、外部服务等。
来看看 cola的 DDD 架构, 具体如下图
COLA(Clean Object-oriented Architecture)框架是一种基于领域驱动设计(DDD)和面向对象设计原则的架构风格,旨在帮助开发人员构建清晰、可维护和可扩展的应用程序。
1)适配层(AdapterLayer):负责对前端展示(web,wireless,wap)的路由和适配,对于传统B/S系统而言,adapter就相当于MVC中的controller;
2)应用层(ApplicationLayer):主要负责获取输入,组装上下文,参数校验,调用领域层做业务处理,如果需要的话,发送消息通知等。层次是开放的,应用层也可以绕过领域层,直接访问基础实施层;
3)领域层(Domain Layer):主要是封装了核心业务逻辑,并通过领域服务(Domain Service)和领域对象(DomainEntity)的方法对App层提供业务实体和业务逻辑计算。领域是应用的核心,不依赖任何其他层次;
4)基础实施层(InfrastructureLayer):主要负责技术细节问题的处理,比如数据库的CRUD、搜索引擎、文件系统、分布式服务的RPC等。此外,领域防腐的重任也落在这里,外部依赖需要通过gateway的转义处理或者代理处理,才能被上面的App层和Domain层使用。
gateway 代理的架构,也非常类似与适配器的架构。 gateway 代理架构分为两个部分:
-
gateway 接口处于 领域层,
-
gateway 的实现处于 基础实施层(InfrastructureLayer)。
具体如下:
在COLA框架中,Gateway通常指的领域层的网关,是一种隔离在应用程序领域层内部和系统外部之间进行通信和交互的接口或者组件。COLA框架中的Gateway通常被用于以下几个方面:
- 数据交互:Gateway可以用于在领域层和基础设施层之间进行数据交互。例如,领域层的服务可以通过Gateway将数据传递给基础设施层进行持久化,或者基础设施层可以通过Gateway将数据加载到领域层中进行处理。
- 外部接口调用:Gateway也可以用于与外部系统进行通信。例如,Gateway可以封装与外部服务的交互逻辑,使得领域层不直接依赖于外部服务的细节。
- 跨边界通信:在复杂的应用程序中,可能存在多个边界或子系统。Gateway可以用于在这些边界之间进行通信,帮助将系统拆分为更小的模块并保持模块之间的松耦合性。
总之,COLA框架中的Gateway扮演着连接不同层和组件之间的桥梁角色,有助于实现应用程序的模块化、可维护和可扩展性。
问题2:什么是聚合?
“聚合”即“高内聚,低耦合”中的“内聚”之意;
聚合是业务和逻辑紧密关联的实体和值对象组合而成,聚合是数据修改和持久化的基本单元,一个聚合对应一个数据的持久化;
聚合在DDD分层架构中属于领域层,领域层包含了多个聚合,共同实现核心业务逻辑,聚合内的实体以充血模型实现个体业务能力,以及业务逻辑的高内聚; 跨多个实体的业务逻辑通过领域服务来实现,跨多个聚合的业务逻辑通过应用服务来实现;
首先我们来看下聚合模式的定义:
将实体和值对象划分为聚合并围绕着聚合定义边界。
选择一个实体作为每个聚合的根,并仅允许外部对象持有对聚合根的引用。作为一个整体来定义聚合的属性和不变量,并把其执行责任赋予聚合根或指定的框架机制。
一个聚合包含一个聚合根(aggregation root)和一些相关的其他领域对象。
问题3:什么是聚合根?
在《DDD学习圣经》中,我们讲到了“什么是聚合根”,这里再重复一下。
聚合根中的“聚合”即“高内聚,低耦合”中的“内聚”之意;
而“根”则是“根部”的意思,也即聚合根是一种统领式的存在。
事实上,并不存在一个教科书式的对聚合根的理论定义,你可以将聚合根理解为一个系统中最重要最显著的那些名词,这些名词是其所在的软件系统之所以存在的原因。
为了给你一个直观的理解,以下是几个聚合根的例子:
- 在一个电商系统中,一个订单(Order)对象表示一个聚合根
- 在一个CRM系统中,一个客户(Customer)对象表示一个聚合根
- 在一个银行系统中,一次交易(Transaction)对象表示一个聚合根
你可能会问,软件中的概念已经很多了,为什么还要搞出个聚合根的概念?
我们认为这里至少有2点原因:
- 聚合根遵循了软件中“高内聚,低耦合”的基本原则
- 聚合根体现了一种模块化的原则,模块化思想是被各个行业所证明的可以降低系统复杂度的一种思想。所谓的DDD是“软件核心复杂性应对之道”,也即这个意思,它将软件系统在人脑中所呈现地更加有序和简单,让人可以更好地理解和管控软件系统。
在实际项目中识别聚合根时,我们需要对业务有深入的了解,因为只有这样你才知道到底哪些业务逻辑是内聚在一起的。
这也是我们一直建议程序员和架构师们不要一味地埋头于技术而要多关注业务的原因。
事实上,如果让一个从来没有接触过DDD的人来建模,十有八九也能设计出上面的订单、客户和交易对象出来。
没错,DDD绝非什么颠覆式的发明,依然只是在前人基础上的一种进步而已,这种进步更多的体现在一些设计原则上,对此我们将在下文进行详细阐述。
问题4:聚合和MYSQL 表的对应关系是什么 ?
技术自由圈,明天发布此题答案
也可以参考 最新版 《尼恩Java面试宝典》 PDF
问题5:什么是领域驱动设计(DDD)?
技术自由圈,明天发布此题答案
也可以参考 最新版 《尼恩Java面试宝典》 PDF
问题6:DDD建模与微服务架构设计的关系?
技术自由圈,明天发布此题答案
也可以参考 最新版 《尼恩Java面试宝典》 PDF
问题7:微服务一定要DDD,为什么?TDD和DDD 有何关系?
具体答案,请参见此文: https://mp.weixin.qq.com/s/80Gza3-9pO8bYlSJoEDVWg
问题8:DDD架构,如何落地?
具体答案,请参见此文: https://mp.weixin.qq.com/s/_NAHYDIvmT7EbffXkIpqYw
问题9:DDD 领域层,该如何设计?
具体答案,请参见此文:https://mp.weixin.qq.com/s/njBl791vFCd94UplPJEFKw
问题10:微服务如何拆分?原则是什么?
具体答案,请参见此文: https://mp.weixin.qq.com/s/bExjRkVbDLTV2Wf9G6dzrg
问题11:给一个需求,请用DDD设计出来
具体答案,请参见此文: https://mp.weixin.qq.com/s/izzUXIpVmURq6hTCEN0ARQ
参考文献
尼恩特别编著 《DDD学习圣经》
《阿里大佬:DDD 落地两大步骤,以及Repository核心模式》
《极兔面试:微服务爆炸,如何解决?Uber 是怎么解决2200个微服务爆炸的?》
《阿里大佬:DDD中Interface层、Application层的设计规范》
《大厂痴迷DDD:从高德portal重构,看DDD的巨大价值》
《大厂痴迷DDD:从高德portal重构,看DDD的巨大价值》
说在最后:有问题找老架构取经
DDD 相关的面试题,是非常常见的面试题。也是核心面试题。
以上的内容,如果大家能对答如流,如数家珍,基本上 面试官会被你 震惊到、吸引到。
最终,让面试官爱到 “不能自已、口水直流”。offer, 也就来了。
在面试之前,建议大家系统化的刷一波 5000页《尼恩Java面试宝典》V174,在刷题过程中,如果有啥问题,大家可以来 找 40岁老架构师尼恩交流。
另外,如果没有面试机会,可以找尼恩来帮扶、领路。
- 大龄男的最佳出路是 架构+ 管理
- 大龄女的最佳出路是 DPM,
女程序员如何成为DPM,请参见:
DPM (双栖)陪跑,助力小白一步登天,升格 产品经理+研发经理
领跑模式,尼恩已经指导了大量的就业困难的小伙伴上岸。
前段时间,领跑一个40岁+就业困难小伙伴拿到了一个年薪100W的offer,小伙伴实现了 逆天改命 。
另外,尼恩也给一线企业提供 《DDD 的架构落地》企业内部培训,目前给不少企业做过内部的咨询和培训,效果非常好。
尼恩技术圣经系列PDF
- 《NIO圣经:一次穿透NIO、Selector、Epoll底层原理》
- 《Docker圣经:大白话说Docker底层原理,6W字实现Docker自由》
- 《K8S学习圣经:大白话说K8S底层原理,14W字实现K8S自由》
- 《SpringCloud Alibaba 学习圣经,10万字实现SpringCloud 自由》
- 《大数据HBase学习圣经:一本书实现HBase学习自由》
- 《大数据Flink学习圣经:一本书实现大数据Flink自由》
- 《响应式圣经:10W字,实现Spring响应式编程自由》
- 《Go学习圣经:Go语言实现高并发CRUD业务开发》
……完整版尼恩技术圣经PDF集群,请找尼恩领取
《尼恩 架构笔记》《尼恩高并发三部曲》《尼恩Java面试宝典》PDF,请到下面公号【技术自由圈】取↓↓↓