01 | 领域驱动设计:微服务设计为什么要选择 DDD?

我们知道,微服务设计过程中往往会面临边界如何划定的问题,我经常看到项目团队为微服务到底应该拆多小而争得面红耳赤。不同的人会根据自己对微服务的理解而拆分出不同的微服务,于是大家各执一词,谁也说服不了谁,都觉得自己很有道理。

那在实际落地过程中,我也确实见过不少项目在面临这种微服务设计困惑时,是靠拍脑袋硬完成的,上线后运维的压力就可想而知了。那是否有合适的理论或设计方法来指导微服务设计呢?当你看到这一讲的题目时,我想你已经知道答案了。

没错,就是 DDD。那么今天我就给你详细讲解下:微服务设计为什么要选择领域驱动设计?

软件架构模式的演进

在进入今天的主题之前,我们先来了解下背景。

我们知道,这些年来随着设备和新技术的发展,软件的架构模式发生了很大的变化。软件架构模式大体来说经历了从单机、集中式到分布式微服务架构三个阶段的演进 。随着分布式技术的快速兴起,我们已经进入到了微服务架构时代。

我们先来分析一下软件架构模式演进的三个阶段。

第一阶段是单机架构: 采用面向过程的设计方法,系统包括客户端 UI 层和数据库两层,采用 C/S 架构模式,整个系统围绕数据库驱动设计和开发,并且总是从设计数据库和字段开始。

第二阶段是集中式架构: 采用面向对象的设计方法,系统包括业务接入层、业务逻辑层和数据库层,采用经典的三层架构,也有部分应用采用传统的 SOA 架构。这种架构容易使系统变得臃肿,可扩展性和弹性伸缩性差。

第三阶段是分布式微服务架构: 随着微服务架构理念的提出,集中式架构正向分布式微服务架构演进。微服务架构可以很好地实现应用之间的解耦,解决单体应用扩展性和弹性伸缩能力不足的问题

我们知道,在单机和集中式架构时代,系统分析、设计和开发往往是独立、分阶段割裂进行的。

比如,在系统建设过程中,我们经常会看到这样的情形:A 负责提出需求,B 负责需求分析,C 负责系统设计,D 负责代码实现,这样的流程很长,经手的人也很多,很容易导致信息丢失 。最后,就很容易导致需求、设计与代码实现的不一致,往往到了软件上线后,我们才发现很多功能并不是自己想要的,或者做出来的功能跟自己提出的需求偏差太大。

而且在单机和集中式架构这两种模式下,软件无法快速响应需求和业务的迅速变化 ,最终错失发展良机。此时,分布式微服务的出现就有点恰逢其时的意思了。

微服务设计和拆分的困境

那进入微服务架构时代以后,微服务确实也解决了原来采用集中式架构的单体应用的很多问题,比如扩展性、弹性伸缩能力、小规模团队的敏捷开发等等。

但在看到这些好处的同时,微服务实践过程中也产生了不少的争论和疑惑:微服务的粒度应该多大呀?微服务到底应该如何拆分和设计呢?微服务的边界应该在哪里?

可以说,很久以来都没有一套系统的理论和方法可以指导微服务的拆分,包括微服务架构模式的提出者 Martin Fowler 在提出微服务架构的时候,也没有告诉我们究竟应该如何拆分微服务。

于是,在这段较长的时间里,就有不少人对微服务的理解产生了一些曲解。有人认为:微服务很简单,不过就是把原来一个单体包拆分为多个部署包,或者将原来的单体应用架构替换为一套支持微服务架构的技术框架,就算是微服务了。 还有人说:微服务嘛,就是要微要小,拆得越小效果越好。