【设计模式】DDD 设计理念
From: https://liudongdong1.github.io/
微服务架构,在集中式架构中,系统分析、设计和开发往往是独立进行的,而且各个阶段负责人可能不一样,那么就涉及到交流信息丢失的问题, 另外项目从分析到开发经历的流程很长,很容易最终开发设计与需求实现的不一样,微服务主要就是解决第二阶段的这些痛点,实现应用之间的解耦,解决单体应用扩展性的问题。
1. 概念
面对客户的业务需求,由
领域专家与开发团队
展开充分的交流,经过需求分析与知识提炼
,以获得清晰的问题域。通过对问题域进行分析和建模
,识别限界上下文
,利用它划分相对独立的领域
,再通过上下文映射建立它们之间的关系
,辅以分层架构与六边形架构划分系统的逻辑边界与物理边界
,界定领域与技术之间的界限
。之后,进入战术设计阶段,深入到限界上下文内对领域进行建模,并以领域模型指导程序设计与编码实现。若在实现过程中,发现领域模型存在重复、错位或缺失时,再进而对已有模型进行重构,甚至重新划分限界上下文。两个不同阶段的设计目标是保持一致的,它们是一个连贯的过程,彼此之间又相互指导与规范,并最终保证一个有效的领域模型和一个富有表达力的实现同时演进。
2. 提炼问题阈
3. 专注核心问题
在
一个大的问题空间中会同时存在很多的小问题域
,而这些小问题域往往只有少部分是核心领域
,其他的可能都是通用域和支撑域。核心域是我们软件的根本竞争力所在,因此也可以说是我们编写软件的原因。拿一个在线拍卖网站来说,可以见下图所示划分了核心域、支撑域和通用域:
4. 驱动模型设计
模型驱动设计专注于实现以及对于初始模型可能需要修改的约束
,领域驱动设计则专注于语言、协作和领域知识
,他们是一个彼此互补的关系。而要实现协作,就需要使用通用语言,借助通用语言可以将分析模型和代码模型绑定在一起,并最终实现团队建模。实践UL是一个持续的过程,多个迭代后会不断对UL进行验证和改进,以便实现更好的协作。由于时间和精力都有限,只有仅仅为核心域应用模型驱动设计和创建UL才能带来最大的价值,而不需要将这些实践应用到整个应用程序之中。
5. 领域模型实现模式
- 领域模型模式:适用于复杂问题域,领域中的概念被封装为数据和行为的对象
- 事务脚本模式:组织所有的领域逻辑来满足业务事务或用例
- 表模块模式:代表着以对象形式建模的数据,数据驱动
- 活动记录模式:类似表模块,数据驱动,关注表中的行而非表本身
- 贫血模式:类似领域模型,不包含任何行为,纯粹的一个对象状态模型,需要一个单独的服务类来实现行为
6. 使用有界上下文维护领域模型的完整性
从
展现层
、领域逻辑层
再到持久化层
的完整代码堆栈,正应对了我们的每一个微服务的应用程序
,也具有较高的独立性,拥有自己的数据库和一套完成的垂直切片的架构模式。不应该局限在某一种或者两种架构模式上,而是应该量身应用
,没有复杂性业务逻辑的微服务,那就应该KISS(Keep It Simple & Stupid),否则就可以考虑DDD。
7. 上下文映射
上下文映射用来
捕获各个有界上下文之间的技术与组织关系
,它最大的作用就是保持模型的完整性
。在战略设计阶段,针对问题域,通过引入限界上下文和上下文映射可以对问题域进行合理的分解,识别出核心领域和子领域,并确定领域的边界以及他们之间的关系,从而维持模型的完整性。限界上下文不仅局限于对领域模型的控制,而在于
分离关注点之后,使得整个上下文可以成为独立部署的设计单元
,这就是我们非常熟悉的“微服务”的概念;而上下文映射的诸多模式则对应了微服务之间的协作。
8. 应用程序架构
9. 团队开始应用DDD通常会遇到的问题
10. 应用DDD的原则、实践与模式
Resource
【设计模式】DDD 设计理念的更多相关文章
- 基于领域驱动设计(DDD)超轻量级快速开发架构
smartadmin.core.urf 这个项目是基于asp.net core 3.1(最新)基础上参照领域驱动设计(DDD)的理念,并参考目前最为了流行的abp架构开发的一套轻量级的快速开发web ...
- Lind.DDD敏捷领域驱动框架~介绍
回到占占推荐博客索引 最近觉得自己的框架过于复杂,在实现开发使用中有些不爽,自己的朋友们也经常和我说,框架太麻烦了,要引用的类库太多:之前架构之所以这样设计,完全出于对职责分离和代码附复用的考虑,主要 ...
- 漫谈 GOF 设计模式在 Spring 框架中的实现
原文地址:梁桂钊的博客 博客地址:http://blog.720ui.com 欢迎关注公众号:「服务端思维」.一群同频者,一起成长,一起精进,打破认知的局限性. 漫谈 GOF 设计模式在 Spring ...
- 设计模式在 Spring 框架中的良好应用
在开始正文之前,请你先思考几个问题: 你项目中有使用哪些 GOF 设计模式 说一说 GOF 23 种设计模式的设计理念 说说 Spring 框架中如何实现设计模式 假设我是面试官问起了你这些面试题,你 ...
- Java面试通关要点汇总集
Java面试通关要点汇总集 2018-03-09 转自:Java面试通关要点汇总集 文章目录 1. 基础篇 1.1. 基本功 1.2. 集合 1.3. 线程 1.4. 锁机制2. 核心篇 2 ...
- Java面试题[转载]
目录 转载 简历篇 请自我介绍 请介绍项目 基础篇 基本功 面向对象的特征 final, finally, finalize 的区别 int 和 Integer 有什么区别 重载和重写的区别 抽象类和 ...
- Java面试问题汇总
转一些面试经验 刚看到下面这份面试清单,从个人的开发面试经历看,里面总结的大部分内容还是很不错的.年后想跳槽的朋友可以选取里面的问题准备一下. GitHub上的面试总结帖 Interview-Note ...
- 最新Java面试题及答案整理
基础篇 一.基本功 面向对象特征 封装,继承,多态和抽象 1. 封装 封装给对象提供了隐藏内部特性和行为的能力.对象提供一些能被其他对象访问的方法来改变它内部的数据.在 Java 当中,有 3 种修饰 ...
- 从1.6W名面试者中收集的Java面试题精选汇总(内附知识脑图)
本篇的面试题是接之前读者的要求,发出来的. 首先,声明下,以下知识点并非全部来自BAT的面试题. 如果觉得在本文中笔者总结的内容能对你有所帮助,可以点赞关注一下. 本文会以引出问题为主,后面有时间 ...
随机推荐
- spring、springmvc、springboot、springcloud的联系与区别
spring和springMvc: 1. spring是一个一站式的轻量级的java开发框架,核心是控制反转(IOC)和面向切面(AOP),针对于开发的WEB层(springMvc).业务层(Ioc) ...
- STM32中的GPIO笔记
1.GPIO是STM32可控制的引脚,STM32的GPIO被分成很多组,每组有16个引脚.每个GPIO端口包含:2个32位配置寄存器(CRL.CRH),2个32位数据寄存器(IDR.ODR),1个32 ...
- 关于kong | API Gateway
目录 为什么需要 API 网关(more) kong的概念 为什么使用Kong Kong 的管理方式 高可扩展性的背后-插件机制 [前言]: Kong是一个云原生,高效,可扩展的分布式 API 网关. ...
- C语言:case详解
C语言虽然没有限制 if else 能够处理的分支数量,但当分支过多时,用 if else 处理会不太方便,而且容易出现 if else 配对出错的情况.例如,输入一个整数,输出该整数对应的星期几的英 ...
- python pandas inplace参数
'''pandas 中 inplace 参数在很多函数中都会有,它的作用是:是否在原对象基础上进行修改 inplace = True:不创建新的对象,直接对原始对象进行修改: inplace ...
- Grafana、Prometheus、mtail-日志监控
一:日志如何监控 在上一篇博客Grafana.Prometheus-监控平台中,简单了解了Grafana与Prometheus对项目做特定的监控打点,可视化的配置操作. 但是对于没有设置监控或者不容易 ...
- mybatis-7-缓存
1. 一级缓存: SqlSession 级别, 默认开启, 并且不能关闭 操作数据库是需要创建 SqlSession 对象, 在对象中有一个 HashMap 用于存储缓存数据, 不同的 SqlSess ...
- Cookie学习总结
Cookie简述 1. 概念 一种客户端会话技术,可以将一些少量的数据保存在客户端. 2. 快速使用 步骤 创建cookie对象,并设定数据 new Cookie(String name, Strin ...
- MySQL检查与性能优化示例脚本
最近在玩python,为了熟悉一下python,写了个mysql的检查与性能优化建议的脚本. 虽然,真的只能算是一个半成残次品.也拿出来现眼一下. 不过对于初学者来说,还是有一定的参考价值的.比如说如 ...
- P5042 丢失的题面
P5042 丢失的题面 顺序:10 - 1 - 7 - 8 - 9 - 4 - 5 - 6 - 2 - 3 Point 10 读入,特判,输出. 读入的英文意思是让选手输出自己的程序本身,这个题的确存 ...