您当前的位置:首页 > 电脑百科 > 程序开发 > 架构

DDD之MEES架构设计方法

时间:2022-04-19 09:59:41  来源:  作者:众星十一
DDD之MEES架构设计方法

 

DDD在项目中能落地吗?在CQRS和Event Sourcing之外还有什么设计方法?InMemory和 InDatabase架构风格是什么?

InMemory架构风格

DDD领域驱动开发是一种In Memory架构风格,Memory架构风格的意思就是以计算机“内存”作为主要资源进行软件设计的方式,与之对应的就是Database数据库架构风格,典型的是以ER图(实体关系图)作为主要设计方式的设计方法。

架构风格

特点

Memory架构风格

以面向对象设计为基础,针对业务对象、数据实体或业务行为等进行业务建模,主要采用设计模式、DDD等设计方法

Database架构风格

以数据关系设计为基础,针对业务过程中的数据结构和表关系等进行数据建模,主要采用ER图、关系数据库表等设计方法

DDD中的CQRS和Event Sourcing就是两种Memory架构风格的设计方法。

贫血模型VS富血模型

Memory架构设计风格中,最典型的冲突点就是贫血模型与富血模型,

模型

描述

贫血模型

强调符合JAVABean规范,Java数据对象符合JavaBean规范,业务行为放到Service类中实现,导致模型类只包含setter/getter无业务行为

富血模型

强调面向对象设计方法,拿人作为类比,人是具有属性和行为的复合体,所以模型类应该既包含数据又包含业务行为

绝大多数的项目采用的都是“贫血模型”,在这个争论点提出来后,我们也怀疑过贫血模型是否是个问题,但是在项目实践中将数据与行为同时放到一个对象(类)中,会导致非常难于维护的代码和坏味道。甚至为了解决这个冲突点出现过动态Mix类属性和行为的方法,不过难以使用。

在经过长期实践后发现贫血或富血并不是一个问题,而是随着软件业务的复杂性提升和计算机硬件的成本降低,架构设计的长期趋势已经从数据库为中心转换为以内存业务模型为中心的设计。

MEES架构设计方法

MEES: Model Enhance Event Service。模型增强事件服务架构。

MEES是一种类似CQRS和EventSourcing并且基于InMemory架构风格的架构模式,该架构模式的设计视图如下。

DDD之MEES架构设计方法

 

MEES架构设计过程:

  1. 基于业务中抽象领域模型,定义为Model模型
  2. 每个Model模型对应单独ModelDecorator,装饰器类承载模型对象的业务逻辑行为
  3. 领域Gateway通过Model模型调用Decorator进行业务处理
  4. Event事件处理后通过发布订阅Pub/Sub方式通知相关Model模型进行状态State更新
  5. 通过Service实现技术功能逻辑,实现业务逻辑和技术逻辑的简单解耦,比如Service可以调用Database实现数据的持久化管理

基于DSL的MEES设计过程

MEES设计方法特别适用于使用DSL领域特定语言的开发场景,Dockerfile可以认为是一种DSL,下面用Dockerfile举例MEES架构设计过程。

任何业务如果可以使用一种DSL语言描述,都适用于此架构设计方法。

DSL业务定义语言

FROM centos
ENV NODE_VERSION 7.2.0
RUN yum -y install wget
RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
RUN tar -xvf redis.tar.gz
RUN echo 'hello world'

模型Model设计

模型

职责

领域Gateway

Dockerfile

领域聚合根,命令执行入口

实体模型

From

模型定义

实体模型

Run

模型定义

实体模型

Env

定义

增强模型Decorator设计

装饰器

主要业务行为

From

FromDecorator

获取中央仓库镜像

Run

RunDecorator

执行参数本地命令

Env

EnvDecorator

设置全局参数

事件Event设计

依据Dockerfile的业务执行过程,排除模型Build过程外,可以抽象如下几个事件用于触发模型运行。

事件

业务行为

RunEvent

模拟docker命令运行dockerfile

StateEvent

获取容器运行状态

服务Service设计

服务

技术行为

命令服务

ShellService

用于执行OS命令

仓库服务

RepoService

用于HTTP加载远程镜像

消息服务

MsgService

用于消息的发布订阅Pub/Sub

架构设计视图View

基于以上的设计过程,MEES开发架构定义如下

DDD之MEES架构设计方法

 

示例代码

MEES架构设计产生的代码样例如下,通过Builder模式加载DSL实例后,首先通过将Event传递给领域Gateway触发模型运行,然后Model模型通过注册表Registry查询对应Decorator,再次通过Decorator实现业务层面逻辑,最后调用Service实现技术功能层面逻辑。

var docker = DockerfileBuilder.builder(file).build(){
   from:Model
   env:List<Model>
   run:List<Model>
   registry:List<ModelDecorator>
   
   init(){
       from.subscribe(DownloadedMessage){
           for(r: run){
              var deco = registry.findDeco(r)
              deco.execute(this){
                 shellService.execute(cmd)
              }
           }
       }
   }
}
docker.handle(e:StateEvent){
   return this.run
}
docker.handle(e:RunEvent){
   var deco = registry.findDeco(this.from)
   deco.download(){
      repoService.download(from)
      if(downloaded){
         message.publish(DownloadedMessage())
      }
   }
}

