字节面试:微服务一定要DDD,为什么?TDD和DDD 有何关系?
文章很长,且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录 博客园版 为您奉上珍贵的学习资源 :
免费赠送 :《尼恩Java面试宝典》 持续更新+ 史上最全 + 面试必备 2000页+ 面试必备 + 大厂必备 +涨薪必备
免费赠送 :《尼恩技术圣经+高并发系列PDF》 ,帮你 实现技术自由,完成职业升级, 薪酬猛涨!加尼恩免费领
免费赠送 经典图书:《Java高并发核心编程(卷1)加强版》 面试必备 + 大厂必备 +涨薪必备 加尼恩免费领
免费赠送 经典图书:《Java高并发核心编程(卷2)加强版》 面试必备 + 大厂必备 +涨薪必备 加尼恩免费领
免费赠送 经典图书:《Java高并发核心编程(卷3)加强版》 面试必备 + 大厂必备 +涨薪必备 加尼恩免费领
免费赠送 资源宝库: Java 必备 百度网盘资源大合集 价值>10000元 加尼恩领取
字节面试:微服务一定要DDD,为什么?TDD和DDD 有何关系?
尼恩说在前面
在40岁老架构师 尼恩的读者交流群(50+)中,最近有小伙伴拿到了一线互联网企业如阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格,遇到很多很重要的面试题:
微服务一定要用DDD,为什么?
TDD也很流行,什么是TDD? TDD和DDD 有何关系?
小伙伴没有回答好,导致大厂机会没了, 多么可惜。
所以,这里尼恩给大家做一下系统化、体系化的梳理,使得大家可以充分展示一下大家雄厚的 “技术肌肉”,让面试官爱到 “不能自已、口水直流”。
也一并把这个题目以及参考答案,收入咱们的 《尼恩Java面试宝典PDF》V164版本,供后面的小伙伴参考,提升大家的 3高 架构、设计、开发水平。
《尼恩 架构笔记》《尼恩高并发三部曲》《尼恩Java面试宝典》的PDF,请到公号【技术自由圈】获取
本文目录
字节面试:微服务一定要用DDD,为什么?
首先,说说微服务设计和拆分的困境
微服务解决大单体架构的的很多问题,比如扩展性、弹性伸缩能力、小规模团队的敏捷开发等等。
好是好,但是微服务实践过程中,大部分架构师遇到很多难题:
-
微服务的粒度应该多大呀?
-
微服务到底应该如何拆分和设计呢?
-
微服务的边界应该在哪里?
拆分微服务的时候,两种情况:
- 有的颗粒度过大, 还是大单体
- 有的颗粒度过小,导致上线和运维工作量巨大。
很多“水货架构师”,在拆分微服务的时候凭借感觉:简单的把微服务理解为小单体,粗暴的把原来一个大单体包拆分为多个部署包,导致后期工程风险严重失控。从而陷入了微服务设计和拆分的困境。
其次,说说解决困境的两个方面
微服务设计和拆分的困境,分成两个方面:
- 理论面,缺乏一套系统的理论和方法指导。
- 落地面,缺乏一套可以参考的代码骨架。
最后,说说DDD的理论指导价值和落地指导价值。
DDD 就是这种不可多得的微服务设计和拆分的理论和方法指导。
DDD 指导了两个层面的设计和建模:
-
宏观层面: 指导了微服务外部的建模,包括系统和系统之间, 微服务和微服务之间依赖关系的建模。
-
微观层面:指导微服务内部的建模,包括 领域对象建模, 微服服务落地的各层关系的建模。
正因为如此,DDD现在非常火爆,有其巨大生产价值、经济价值的, 绝不仅仅是一套概念那么简单。
各个大厂的大致情况是:
- 新项目都尽可能结合DDD进行设计建模、工程落地
- 老项目也在使用DDD进行从点到面的改造,以榨取软件的最佳性能。
下面是尼恩在网上梳理到的案例, 实际上这仅仅就是冰山一角:
《阿里大佬:DDD 落地两大步骤,以及Repository核心模式》
《极兔面试:微服务爆炸,如何解决?Uber 是怎么解决2200个微服务爆炸的?》
《阿里大佬:DDD中Interface层、Application层的设计规范》
《大厂痴迷DDD:从高德portal重构,看DDD的巨大价值》
字节面试:TDD也很流行,什么是TDD?
测试驱动开发是一种开发方法,其核心理念是在编写实际代码之前先编写测试用例。
这些测试用例描述了所期望的代码行为。
开发者根据这些测试用例来编写代码,以确保代码通过所有测试并符合预期。
TDD的步骤通常是:
编写测试用例 -> 运行测试(测试应该失败) -> 编写代码 -> 再次运行测试(测试应该通过)。
常见的TDD框架包括JUnit(Java)、RSpec(Ruby)和unittest(Python)。
适合TDD这种模式的项目具备以下特点:
- 项目的需求必须足够清晰,而且程序员对整个需求有足够的了解。
- 项目的复杂度和依赖性要低。对于一个业务模型及其复杂、内部模块之间的相互依赖性非常强的项目,采用TDD反而会得不尝失,这会导致程序员在拆分接口和写测试代码的时候工作量非常大。另外,由于模块之间的依赖性太强,我们在写测试代码的时候可能不采取一些桥接模式来实现,这样势必加大了程序员的工作量。
字节面试:TDD和DDD有何关系?
DDD如此之香,那么多大厂对DDD如此痴迷, 背后 有深层次、根本性的原因
具体参见尼恩在《DDD学习圣经》为大家深度总结的、下面的6点:
DDD 的一个根本能力,提升了 可测试性
DDD 为 TDD 的落地,提供很好的 基础支撑 和 前置条件。
在问题DDD的前置问题
面试官在问DDD之前,先会问下 微服务。
这里把这些前置问题,也给大家简历梳理一下。
附1:说说,你对微服务是怎么理解的?
微服务是由Martin Fowler大师提出的。微服务是一种架构风格,通过将大型的单体应用划分为比较小的服务单元,从而降低整个系统的复杂度。
微服务,是一种架构风格,它将应用构建为一个小型自治服务的集合,。通俗地说,就像蜜蜂通过对蜡制的等边六角形单元来构建它们的蜂巢。他们最初从使用各种材料的小单元开始,一点点的搭建出一个大型蜂巢。
微服务优点:
优势 | 说明 |
---|---|
独立开发 | 所有微服务都可以根据各自的功能轻松开发 |
独立部署 | 根据他们所提供的服务,可以在任何应用中单独部署 |
故障隔离 | 即使应用中的一个服务不起作用,系统仍然继续运行 |
混合技术栈 | 可以用不同的语言和技术来构建同一应用程序的不同服务 |
粒度缩放 | 各个组件可根据需要进行扩展,无需将所有组件融合到一起 |
微服务缺点:
1、服务调用的复杂性提高了: 网络问题、容错问题、负载问题、高并发问题。
2、分布式事务: 尽量不要使用微服务事务。
3、测试的难度提升了:
4、运维难度提升:单体架构只要维护一个环境,而到了微服务是很多个环境,并且运维方式还都不一样。所以对部署、监控、告警等要求就会变得非常困难。
5、微服务拆分, 缺乏统一的标准,拆分不合理会导致后面 出现 内部混乱,从 "大泥球" 演变成 更多的 ”小泥球“
附2:说说,微服务架构中的DRY是什么?
DRY(Don’t Repeat Yourself) , 代表:不要重复自己。
DRY促进了重用代码/代码复用。
这意味着在多个地方不要重复同样的代码,而应该将它们封装为库或服务,以便在其他地方调用。
这种思想可以促进代码的模块化和可重用性,提高开发效率和质量。
所以,从微服务出发, 就演进出来了 技术中台、数据中台、业务中台的架构
具体请参见尼恩 《DDD 学习圣经》
但是
DRY反过来导致紧耦合。
附3:说说,设计微服务的最佳实践是什么?
具体答案,请参见尼恩之前写过的一个面试题答案:
注意其中的核心点:领域驱动原则,不数据驱动原则,也不是界面驱动原则
尼恩说在后面
DDD 面试题,是非常常见的面试题。大家面试的时候, 可以参考以上的内容去答,基本上 面试官会被你 震惊到、吸引到。
另外, 如果大家在实操DDD的过程中,遇到困难,也可以找尼恩求助:
- 尼恩结合一个工业级的DDD实操项目,在第34章视频《DDD的学习圣经》中,从理论面、落地面一起,给大家做了彻底的介绍。
- 另外,在尼恩的一对一简历指导时,也指导DDD如何织入项目、应用到实操, 帮助大家彻底穿透DDD。
此题目收入了最新的尼恩面试宝典,在面试之前,建议大家系统化的刷一波 5000页《尼恩Java面试宝典PDF》,并且在刷题过程中,如果有啥问题,大家可以来 找 40岁老架构师尼恩交流。
最终,让面试官爱到 “不能自已、口水直流”。offer, 也就来了。
技术自由的实现路径:
实现你的 架构自由:
《阿里二面:千万级、亿级数据,如何性能优化? 教科书级 答案来了》
《峰值21WQps、亿级DAU,小游戏《羊了个羊》是怎么架构的?》
… 更多架构文章,正在添加中
实现你的 响应式 自由:
这是老版本 《Flux、Mono、Reactor 实战(史上最全)》
实现你的 spring cloud 自由:
《Spring cloud Alibaba 学习圣经》 PDF
《分库分表 Sharding-JDBC 底层原理、核心实战(史上最全)》
《一文搞定:SpringBoot、SLF4j、Log4j、Logback、Netty之间混乱关系(史上最全)》
实现你的 linux 自由:
实现你的 网络 自由:
《网络三张表:ARP表, MAC表, 路由表,实现你的网络自由!!》
实现你的 分布式锁 自由:
实现你的 王者组件 自由:
《队列之王: Disruptor 原理、架构、源码 一文穿透》
《缓存之王:Caffeine 源码、架构、原理(史上最全,10W字 超级长文)》
《Java Agent 探针、字节码增强 ByteBuddy(史上最全)》