设计面向领域驱动(DDD)的微服务

DDD领域驱动(一)——之引入 随着近几年的微服务的兴起,随着15年阿里中台的提出,其火热程度大家都可以看到。无论公司大小大家都在做中台,都在搭建微服务。但是怎么能够做一个好的中台,怎么能够拆分一个大小合理的微服务呢? 好,我们先看一下面向对象的基础(具体含义这里不展开): 三大基本特征:封装、继承、多态; 六大原则:单一职责原则(SingleResp... 阅读详情

Domian-driven Design

领域-驱动-设计(DDD)提倡基于(用例相关的现实业务)进行建模。

1. DDD的视角

DDD将现实问题视为领域;DDD将独立的问题描述为有界限的上下文(一个有界上下文对应一个微服务),并强调通用语言讨论这些问题2. DDD提出的概念

许多技术概念和模式,例如充血模型(对应我们常写贫血模型)、值对象、聚合和聚合根规则。

3. 目前实施DDD的现状

有时DDD技术规则和模式被视为障碍/啰嗦,对于实施DDD方法而言,学习曲线比较陡峭。不要为了实施而实施,最重要的是使用通用语言编写与业务问题一致的领域代码。

此外仅当您要实现具有复杂业务规则的微服务时,才应使用DDD方法,诸如CRUD服务之类的简单职责可以通过更简单的方法进行管理。

DDD模式可以协助划分微服务边界。

在已经确定的界限上下文,您可以为领域建模:实体模型、值对象和聚合,DDD与边界有关,微服务也与边界有关。

尽量保持小型微服务

划分界限上下文,要平衡两个目标:

创建尽可能小的微服务(这一点不应该成为主要动力)要避免微服务之间过密的通信这两个目标可能彼此矛盾,两者通过演进的方式达到平衡:尽可能分解系统,直到在下次分解时感到服务通信迅速增加。

DDD微服务中的层

DDD定义的多层是为了管控代码的复杂性, 这些层是逻辑组件(类似环环相扣的齿轮)。不同的层(例如领域模型层与表示层等)可能具有不同的类型,此时层加类型需要转换。例如从数据库中加载的实体,有时候需要做一下修正(截取部分信息、增加信息)才能适配客户端UI。

领域模型层中的领域实体不应传播到它不属于的其他区域(如表示层)重要的是有一个由聚合根控制的域模型,以确保与该实体组(聚合)相关的所有不变式和规则都是通过单个入口点或(聚合根)执行。

订单DDD微服务有三层:

应用程序层 Ordering.API领域层 Ordering.Domain基础设施层 Ordering.Infrastructure三层形成的类库有清晰且明确的依赖关系

1. The domain model layer

负责表达业务概念、业务场景和业务规则。这一层会将技术细节传递到基础设施层,这一层控制、反映业务场景,是业务软件的核心。

领域模型层是表达业务的地方,在编程上体现为捕获数据和行为(具有逻辑方法)的领域实体的类库遵循持久性无感知和基础设施无感知原则领域模型层必须完全忽略数据持久性细节,这些持久性任务应由基础设施层执行,因此,此层不应直接依赖基础设施,这意味着一个重要规则是领域模型实体类应为POCO。领域实体不应直接依赖于任何数据访问基础框架(EF、NHibernate),理想情况下,您的域实体不应继承自或实现任何基础设施中定义的任何类型。 大多数现代的ORM框架(例如Entity Framework Core)都支持这种方法,因此您的领域模型不会与基础设施耦合。

领域模型中遵循持久性无感知原则很重要,但也不应忽略持久性问题理解物理数据模型以及它如何映射到您的实体对象模型仍然非常重要,否则你的设计将会是空中楼阁。而且,大多数时候你将本应该采用关系数据库的设计直接迁移到 NoSQL或面向文档的数据库,领域模型层很可能不适用(基于存储技术和ORM技术,您的实体模型仍然必须遵守一些约束条件)。

2.Application Layer

定义软件要执行的工作,并引导(可表达的领域对象)解决问题。该层对对业务负责,有时会与其他系统的应用程序层交互。该层保持薄: 它不包含业务规则或知识,而仅协调任务并将工作委托给下一层的域对象协作;

它没有反映业务情况的状态,但是可以具有反映用户或程序的任务进度的状态。

微服务的应用层在.NET中一般表现为WebAPI,webapi实现交互、远程网络连接、为UI/Client app提供的外部请求中转。再次强调webapi不应该包含业务规则或领域知识(尤其是用于事务或更新的领域规则),这些应归领域模型类库所有。应用层只能协调任务,不能保存或定义任何域状态(域模型),它将业务规则的执行委托给领域模型类本身(聚合根和域实体),这将最终更新这些域实体中的数据。

总体来看,应用层是为实现前端用例的地方。

3. The infrastructure layer

基础设施层: 定义如何将最初保存在领域实体中的数据持久化到数据库或者其他存储结构的过程。

一个示例是使用Entity Framework Core代码实现存储库模式类: 该存储库模式类使用DBContext将数据持久存储在关系数据库中。

根据前面提到的持久化无感知和基础设施无感知原则,基础设施层不得“污染”领域模型层。

再次强调:必须保持领域层实体对基础设施层框架的无感知状态, 领域模型层类库应该只包含领域代码,而只有POCO实体类可以实现软件的核心,并且与基础设施技术完全脱钩。

总结

在DDD中,应用层依赖于领域和基础设施层,而基础设施依赖于领域层,但是领域层不依赖于任何层。只在领域层编写业务规则和通用的领域知识,而应用层负责针对软件的目标来组合、协调领域层的业务规则。领域层的领域实体、值类型、聚合根反映了真实业务的核心,需要用一种通用的语言来定义,这样不管应用层多么复杂,核心领域层自岿然不动。领域层不能直接依赖与基础设施层,现代ORM框架一般都提出仓储模型来帮助领域层和技术设施层解耦。

DDD系列 - 第5讲 从架构师的角度看待DDD - 一个关于拆解、微服务、面向对象的故事(三) 通过这个故事,我想要传达的就是不要为了DDD而DDD,尤其对于初学者不要上来就去学习DDD中的各种迷惑性的概念和术语,本文通过拆解、微服务、面向对象的视角向读者介绍了一个系统是如何一步步走向DDD的,只有建立在理解的基础上,充分理解了各种模式的使用场景及动机,才能真正发挥各种模式的优势,放下DDD也许你才能真正体会到DDD。我们做的设计最终都是要指导落地的,搞那么多迷惑性的概念和拆解除了能让PPT上多一些谈资,似乎给指导落地并不能带来任何实质性的帮助。 阅读详情

相关推荐

mac安全干净卸载Anaconda3

主要原因是python命令没有映射到已经安装的python版本上,则需要添加。修改~/.bash_profile文件,将anaconda相关删除。现在想卸载Anaconda,恢复使用mac系统自带的Python。最后在mac的应用目录删除Anaconda。查看所有版本的python所在安装目录。或者不使用软连接映射,也可使用。再次查看python映射。查看python版本。建立软连接,添加映射。

buyue 5964

ddd模型的pom版本怎么管理_[半翻]定义面向DDD的微服务

这篇文章行文结构对照微软博客, 结合本人意译和多年实践的回顾思考形成此次读书笔记。Domian-driven Design领域-驱动-设计(DDD)提倡基于(用例相关的现实业务)进行建模。 1. DDD的视角DDD将现实问题视为领域;DDD将独立的问题描述为有界限的上下文(一个有界上下文对应一个微服务),并强调通用语言讨论这些问题2. DDD提出的概念许多技术概念和模式,例如充血模型(对应我们常写...

weixin_39682940的博客 220

SAP ABAP干货:用REUSE_ALV_GRID_DISPLAY_LVC实现ALV多屏幕独立布局(含handle参数详解)

本文详细解析了SAP ABAP中如何使用REUSE_ALV_GRID_DISPLAY_LVC函数实现ALV多屏幕独立布局,重点介绍了handle参数的技术原理和实际应用。通过变式标识符和LTDX表存储机制,开发者可以确保不同ALV报表屏幕的布局设置互不干扰,提升复杂报表场景下的用户体验。

weixin_29268267的博客 311

maven介绍及IDEA中引入Oracle jdbc 驱动

Maven是基于项目对象模型的概念运作,所以Maven都有一个pom.xml用来管理项目的依赖以及项目的编译等功能。 在我们的项目中,我们主要关注下面的元素。 dependencies元素 <dependencies></dependencies>,此元素包含多个项目依赖需要使用的<dependency></dependency> depend...

zzu_shuainanhai的博客 1876

PowerBI启动故障排查:环境变量与兼容性设置全指南

本文详细解析了PowerBI启动故障的常见问题,如空白界面和闪退,并提供了环境变量修改与兼容性设置的全方位解决方案。通过调整WEBVIEW2_ADDITIONAL_BROWSER_ARGUMENTS环境变量和设置兼容模式,有效解决PowerBI启动问题,提升软件运行稳定性。

weixin_29255731的博客 471

《点亮创新灯塔!AI应用架构师与中小学初等教育AI智能体,共筑智能化教育辅助创新灯塔》

中小学AI智能体,是基于AI技术,能感知教育场景、理解教育规律、辅助教师教学和学生学习的智能系统。做老师“做不了”的事:比如5分钟批改45本作业,精准统计每个学生的易错点;做老师“做不好”的事:比如根据学生的学习风格(视觉/听觉/动觉)推荐个性化内容;绝不做老师“该做的事”:比如情感交流、价值观引导、创意教学设计——这些“人的温度”,AI永远无法替代。我是林宇,资深AI应用架构师,专注教育AI领域8年,参与过10多个中小学AI智能体项目,曾为北京、上海、深圳等城市的100多所学校提供AI教育解决方案。

Java大师兄的博客 433

DDD领域驱动设计实战-服务和数据在微服务各层协作的最佳实践

1 服务协作 1.1 服务的类型 按照分层架构设计出来的微服务,其内部各层服务主要功能和职责如下: Facade服务 位于用户接口层,包括接口和实现两部分。用于处理用户发送的Restful请求和解析用户输入的配置文件等,并将数据传递给应用层。或者在获取到应用层数据后,将DO组装成DTO,将数据传输到前端应用。 应用服务 位于应用层。用来表述应用和用户行为,负责服务的组合、编排和转发,负责处理业务用例的执行顺序以及结果拼装,对外提供粗粒度的服务。 领域服务 位于领域层。领域服务封装核心的业务逻辑,实现需要多个

JavaEdge全是干货的技术号 3398

ollama如何在自己的服务器上跑Qwen3(小白必看)

在国内下载ollama最新安装包时,使用curl -fsSL https://ollama.com/install.sh | sh命令可能会遇到网络问题导致下载进度停滞。为了解决这一问题,可以通过国内的镜像源进行下载,例如使用modelscope社区提供的最新ollama镜像仓库。具体步骤包括:首先通过pip install modelscope安装modelscope,然后使用modelscope download命令下载ollama-linux镜像,接着进入下载目录并赋予安装脚本执行权限,最后运行安装脚

Ven%的博客 757

《系统架构设计》-07-面向领域的技术设计

1 实体与值对象 1.1 实体对象 1.2 值对象 2. 领域服务 2.1 概念 2.2 示例(提取领域服务) 3. 领域事件 3.1 概述 3.2 领域事件生命周期 3.3 领域事件建模 4 聚合(Aggregate) 4.1 聚合 4.2 聚合建模 5. 资源库(Repository) 6 集成界限上下文 6.1 4种主流的集成模式 6.2 上下文集成实现 7. 应用程序 7.1 用户界面 7.2 应用服务 8 案例技术设计 8.1 上下文领域模型 8.2 上下文集成

架构+开发+运维 835

ARM CoreLink 系列 5.1.1 -- CI-700 System Address Map 】

所有的CHI 命令都包含一个 Source ID 和 Target ID, 其中 Source ID 可以来自于 RN Node, Target ID 可以来自于HN node或者其他 SN node. 其中 Target ID 是通过 SAM解析传入的地址得到的。对于 CI-700中的所有 RN Node 中的 SAM 多会进行配置,因为RN Node 访问的是整个地址空间,不同的地址空间会有不同的属性(I/O, DRAM),所以会对RN SAM 配置多个不同属性的区域。

CodingCos的博客 771

2.4 提示词优化

我们在使用大模型的时候,同一任务使用不同表述的提示词,可能得到差异巨大的结果,因为模型的性能高度依赖输入提示词的质量。我们可以通过提示词优化来更高效地获取理想输出。

从0到1,突破自己 1010

一文读懂:领域驱动设计DDD

很多人在接触微服务后,但凡是系统,一概都想设计成微服务架构。其实有些业务场景,单体架构的开发成本会更低,开发效率更高,采用单体架构也不失为好的选择。同样,虽然DDD很好,但有些传统设计方法在微服务设计时依然有它的用武之地。下面我们就来聊聊DDD使用的几个误区。很多人在学会DDD后,可能会将其用在所有业务域,即全部使用DDD来设计。DDD从战略设计到战术设计,是一个相对复杂的过程,首先企业内要培养DDD的文化,其次对团队成员的设计和技术能力要求相对比较高。

周沐子 5746

利用dddd_trainer训练通用验证码识别模型

博文介绍了使用dddd_trainer工具训练自定义验证码识别模型的过程,详细展示了从环境搭建、数据集准备到模型训练的全流程。

九月镇灵将的博客 1033

DDD领域驱动设计和微服务

DDD(Domain Driver Desig)领域驱动设计 解决微服务遗留的问题,微服务是把服务模块化,DDD是更细粒度的拆分,以领域进行拆分,隔离性,减少依赖,甚至可以一个领域单独拿出来作为一个微服务

ganyongest的博客 790

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

DDD领域驱动设计

DDD 领域驱动设计思想 首先DDD是一种编程思想 编程思想的变化 pop–面向过程编程,是一种线性思维,相对简单,复杂的业务会导致代码冗余,实现复杂 oop–面想对象编程,封装继承多态,相对可以应对复杂情况,减少代码的冗余; aop–面向切面编程,解决面对对象的静态问题,能突破类的限制,动态拓展类的功能;任意拓展功能,代码的复用; oop的静态问题 对象生成分为2种: 编译时确定 运行时确定 对象即为一个整体,可以修改属性值等,但是其本身是稳定不变的; 其对象的功能可

qq_32193775的博客 611

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

当今微服务盛行之架构师必经之路-领域驱动设计-上

Python微信订餐小程序课程视频 https://edu.youkuaiyun.com/course/detail/36074 Python实战量化交易理财系统 https://edu.youkuaiyun.com/course/detail/35475 DDD基础 引言 <<领域驱动设计-软件核心复杂性应对之道>>:全书围绕着设计和开发实践,结合若干真实的项目案例,向读者阐述如何在真实的软件开发中应用领域驱动设计。书中给出了领域驱动设计的系统化方法,并将人们普遍接受的一些最佳实践综合到一起,融入了作者

虚幻私塾 535

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

微服务设计选择DDD的理由

微服务目前的理论只有技术方面的指导,没有微服务划分方面的指导,而DDD正是提供了怎么划分微服务,建立领域模型的方法论。 DDD的实现的一种方式是面向对象的方式,这是以业务为中心的代码实现,可以和业务模型划分的微服务高度契合。 DDD划分的微服务符合业务核心,并且业务核心知识高度内聚在聚合中,并且在后面业务知识演进的时候,可以更好的适应业务。 ...

weixin_38730034的博客 183

架构设计内容分享(九十三):业务分析-面向服务分析

领域模型(domain model)是对领域内的概念类或现实世界中对象的可视化表示。领域模型也成为概念模型、领域对象模型和分析对象模型。领域模型是一种概念模型,也叫问题域模型。它表述的是某个领域的现实概念。经常有人把物理数据模型(比如数据库的ER模型)和领域模型混为一谈,其实这是一个误区。物理数据模型在本质上归属于结果域模型(Solution Space Model),是对某个问题域的解决方案的一个具体描述。

之乎者也·的博客 1228

我们团队是如何落地DDD的(1)

最近发现文章老是被窃取,有些平台举报了还没有用。请识别我的id方丈的寺院。 摘要 DDD领域驱动设计,起源于2004年著名建模专家Eric Evans发表的他最具影响力的著名书籍:Domain-Driven Design –Tackling Complexity in the Heart of...

chengqujin8086的博客 226

【面向对象】领域驱动(四):总结及注意事项

聚合根利用仓储管理聚合内实体数据之间的一致性,这种方法对于管理新建和修改数据非常有效,比如在修改订单数据时,它可以保证订单总金额与所有商品明细金额的一致,但它并不擅长较大数据量的查询处理,甚至有延迟加载进而影响效率的问题。战略设计时构建的领域模型,是微服务设计和开发的输入,它确定了微服务的边界、聚合、代码对象以及服务等关键领域对象。因此,在遵守领域边界和微服务分层等大原则下,在进行战术层面设计时,我们应该选择最适合的方法,不只是 DDD 设计方法,当然还应该包括传统的设计方法。

A minor 329

可落地的DDD(1)-目标讨论

DDD领域驱动设计,起源于2004年著名建模专家Eric Evans发表的他最具影响力的著名书籍:Domain-Driven Design –Tackling Complexity in the Heart of Software(中文译名:领域驱动设计,之后进行了很多迭代和演化,不过大多没有脱离这本书讨论的范围。因为Eric Evans在该书中只是提供了一套原始理论,并没有提供一套方法论,更别说可落地。所以十几年,对于DDD争论不休,毁誉参半,喜欢的人觉得他解决了软件设计的复杂性,不喜欢的人觉得他使得代码

wanghao112956的博客 452

1|DDD小传:领域驱动设计为什么这么火?

你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:撤销:Ctrl/Command + Z 重做:Ctrl/Command + Y 加粗:Ctrl/Command + B 斜体:Ctrl/Command + I 标题:Ctrl/Command + S

luoyuan的博客 125

DDD领域驱动设计-DDD概览

# DDD概览## 启迪领域可以理解为业务,领域专家就是对业务很了解的人。限界上下文也就是微服务的边界,也可以理解为微服务,一个限界上下文=一个微服务。个人理解领域驱动设计就是微服务驱动设计,从战略上先进行微服务的划分,从战术上针对某个微服务进行领域模型的设计也就是业务模型的设计。领域模型包括:- 实体- 值对象- 聚合- 领域服务- 领域事件- 资源库- 应用服务## 什么是领域驱动设计?理解领域驱动设计是什么之前,我们先来理解下什么是领域?领域可以理解为业务,领域专家就是对业务很了解的人。领域驱动设计的

杨礼凯的专栏 273

编程的逻辑-用面向对象方法实现复杂业务需求

虽然不少同学一直在使用面向对象的语言进行项目开发,但是在分析、设计和编码过程中不一定用是真正的OOA/OOD/OOP的思想,贫血模型由于快速高效易上手,使用的项目不在少数,...

super_scan的专栏 1355

领域驱动设计系列笔记|入门概念

DDD这个概念相信大家也不陌生,现在网络上到处都是,已经被吹到无所不能,特别是前些年微服务流行之后。本人在18年开始也断断续续也看了不少DDD相关书籍和教程,整理了一些笔记,之前也有用过DDD的思想去进行领域建模和微服务拆分,接下来将会拆分多个章节对DDD常见知识笔记做一些梳理。 1. 什么是DDD? 领域驱动设计 是一种基于使您的软件深刻地反映现实世界的系统或过程。该名称来自 Eric Evans 2003 年的一本书,该书通过模式目录描述了该方法。 简单来说领域是指项目正在开发的特定主题。 2.D.

Eshare分享 1040
上一篇: Redis和Zookeeper分布式锁对比
下一篇: 微服务架构对比
西游却冻醒
博客等级 码龄11年 47粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值