总结

DDD方案

技术方案特点

MEES

基于结构模式,基于Model定义Decorator增强模型方案

CQRS

基于行为模式,一般采用管道过滤器技术架构

EventSourcing

基于数据模式,一般是定义事件数据链结构


DDD之MEES架构设计方法

 

原文出处:
https://juejin.cn/post/7082374006073983007



Tags:MEES架构   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
DDD之MEES架构设计方法
DDD在项目中能落地吗?在CQRS和Event Sourcing之外还有什么设计方法?InMemory和 InDatabase架构风格是什么?InMemory架构风格DDD领域驱动开发是一种In Memory架构风格,Memory架...【详细内容】
2022-04-19  Search: MEES架构  点击:(431)  评论:(0)  加入收藏
▌简易百科推荐
对于微服务架构监控应该遵守的原则
随着软件交付方式的变革,微服务架构的兴起使得软件开发变得更加快速和灵活。在这种情况下,监控系统成为了微服务控制系统的核心组成部分。随着软件的复杂性不断增加,了解系统的...【详细内容】
2024-04-03  步步运维步步坑    Tags:架构   点击:(7)  评论:(0)  加入收藏
大模型应用的 10 种架构模式
作者 | 曹洪伟在塑造新领域的过程中,我们往往依赖于一些经过实践验证的策略、方法和模式。这种观念对于软件工程领域的专业人士来说,已经司空见惯,设计模式已成为程序员们的重...【详细内容】
2024-03-27    InfoQ  Tags:架构模式   点击:(17)  评论:(0)  加入收藏
哈啰云原生架构落地实践
一、弹性伸缩技术实践1.全网容器化后一线研发的使用问题全网容器化后一线研发会面临一系列使用问题,包括时机、容量、效率和成本问题,弹性伸缩是云原生容器化后的必然技术选择...【详细内容】
2024-03-27  哈啰技术  微信公众号  Tags:架构   点击:(13)  评论:(0)  加入收藏
DDD 与 CQRS 才是黄金组合
在日常工作中,你是否也遇到过下面几种情况: 使用一个已有接口进行业务开发,上线后出现严重的性能问题,被老板当众质疑:“你为什么不使用缓存接口,这个接口全部走数据库,这怎么能扛...【详细内容】
2024-03-27  dbaplus社群    Tags:DDD   点击:(15)  评论:(0)  加入收藏
高并发架构设计(三大利器:缓存、限流和降级)
软件系统有三个追求:高性能、高并发、高可用,俗称三高。本篇讨论高并发,从高并发是什么到高并发应对的策略、缓存、限流、降级等。引言1.高并发背景互联网行业迅速发展,用户量剧...【详细内容】
2024-03-13    阿里云开发者  Tags:高并发   点击:(9)  评论:(0)  加入收藏
如何判断架构设计的优劣?
架构设计的基本准则是非常重要的,它们指导着我们如何构建可靠、可维护、可测试的系统。下面是这些准则的转换表达方式:简单即美(KISS):KISS原则的核心思想是保持简单。在设计系统...【详细内容】
2024-02-20  二进制跳动  微信公众号  Tags:架构设计   点击:(40)  评论:(0)  加入收藏
详解基于SpringBoot的WebSocket应用开发
在现代Web应用中,实时交互和数据推送的需求日益增长。WebSocket协议作为一种全双工通信协议,允许服务端与客户端之间建立持久性的连接,实现实时、双向的数据传输,极大地提升了用...【详细内容】
2024-01-30  ijunfu  今日头条  Tags:SpringBoot   点击:(23)  评论:(0)  加入收藏
PHP+Go 开发仿简书,实战高并发高可用微服务架构
来百度APP畅享高清图片//下栽のke:chaoxingit.com/2105/PHP和Go语言结合,可以开发出高效且稳定的仿简书应用。在实现高并发和高可用微服务架构时,我们可以采用一些关键技术。首...【详细内容】
2024-01-14  547蓝色星球    Tags:架构   点击:(123)  评论:(0)  加入收藏
GraalVM与Spring Boot 3.0:加速应用性能的完美融合
在2023年,SpringBoot3.0的发布标志着Spring框架对GraalVM的全面支持,这一支持是对Spring技术栈的重要补充。GraalVM是一个高性能的多语言虚拟机,它提供了Ahead-of-Time(AOT)编...【详细内容】
2024-01-11    王建立  Tags:Spring Boot   点击:(132)  评论:(0)  加入收藏
Spring Boot虚拟线程的性能还不如Webflux?
早上看到一篇关于Spring Boot虚拟线程和Webflux性能对比的文章,觉得还不错。内容较长,抓重点给大家介绍一下这篇文章的核心内容,方便大家快速阅读。测试场景作者采用了一个尽可...【详细内容】
2024-01-10  互联网架构小马哥    Tags:Spring Boot   点击:(130)  评论:(0)  加入收藏
相关文章
    无相关信息
站内最新
站内热门
站内头条