首页 > 其他分享 >从MVC跨越到DDD微服务架构是如何演进的

从MVC跨越到DDD微服务架构是如何演进的

时间:2023-07-19 13:00:13浏览次数:43  
标签:服务 演进 架构 MVC 聚合 领域 DDD

微服务架构演进

领域模型中对象的层次从内到外依次是:值对象、实体、聚合和限界上下文。

实体或值对象的简单变更,一般不会让领域模型和微服务发生大变。但聚合的重组或拆分却可以。因为聚合内业务功能内聚,能独立完成特定业务。那聚合的重组或拆分,势必引起业务模块和系统功能变化。

可以聚合为基础单元,完成领域模型和微服务架构的演进。
聚合可作为整体,在不同领域模型间重组或拆分,或直接将一个聚合独立为微服务。

微服务架构的演进案例

现有
微服务 1:包含聚合 a、b、c
微服务2:
微服务3:包含聚合 d、e、f

  • 当发现微服务1中聚合a的功能经常被高频访问,以致拖累了整个微服务1的性能,可把聚合a,从微服务1中剥离,独立为微服务2以应对高性能场景
  • 随业务发展,发现微服务3的领域模型变化,聚合d会更适合放到微服务1的领域模型。即可将聚合d整体迁移到微服务1。注意定义好聚合间的代码边界
  • 架构演进后,微服务1从最初包含聚合a、b、c,演进为包含聚合b、c、d的新领域模型和微服务

可见,好的聚合和代码模型的边界设计,可让你快速应对业务变化,轻松实现领域模型和微服务架构演进。

微服务内服务的演进

在微服务内部,实体的方法被领域服务组合和封装,领域服务又被应用服务组合和封装。在服务逐层组合和封装的过程中,你会发现这样一个有趣的现象。

服务设计时,你并不一定能完整预测有哪些下层服务会被多少个上层服务组装,因此领域层通常只提供一些原子服务,比如领域服务a、b、c。但随系统功能增强和外部接入越来越多,应用服务不断丰富。终有一日,你会发现领域服务b和c同时多次被多个应用服务调用了,执行顺序也基本一致。这时你可以考虑将b和c合并,再将应用服务中b、c的功能下沉到领域层,演进为新的领域服务(b+c)。这样既减少了服务的数量,也减轻了上层服务组合和编排的复杂度。

这就是服务演进,领域模型会越来越能适应需求快速变化。

从MVC跨越到DDD

由于层间松耦合,可专注本层设计,而不必关心其它层,也不必担心自己的设计会影响其它层。即DDD成功降低层与层之间的依赖。

分层架构使得程序结构更清晰,升级和维护更容易。修改某层代码时,只要本层接口参数不变,其它层不必修改。即使本层接口发生变化,也只影响相邻的上层,修改工作量小且可控。

传统企业应用大多是单体架构,而单体架构则大多是三层架构。三层架构解决了程序内代码间调用复杂、代码职责不清的问题,但这种分层是逻辑概念,在物理上它是中心化的集中式架构,并不适合分布式微服务架构。

DDD分层要类似三层架构,只是在DDD中,这些要素被重新划分了层,确定了层与层之间的交互规则和职责边界。

DDD分层架构相比MVC(只有API)在用户接口层新增了DTO,给前端提供了更多的可使用数据和更高的展示灵活性。

DDD分层架构对三层架构的业务逻辑层进行了更清晰的划分,改善了三层架构核心业务逻辑混乱,代码改动相互影响大的情况。

MVC架构向DDD分层架构演进,主要发生在业务逻辑层和数据访问层。
DDD分层架构将业务逻辑层的服务拆分到了应用层和领域层:

  • 应用层快速响应前端的变化
  • 领域层实现领域模型的能力

数据访问层和基础层之间:

  • 三层架构数据访问采用DAO方式
  • DDD分层架构的数据库等基础资源访问,采用了仓储(Repository)设计模式,通过依赖倒置实现各层对基础资源的解耦。

仓储本身属基础层,但考虑到一个聚合对应一个仓储,为了以后聚合代码整体迁移方便,在微服务代码目录设计时,在聚合目录下增加一个Repository的仓储目录,跟仓储相关的代码都在这个目录下。
这个目录下的代码与聚合的其它业务代码是分开的。如果未来换数据库,只需将Repository目录下的代码替换。而如果聚合需要整体迁移到其它微服务中去,仓储的代码也会一并迁移。

仓储又分为两部分:仓储接口和仓储实现。仓储接口放在领域层中,仓储实现放在基础层。原来三层架构通用的第三方工具包、驱动、Common、Utility、Config等通用的公共的资源类统一放到了基础层。

