微服务+DDD 领域驱动设计

位置:首页>文章>详情   分类: 教程分享   阅读(467)   2023-09-20 17:02:31

情景描述

用户在电商网站中购买成功,在微服务中经历了什么

 

设计一套电商系统还不简单

简单想象一下,既然是一个电商系统,有用户去购买,就肯定得有一个用户模块,购买什么东西总不是西北风吧,购买肯定是商品吧,省掉购物车,就得有商品模块吧,商品总得有库存吧,库存就暂时跟商品放一起吧,什么仓储物流先别管,就当作是虚拟商品好了,反正题目也没说不能是虚拟商品^_^,购买成功了,那就必须有订单吧,加个订单模块,下完单总得支付吧,不付钱人家凭什么把东西给你,那就得有个支付模块

 

简单商城,粗暴:四个模块

电商模块

好,几个模块搞定,外加下单流程图

订单流程

 

DDD 领域驱动设计

刚刚确实是梳理了一下模块,既然是微服务,就得进行服务的拆分,服务怎么进行拆分呢,貌似按照刚次梳理模块来划分也是可以,不过这样好像显得我很不是专业,听说现在很多人都要使用DDD(领域驱动设计)来指导微服务的拆分。

参考DDD的设计,DDD官方的架构草图,总体架构分为四层,Infrastructure(基础实施层),Domain(领域层),Application(应用层),Interfaces(表示层,也叫用户界面层或是接口层)

DDD

 

微服务结合DDD

不过对于领域设计而言代码层其实不是最重要,最要的是如何去划分领域,划分好边界。而对于微服务而言,非常适合从业务上去划分各个Modules,划分好各个业务板块,微服务 + DDD,个人觉得首先从微服务的角度考虑去划分大的业务模块,每个微服务都应该是一个可以独立部署,各司其职的模块。简单的说,在微服务实际的开发中,结合DDD的思想去划分所有属于自己的领域。

实施DDD的关键

第一点是使用通过的语言建立所有的聚合,实体,值对象。

第二点也就是最关键的“建模”

  • 划分“战略建模”,从一个种宏观的角度去审核整个项目,划分出“界限上下文”,形成具有上帝视角的“上下文映射图”

  • 还有一个建模“战术建模”,在我们的“战略建模”划分出来的“界限上下文”种进行“聚合”,“实体”,“值对象”,并按照模块分组。

 

构建我们电商系统的上下文映射图

先来确定我们的战略核心的领域是什么,我们的目的是什么,作为一个电商系统,我们的核心肯定是卖出更多的商品,获取更多订单更多的利润,那么销售可以作为我们的一个核心的领域。这个作为一个明确核心域确立下来。

销售领域

确定完核心子域后,根据对这个领域的理解划分出各个上下文,然后根据上下文再确定其他的相关领域。

 

领域模型

初步我们可以看出围绕销售核心域的包含的几大块内容,价格,销售方式,购买的方式,已经购买。 然后我们对支撑着核心域的子域也做了划分,支撑着核心域的有商品域,用户域,通用域有订单域,物流域,支付域。

 

回到我们的主题,我们这次没有购物车,也没有各个会员销售价格,把一些上下文拿掉,并建立映射。

 

领域驱动设计看似简单,其实很难实施,因为在各个环节中都需要对应的领域专家的参加或指导,这样才能设计出最符合实际的上下文映射图,而且我们花费的精力可能相比以后的数据驱动开发模式更多,但在整体对项目的把控性能上说,领域比数据驱动更加抽象,更加的顶层设计,在对应互联网的多变情况看得更远。

我们将微服务拆分为5个领域,分别是销售域,商品域,用户域,订单域,支付域。

 

时序图

时序图

 

微服务 : 利和弊

利弊

利:

1.强模块化边界

我们知道做软件架构,软件设计,模块化是非常重要的一点,一开始我们写程序做软件,我们采用类的方式来做模块化,后面开始采用组件或类库的方式做模块化,可以做到工程上的重用和分享给其他团队来使用。微服务在组件的层次上面又高了一层,以服务的方式来做模块化,每个团队独立开始和维护自己的服务,有明显的一个边界,开发完一个服务其他团队可以直接调用这个服务,不需要像组件通过jar或源码的方式去进行分享,所以微服务的边界是比较清晰的。

2.可独立部署
3.技术多样性

弊(或者说挑战):

1.分布式复杂性

在原来单块应用就是一个应用,一个对单块应用的架构比较熟悉的人可以对整个单块应用有一个很好的把控。但是到了分布式系统,微服务化了以后可能涉及到的服务有好几十个,一些大公司可能涉及到的服务上百个,服务与服务之间是通过相互沟通来实现业务,那么这个时候整个系统就变成非常复杂,一般的开发人员或一个团队都无法理解整个系统是如何工作的,这个就是分布式带来的复杂性。

2.最终一致性

