首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >[半翻] 设计面向DDD的微服务

[半翻] 设计面向DDD的微服务

作者头像
有态度的马甲
发布于 2020-05-04 06:18:14
发布于 2020-05-04 06:18:14
7390
举报
文章被收录于专栏:精益码农精益码农

这篇文章行文结构对照微软博客, 结合本人意译和多年实践的回顾性思考形成此次读书笔记。

Domian-driven Design

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

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

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

3. 目前实施DDD的现状

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

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

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

尽量保持小型微服务

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

  1. 创建尽可能小的微服务(这一点不应该成为主要动力)
  2. 要避免微服务之间过密的通信

这两个目标可能彼此矛盾,两者通过演进的方式达到平衡: 尽可能分解系统,直到在下次分解时感到服务通信迅速增加。

DDD微服务中的层

  1. DDD定义的多层是为了管控代码的复杂性, 这些层是逻辑组件(类似环环相扣的齿轮)。
  2. 不同的层(例如领域模型层与表示层等)可能具有不同的类型,此时层间类型需要转换。

例如从数据库中加载的实体,有时候需要做一下修正(截取部分信息、增加信息)才能适配客户端UI

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

订单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将数据持久存储在关系数据库中。

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

总结

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

意译自:https://docs.microsoft.com/en-us/dotnet/architecture/microservices/microservice-ddd-cqrs-patterns/ddd-oriented-microservice

  • https://en.wikipedia.org/wiki/Plain_Old_CLR_Object
  • https://domainlanguage.com/ddd/
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-04-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 精益码农 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
hutool官网(hutool好用吗)
看本篇文章前,建议先对java源码的日期和时间有一定的了解,如果不了解的话,可以先看这篇文章:
全栈程序员站长
2022/07/28
18.6K0
hutool官网(hutool好用吗)
Hutool工具包-常用开发工具类(让代码更简洁)
Java微观世界
2025/01/20
6450
Hutool工具包-常用开发工具类(让代码更简洁)
带你认识Hutool工具包
Hutool 是一个小而全的 Java 工具类库,通过静态方法封装,降低相关 API 的学习成本,提高工作效率,使 Java 拥有函数式语言般的优雅,让 Java 语言也可以 “甜甜的”。
程序员Leo
2023/08/07
1K0
带你认识Hutool工具包
4hutool实战:DateUtil-格式化时间[通俗易懂]
java的SimpleDateFormat线程不安全出问题了,虚竹教你多种解决方案(万字长文*建议收藏)
全栈程序员站长
2022/07/01
4.3K0
一文带你入坑JDK8的新日期时间类 LocalDate、LocalTime、LocalDateTime
参考 https://blog.csdn.net/duan196_118/article/details/111597682 https://blog.csdn.net/qq_24754061/article/details/95500209 https://xijia.blog.csdn.net/article/details/106007147
时间静止不是简史
2023/02/23
5.2K0
一文带你入坑JDK8的新日期时间类 LocalDate、LocalTime、LocalDateTime
LocalDateTime、Date时间工具类
参考:Date、LocalTime、LocalDate、LocalDate-时间操作工具类_Hatsune_Miku_的博客-CSDN博客
CBeann
2023/12/25
3760
java最全最常用的日期工具类(随时补充)
@Slf4j public final class DateUtils { private DateUtils() { } private static final String FORMAT_YYYYMMDDHHMMSS = "yyyy-MM-dd HH:mm:ss"; public static final String FORMAT_YYYY_MM_DD = "yyyy-MM-dd"; public static final String FORMAT_
疯狂的KK
2023/04/10
1.3K0
日期工具类-操作字符串和Date、LocalDate互转,两个日期的时间差等
避免重复造轮子,相关方法基于hutool日期时间工具封装并做部分增强。需要先引入如下坐标
共饮一杯无
2022/11/28
1.4K0
【最爽的日期工具包LocalDate·超爽,超实用】(Java8版本)
需要的包: import java.time.DayOfWeek; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit; import java.time.temporal.TemporalAccessor; import j
红目香薰
2022/11/28
7250
JDK8中新的日期时间工具类真的很好用,还不清楚的快进来看看吧,建议收藏
  最近刚好有空给大家整理下JDK8的特性,这个在实际开发中的作用也是越来越重了,本文重点讲解下新的日期时间API。
用户4919348
2021/06/11
1.7K0
Scrapy笔记三 自动多网页爬取-本wordpress博客所有文章
学习自http://blog.csdn.net/u012150179/article/details/34486677
十四君
2019/11/27
8620
有了它,Java语法也可以变得甜甜的
Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以“甜甜的”。
wangweijun
2020/02/14
1.2K0
APP热搜榜接口提供 --- 百度
目的地-Destination
2024/08/07
2991
APP热搜榜接口提供 --- 百度
JDK8时间工具类
JDK8添加了java.time包,提供了很多方便。 用得比较多的几个类: Instant 在时间线上模拟单个瞬时点 Duration 以秒和纳秒为单位模拟一个数量或时间量。可以使用其他基于持续时间的单位访问它,例如分钟和小时 LocalDate 表示ISO-8601日历系统中没有时区的日期,例如 2019-03-31 LocalTime 表示ISO-8601日历系统中没有时区的时间,例如 16:50:30 LocalDateTime 表示ISO-8601日历系统中没有时区的日期时间,例如 2019-03-31T10:15:30 其中一些方法使用如下:
GreizLiao
2019/09/29
9470
【Java 基础篇】Java Date 类详解:日期和时间操作的利器
在 Java 编程中,处理日期和时间是一项常见但复杂的任务。Java 提供了许多用于日期和时间操作的类,其中 java.util.Date 类是最早的日期和时间类之一。然而,它存在一些问题,因此 Java 8 引入了 java.time 包,其中包含了 java.time.LocalDate、java.time.LocalTime 和 java.time.LocalDateTime 等新的日期时间类。这些新类提供了更多的功能和更好的可读性,使日期和时间处理变得更加方便。本篇博客将详细介绍 Java 中的 java.time 包,重点关注 LocalDate、LocalTime 和 LocalDateTime 类的使用。
繁依Fanyi
2023/10/12
1.5K0
【Java 基础篇】Java Date 类详解:日期和时间操作的利器
手机移动端日期时间控件lcalenda
http://618cj.com/2017/01/16/%E6%89%8B%E6%9C%BA%E7%A7%BB%E5%8A%A8%E7%AB%AF%E6%97%A5%E6%9C%9F%E6%97%B6%E9%97%B4%E6%8E%A7%E4%BB%B6lcalenda/
全栈程序员站长
2022/08/31
2K0
对接声网rtc-restful-api
阿超
2023/11/18
2430
求求你了,不要再自己实现这些逻辑了,开源工具类不香吗?
最近公司来了一批实习生,小黑哥负责带一个。这位小师弟说实话,基本功很扎实,做事也非常靠谱,深得小黑哥真传。
andyxh
2020/05/19
9960
探索java中的hutools工具库
Hutools是一个Java工具库,提供了丰富的工具模块,可以帮助开发人员简化日常开发任务,并提高工作效率。下面是一些在工作中常用的Hutools工具模块,会用到一些时间处理。或者一些ID生成。获得一些字符判断等非常常用的一些工具类。Hutools都做了一个非常漂亮的简化处理。也是新手值得非常学习的编码工具类
查拉图斯特拉说
2024/01/22
1.1K2
Java8时间方法LocalDate和LocalDateTime工具类
目的地-Destination
2023/10/12
5640
推荐阅读
相关推荐
hutool官网(hutool好用吗)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档