MVC 到 DDD 具体操作如下:

抽象数据存储层

一般将Data Access层做抽象,降低系统对DB的直接依赖。
举个例子:

  • 新建Account实体对象:一个实体(Entity)是拥有ID的域对象,除了拥有数据之外,同时拥有行为。Entity和数据库储存格式无关。

对象储存接口类AccountRepository:Repository只负责Entity对象的存储和读取,而Repository的实现类完成数据库存储的细节。通过加入Repository接口,底层数据库连接可以通过不同的实现类而替换

参考

本文由mdnice多平台发布

标签:服务,演进,架构,MVC,聚合,领域,DDD
From: https://www.cnblogs.com/wind-xwj/p/17565301.html

相关文章

  • 一文了解DDD分层架构演进
    1.3分层架构演进1.3.1传统四层架构将领域模型和业务逻辑分离出来,并减少对基础设施、用户界面甚至应用层逻辑的依赖,因为它们不属业务逻辑。将一个夏杂的系统分为不同的层,每层都应该具有良好的内聚性,并且只依赖于比其自身更低的层。传统分层架构的基础设施层位于底层,持久化和......
  • [回馈]ASP.NET Core MVC开发实战之商城系统(开篇)
    在编程方面,从来都是实践出真知,书读百遍其义自见,所以实战是最好的提升自己编程能力的方式。前一段时间,写了一些实战系列文章,如:ASP.NETMVC开发学生信息管理系统Vue+Antdv+Asp.netWebApi开发学生信息管理系统WPF+Prism+MAH+Asp.netWebApi开发学生信息管理系统ASP.NETCore......
  • springMvc——拦截器
    拦截器概念:拦截器是一种动态的拦截方法调用的机制,在springMvc中动态拦截控制器方法的执行作用:  1.在指定的方法调用前后执行预先设定的代码  2.阻止原始方法的执行拦截器于过滤器的区别:......
  • SSM - SpringMVC - Syntax
    1.环境搭建导入包:junit,servlet-api,jsp-api,jstl,spring-context(5.3.29)早期版本回顾@ https://docs.spring.io/spring-framework/docs/4.3.24.RELEASE/spring-framework-reference/ ,里面介绍了很多基本和基础概念所有版本下载@ https://repo.spring.io/release/......
  • 在不改变语言的前提下如何推进Java的不断演进
    JamesGosling在“TheFeelofJava”中说到:Java是一种蓝领语言,它并非博士的论文素材而是用于完成工作的语言。各式各样的程序员都非常熟悉Java,因为在设计Java之初我就坚持这样一种观点:选择久经考验的东西而非仅仅是听起来很美。Java所获得的巨大成功证明了这种设计方式是正确的,......
  • MySQL(二十一)MVCC多版本并发控制
    MySQL(二十一)MVCC多版本并发控制1什么是MVCCMVCC(MultiversionConcurrencyControl)多版本并发控制。即通过数据行的多个版本管理来实现数据库的并发控制,使得在InnoDB事务隔离级别下执行一致性读操作有了保障。就是为了查询一些正在被其他事务更新的值的时候,能够查到它们被更......
  • DDD邻域驱动设计的基础理解
    ddd认为在application到infra层应该加一层domain业务逻辑因该分为两大类,核心业务相似的,固定不变的应该放在domain这一层application用来接入不同的应用场合会产生的不同业务逻辑比如用户从网络端接入和从手机端接入,可能不同比如用户登录网站和店家登录网站,逻辑也不同applicat......
  • SpringMVC文件上传
    相关依赖使用SpringMVC提供的文件上传需要在项目中加入两个jar包,对应的maven的依赖分别是:commons-io和commons-fileupload<dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.4</version></dep......
  • 超详细整合SSM框架--(Spring + Spring MVC + MyBatis)
    超详细整合SSM框架--(Spring+SpringMVC+MyBatis)阅读该文章之前首先要清楚Spring框架,SpringMVC框架,Mybatis框架。SSM框架,是Spring+SpringMVC+MyBatis的缩写,这个是继SSH之后,目前比较主流的JavaEE企业级框架,适用于搭建各种大型的企业级应用系统。SpringMVC框架:MVC简......
  • Spring+SpringMVC+Thymeleaf 示例
    目录参考资料开发工具1环境准备2使用maven模板构建war工程2.1File->New->Other2.2选择【MavenProject】2.3选择maven模板2.4输入GroupId、ArtifactId、package2.5生成的项目工程2.6配置项目2.7完整工程目录3配置SpringMVC3.1引入Springjar3.2配置......