微服务的数据是分散式治理的,每个团队都有自己的数据源和数据拷贝,比方说团队A有订单数据,B团队也有订单数据,团队A修改了订单数据是否应该同步给团队B的数据呢,这里就涉及到数据一致性问题,如果没有很好的解决一致性问题,就可能造成数据的不一致,这个在业务上是不可以接受的。

3.运维复杂性

以往的运维需要管理的是机器+单块的应用,分布式系统和单块应用不一样的是,分布式系统需要很多的服务,服务与服务之间相互协同,那么对分布式系统的资源,容量规划,对监控,对整个系统的可靠性稳定性都非常具备挑战的。

只有在清楚了解微服务带来的挑战,明知道山有虎偏向虎山行,才能够真正的胜任挑战,最重要的是,要清楚明了里面有什么坑,这么避免踩坑。

 

微服务怎么做逻辑分层

目前我们的微服务里面有几个服务,分别是订单,商品,用户,如果客户端向查看 “我的订单” 这么一个接口, 如果客户端假定是pc端,就需要请求三次接口,分别对接订单,商品,用户三个服务,分别拿完三次调用数据,再将三次调用数据进行整合输出展示。要知道pc调用后端服务是走外网,这无疑大大增加了网络的开销,而且让pc端变成更为复杂。假定在中间加多一个层为聚合服务层,即对网络开销进行减少,因为微服务内部是通过内网进行数据传输,也让pc端的业务变得比较简单。

 

13

 

服务聚合

图中的 “pc聚合服务” 也是一个微服务,只不过它是属于聚合服务中间层,我们将为微服务进行逻辑划分,分为2个层:

服务分层

 

微服务基础服务层

基础服务一般属于互联网平台基础性的支撑服务,比方说,电商网站的基础服务有订单服务,商品服务,用户服务等,这些都属于比较基础和原子性,下沉一个公司的基础设施的低层,向下承接存储,向上提供业务能力,有些公司叫(基础服务,中间层服务,公共服务),netflix成为中间层服务。我们暂且统称为基础服务。

微服务聚合服务层

已经有了基础服务能提供业务能力,为什么还需要聚合服务,因为我们有不同的接入端,如app和H5,pc等等,它们看似调用大致相同的数据,但其实存在很多差异,例如PC需要展示更多信息,APP需要做信息裁剪等等。一般低层服务都是比较通用的,基础服务应该对外输出相对统一的服务,在抽象上做得比较好。但是对不同的外界app和pc的接入,我们需要作出不同的适配,这个时候需要有一个层去做出聚合裁剪的工作。例如一个商品详情在pc端展示和app端的展示,pc可能会展示更多的信息,而app则需要对信息作出一些裁剪,如果基础服务直接开放接口给到pc和app,那么基础服务也需要去做成各种设配,这个很不利于基础服务的抽象,所以我们在基础层之上加入聚合服务层,这个层可以针对pc和app做成适当的设配进行相应的裁剪。

那么我们的微服务中,又增加了一个服务,属于聚合服务

服务

 

 

更多/出处:我只是下了个订单,鬼知道我在微服务里经历了什么 - 掘金 (juejin.cn)

 

地址:https://www.leftso.com/article/1704030898590060546.html

相关阅读

情景描述 用户在电商网站中购买成功,在微服务中经历了什么   设计一套电商系统还不简单 简单想象一下,既然是一个电商系统,有用户去购买,就肯定得有一个用户模块,购买什么东...
演示项目源码下载:(访问密码:9987)Spring-Cloud-discovery-server.zip 了解如何创建微服务的基础上,Spring Cloud,对Netflix的Eureka注...
项目源码下载:(访问密码:9987)Spring-Cloud-Circuit-Breaker.zip学习在调用底层微服务的同时利用调用的Spring Cloud Netflix堆栈组件之一Hys...
演示项目源码下载:(访问密码:9987)Spring-Cloud-Consoul.zip了解如何创建微服务的基础上Spring cloud,对登记HashiCorp Consul注册服务器,以及...
演示项目源码下载:(访问密码:9987)spring-cloud-zipkin.zipZipkin是非常有效的工具分布追踪在微服务生态系统
       在使用微服务架构中,我们已经克服许多微服务架构导致的遗留问题,它允许我们创建稳定的分布式应用程序,并对代码、团队规模、维护、发布周期、云服务等进行所需的控制
演示项目源码下载:(访问密码:9987)spring-cloud-config-server-git.zip微服务方法现在已经成为任何新 API 开发的行业标准,几乎所有组织都在推广它
项目源码下载:(访问密码:9987)spring-cloud-dashboards.zip在交付基于微服务的应用程序时,广泛使用 Spring Boot 和 Spring Cloud
1. 什么是 spring cloud?spring cloud 是一系列框架的有序集合
项目源码下载:(访问密码:9987)spring-cloud-apigateway_zuul.zip学习使用Netflix Zuul及其与Spring Cloud 的牢固结合来创建负载均衡器