DDD之1微服务设计为什么选择DDD
背景
名词解释
如果你的团队目前正是构建微服务架构风格的软件系统,问自己两个问题?
软件架构演进
软件架构大致经历了从单机架构,集中式架构,分布式微服架构,程序的层次图如下所示。
单机架构
特点如下:
1, 面向过程的设计方法;
2, 结构为CS;
3,程序的层次分两层,即UI层和数据库层;
4, 设计的核心在数据库和字段。
集中式架构
特点如下:
1, 面向对象的设计方法;
2,程序层次为经典的3层架构,即业务接入层, 业务逻辑层,数据库层;
3,部分企业也采用SOA架构风格;
4,集中式的架构缺点:扩展性,伸缩性差,系统容易变得臃肿;
分布式微服务架构
特点:
1, 基于微服务的理念:分而治之,模块高内聚(独立团队,独立部署,独立存储,技术异构),模块之间通过RPC或者HTTP通信,松耦合;
2,模块之间松耦合,解决了扩展性和伸缩性的问题;
架构对比
单体架构和集中式架构,系统分析, 系统设计,系统开发这3个阶段是割裂的,即分属3个不同的人或者小组或者岗位的人负责,这样的后果是:
1,系统分析,设计,开发三个阶段的信息不一致,导致上线之后功能跟需求偏差非常大;
2,系统的开发无法快速响应需求和业务的变化,错失发展的良机。
微服务的困局
微服务解决的问题
微服务解决了单体架构和集中式架构的问题:扩展性,弹性伸缩,敏捷开发快速响应业务变化;
但是微服务并非毫无缺陷。
微服务的挑战
微服务的粒度应该多大?微服务应该怎么拆分和设计?微服务的边界在哪里?
微服务架构的提出者martin flower 也没有告诉我们该如何拆分微服务。
微服务拆分的困局:
失败的例子:微服务就是把单体拆的足够小能够独立部署的技术框架,然后由于拆分的太细,后期服务运维和上线。
问题的本质:** 业务或者微服务的边界到底是什么?**
破局之路:2004年DDD发布,Domain-Driven Design –Tackling Complexity in the Heart of Software,跟踪软件的核心复杂度。
核心思想:通过领域驱动设计方法来定义领域模型,来确定业务和应用的边界,最后保证业务模型和代码模型的一致性。
**
通过业界的大量实践证明: 通过DDD的方法来设计领域模型,划分领域边界再根据领域边界从业务的视角来划分微服务的边界,通过这些边界设计出来的微服务都非常合理,可以实现服务的内部高内聚,外部低耦合。
**
**
所以很多的企业已经把DDD当做微服务设计的主流方法了。
DDD
定义
是一种处理高度复杂的领域设计思想:围绕业务概念进行领域建模来控制业务的复杂性,并试图分离技术实现的复杂性,解决软件系统难以理解难以演进的复杂性问题;
不是架构,而是一种架构设计的方法论: 通过边界划分把复杂业务领域简单化,帮助我们设计清晰的领域和应用边界,容易实现架构的演进。
主要内容
分为战略设计和战术设计。
DDD带了了什么?
战略设计
从业务视角出发,建立业务领域模型,划分领域的边界,建立通用语言的限界上下文。限界上下文就是微服务边界的参考。
领域模型用来指导微服务的设计和拆分。
基础元素:
领域模型,领域边界,通用语言限界上下文;
方法:
划定领域模型和微服务边界的步骤:
战术设计
技术视角出发,侧重于领域模型的技术实现,完成软件的开发和落地。
包含基础元素:
聚合根、
实体、
值对象、
领域服务、
应用服务和
资源库
等代码逻辑的设计和实现。
把领域模型中的领域对象跟代码模型中的对象对应,将业务架构和系统架构进行绑定。当我们调整业务架构和领域模型的时候,系统架构也会发生映射关系的调整;
微服务和DDD之间的关系
小结
主要回答了为什么微服务的设计和边界需要使用DDD这种方法论来操作。希望诸位的微服务设计高内聚低耦合,良好的适应业务的变化,具备非常好的扩展性,伸缩性。
原创不易,关注诚可贵,转发价更高!转载请注明出处,让我们互通有无,共同进步,欢迎沟通交流。
我会持续分享Java软件编程知识和程序员发展职业之路,欢迎关注,我整理了这些年编程学习的各种资源,关注公众号‘李福春持续输出’,发送'学习资料'分享给你!
DDD之1微服务设计为什么选择DDD的更多相关文章
- 基于DDD的微服务设计和开发实战
你是否还在为微服务应该拆多小而争论不休?到底如何才能设计出收放自如的微服务?怎样才能保证业务领域模型与代码模型的一致性?或许本文能帮你找到答案. 本文是基于 DDD 的微服务设计和开发实战篇,通过借鉴 ...
- 驱动领域DDD的微服务设计和开发实战
你是否还在为微服务应该拆多小而争论不休?到底如何才能设计出收放自如的微服务?怎样才能保证业务领域模型与代码模型的一致性?或许本文能帮你找到答案. 本文是基于 DDD 的微服务设计和开发实战篇,通过借鉴 ...
- 部署:持续集成(CI)与持续交付(CD)——《微服务设计》读书笔记
系列文章目录: <微服务设计>读书笔记大纲 一.CI(Continuous Integration)简介 CI规则1:尽量频繁地把代码签入到分支中以进行集成 CI规则2: ...
- 为什么在做微服务设计的时候需要DDD?
记得之前在规划和设计微服务架构的时候,张队长给了我一个至今依然记忆深刻的提示:『你的设计蓝图里为什么没有看到DDD的影子呢?』 随着对充血模型的领域认知的加深,我越加感觉到DDD的重要性.但是DDD内 ...
- 清晰架构(Clean Architecture)的Go微服务: 设计原则
我最近写了一个Go微服务应用程序,这个程序的设计来自三个灵感: 清晰架构"Clean Architecture"¹ and SOLID (面向对象设计)² 设计 原则³ Sprin ...
- 架构之微服务设计(Nginx + Upsync)
Upsync,微博开源基于Nginx容器动态流量管理方案 . Nginx 以其超高的性能与稳定性,在业界获得了广泛的使用,微博的七层就大量使用了 Nginx .结合 Nginx 的健康检查模块,以及动 ...
- 微服务设计 - api版本控制
要描述了几种API版本控制的方法.用户可以查询原始的API,或者添加定制的头文件来接收特定的版本.如果应用程序收到一个重大修订,将URI修改为V2.在进行迭代改进时,将创建与更改日期相一致的端点,并允 ...
- 微服务中台落地 中台误区 当中台遇上DDD,我们该如何设计微服务
小结: 1. 微服务中台不是 /1堆砌技术组件就是中台 /2拥有服务治理就是中台 /3增加部分业务功能就是中台 /4Cloud Native 就是中台 https://mp.weixin.qq.com ...
- DDD实战让中台和微服务的落地如虎添翼
微服务到底怎么拆分和设计才算合理,拆多小才叫微服务?有没有好的方法来指导微服务和中台的设计呢? 深入DDD的核心知识体系与设计思想,带你掌握一套完整而系统的基于DDD的微服务拆分与设计方法,助力落地边 ...
随机推荐
- IIS搭建网站(二)
win+IIS+ASP+ACCESS第二种搭建方式 安装 控制面板”,依次选“添加/删除程序”, 添加/删除Windows组件 在应用程序服务器前打钩.点击详细信息 将“Internet信息服务(II ...
- xenomai内核解析之嵌入式实时linux概述
Linux系统作为一个GPOS(通用操作系统)发展至今已经非常成熟可靠了,并且由于遵循GPL协议,开放所有系统源代码,非常易于裁剪.更重要的是,与其他开源的GPOS或RTOS相比,Linux系统支持多 ...
- c/c++获取文件夹下所有文件名
如何获取某一文件夹下所有文件名,是一个很有意思的问题.网上代码很多,找了个简单的,特此收录. #include <iostream> #include <io.h> #incl ...
- Git管理修改、撤销修改、删除文件
什么是修改?比如你新增了一行,这就是一个修改,删除了一行,也是一个修改,更改了某些字符,也是一个修改,删了一些又加了一些,也是一个修改,甚至创建一个新文件,也算一个修改. a.管理修改 对于提交修改, ...
- Queue-PriorityQueue源码解析
Queue队列通常是先进先出(FIFO),但也有特殊的非FIFO,如本文也分析的PriorityQueue. Queue接口 Queue接口定义的方法: 添加元素接口: add(E e) -> ...
- MOS管和三极管开关特性
不知道对不对? 待续!!!
- C++内存管理学习笔记(1)
/****************************************************************/ /* 学习是合作和分享式的! /* Auth ...
- tp5.1的事务操作
普通的事务操作很简单,最简单的方式是使用 transaction 方法操作数据库事务, 当闭包中的代码发生异常会自动回滚, 例如: Db::transaction(function () { Db:: ...
- Codeforces Round #643 (Div. 2)(C ~ E)
C. Count Triangles 题目链接 : https://codeforces.com/contest/1355/problem/C 题目大意 : 给你 A , B , C , D 问有多少 ...
- docker 使用 Nvidia 显卡
docker19.03读取NVIDIA显卡 作者: 张首富 时间: 2019-09-06 w x: y18163201 前言 2019年7月的docker 19.03已经正式发布了,这次发布对我来说有 ...