DDD(一)微服务、领域驱动设计、领域模型

如果觉得样式不好:跳转即可 http://www.lifengying.site/(md文件复制过来有些样式会不一样)

什么是微服务

单体结构项目

优点:结构简单,部署简单等

缺点:耦合;技术栈统一,软件包版本锁定;一崩全崩;升级周期长;无法局部扩容;

微服务结构项目

优点:耦合性低,易于开发和维护;可以用不同技术栈;可以单独扩容;互相隔离,影响小;部署周期短;

缺点:对运维能力要求高;运行效率会降低;技术要求高,需要处理事务最终一致性等问题。

微服务的误区

微服务架构应该是进化而来的;微服务的拆分进化。(项目起步应该拆分的服务很少可能只有2 3个,慢慢的随着系统业务越来越庞大,慢慢再拆分)

在设计不好的微服务架构中,微服务之间的调用关系非常复杂,一个来自客户端的请求甚至要经过七八层的微服务调用,这样糟糕的设计不仅导致系统间耦合严重,而且使得服务器端的处理效率非常低。

在项目初始阶段,需要认真思考,我们是否非用微服务不可,并拿出充足的理由。不要为了微服务而微服务。

DDD(domain driven design)领域驱动设计

1、是一个很好的应用于微服务架构的方法论。

2、在项目的全生命周期内,所有岗位的人员都基于对业务的相同的理解来开展工作。所有人员站在用户的角度、业务的角度去思考问题,而不是站在技术的角度去思考问题。

3、诞生于2004年,兴起于2014年(微服务元年)。

例如:当我们需要开发一个电力系统的时候,我们可能需要了解电力相关的知识或者说成为一个电力专家,当我们开发一个金融系统的时候,我又要成为一个金融专家等等。成本很高。而且我们只开发系统,也不需要成为每一个领域的专家。

4、DDD晦涩难懂,难以落地。因为DDD是方法论,不是行动指南。

5、“盐少许、油少许“,每个人对DDD的理解和落地都不同,而且没有绝对的对错。

6、如果只学习DDD概念而没有了解如何应用的话,会感觉没有落地;而如果过早关注落地的话,会导致理解片面。

7、正确姿势:“从理论到实践,从实践再到理论……” 我的讲课顺序:把概念的讲解和技术落地分开。Why?

8、不要一下子学DDD的整体。不同岗位、不同阶段的人先从自己的角度学习DDD的一部分。

领域

1、“领域”(Domain):一个组织做的事情。子领域。

2、领域的划分(以手机公司为例):

  核心域:解决项目的核心问题,和组织业务紧密相关。

  支撑域:解决项目的非核心问题,则具有组织特性,但不具有通用性。

  通用域:解决通用问题,没有组织特性。

3、领域的不同分类决定了公司的研发重点。

领域主要指一个组织做的所有的事情,但是一般为了缩小讨论的范围,会划分为多个子领域。

例如:手机公司

手机研发子领域、手机制造子领域解决了手机的核心问题。

销售子领域、财务子领域、售后子领域这些都和手机相关,比如销售手机和销售电脑、销售房子需要掌握的业务知识不一样。属于支撑域。

保洁、保安统称后勤子领域、人事子领域这些领域属于通用域,手机研发公司的后勤和电子厂的后勤做的事情都是一样的。一般这种领域可以外包给第三方。

不同的组织也会导致划分的结果不一样,这里我们就用不同的公司来代替

比如上述说的外包第三方公司,但是对于保洁家政等公司来说,保洁、保安子领域又属于核心域。

总结

手机研发子领域、手机制造子领域为核心域

销售子领域财务子领域、售后子领域为支撑域

保洁、保安统称后勤子领域、人事子领域为通用域

书中销售子领域划分为核心域,但是视频里面没有明确讲销售子领域划分,我个人认为销售子领域为支撑域,如果从利润角度来划分,它又不得不为核心域,毕竟手机造出来卖不出去,没有收入,一切都是空谈

总之,同样的领域由于划分的不同结果也不一样。根据自己的公司来具体划分。

领域模型(Domain Model)

1、对于领域内的对象进行建模,从而抽象出来模型。

2、以银行为例。

银行的柜台业务领域中,就有储户、柜员、账户等领域模型。建模是DDD中非常核心的事情,一旦定义出了领域模型,我们就可以用领域模型驱动项目的开发。

3、我们的项目应该开始于创建领域模型,而不是考虑如何设计数据库和编写代码。使用领域模型,我们可以一直用业务语言去描述和构建系统,而不是使用技术人员的语言。

事务脚本

使用技术人员的语言去描述和实现业务事务。没有太多设计,没有考虑可扩展性、可维护性,流水账地编写代码。

例子:

总结:这样的代码

优点:编写简单,自然,非常符合开发人员的思维方式。

缺点:事务脚本中,本该属于支撑域的权限的概念出现了在核心域的代码中,我们应该通过AOP(aspect-oriented-programming,面向切面编程)等方式把权限校验的代码放到单独的权限校验支撑域中。这段代码的另外一个问题是,对于需求的快速变化的响应是非常糟糕的,比如系统的需要增加一个“取款金额大于5万的需要主管审批”的功能,我们可能需要对代码进行增加一个if判断,,或者系统增加一个取款成功之后短信的通知等等,随着系统的业务膨胀,上述Withdraw方法会增长到成千上万行,代码的可维护性、可扩展性非常差

DDD通用语言、界限上下文

1、“我想要商品可以被删除”→“我想要把删除的还原回来”→“Windows回收站都能”

2、此“用户”非彼“用户”。

3、通用语言:一个拥有确切含义的、没有二义性的语言。

4、通用语言离不开特定的语义环境,只有确定了通用语言所在的边界,才能没有歧义的描述一个业务对象。

为什么使用DDD(领域模式):https://juejin.cn/post/6895096192980484103

领域驱动设计(DDD)在爱奇艺打赏业务的实践:https://juejin.cn/post/7050738599649607694

CQRS Journey:https://docs.microsoft.com/en-us/previous-versions/msp-n-p/jj554200(v=pandp.10)

DSL 领域特定语言 :以上相关博客或者书籍有时间可以自己了解和查阅。

DDD之实体、值对象

实体(Entity)

1、“标识符”用来唯一定位一个对象,在数据库中我们一般用表的主键来实现“标识符”。主键和标识符的思考角度不同。

2、实体:拥有唯一的标识符,标识符的值不会改变,而对象的其他状态则会经历各种变化。标识符用来跟踪对象状态变化,一个实体的对象无论怎样变化,我们都能通过标识符定位这个对象。

3、实体一般的表现形式就是EF Core中的实体类。

值对象(Value Object)

1、值对象:没有标识符的对象,也有多个属性,依附于某个实体对象而存在。比如“商家”的地理位置、衣服的RGB颜色。

2、定义为值对象和普通属性的区别:体现整体关系

总结:

核心是看是否能自己独立存在

能就是实体,否就是值对象

例如

身份证ID不会变 但是年龄、姓名、居住地址、有效期等等都会变化,由于身份证ID没有变,这个人(对象)还是之前的那个人(对象)。

反过来就算年龄、姓名、居住地址、有效期等等都一样,但是身份证号不一样,那也是2个不同的人(对象)

本文内容大部分都为杨中科老师《ASP.NET Core技术内幕与项目实战》一书中内容,此文只是做学习记录,如有侵权,联系立马删除。

 

DDD(一)微服务、领域驱动设计、领域模型的更多相关文章

  1. DDD(Domain Driver Designer) 领域驱动设计简介

    领域驱动设计之领域模型 加一个导航,关于如何设计聚合的详细思考,见这篇文章. 2004年Eric Evans 发表Domain-Driven Design –Tackling Complexity i ...

  2. DDD学习笔录——简介领域驱动设计的实践与原则

    DDD在存在许多DDD模式的同时,也有大量实践和指导原则,这些都是DDD思想体系成功的关键. 1.专注于核心领域 DDD强调的是在核心子域付出最多努力的需要.核心子域是你的产品会成功还是会失败的差异化 ...

  3. Java开发架构篇《初识领域驱动设计DDD落地》

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 DDD(Domain-Driven Design 领域驱动设计)是由Eric Eva ...

  4. DDD 领域驱动设计-三个问题思考实体和值对象(续)

    上一篇:DDD 领域驱动设计-三个问题思考实体和值对象 说实话,整理现在这一篇博文的想法,在上一篇发布出来的时候就有了,但到现在才动起笔来,而且写之前又反复读了上一篇博文的内容及评论,然后去收集资料, ...

  5. DDD领域驱动设计和实践(转载)

    -->目录导航 一. DDD领域驱动设计介绍 1. 什么是领域驱动设计(DDD) 2. 领域驱动设计的特点 3. 如果不使用DDD? 4. 领域驱动设计的分层架构和构成要素 5. 事务脚本和领域 ...

  6. DDD(领域驱动设计)总结

    基本概念: 领域驱动设计(简称 ddd)概念来源于2004年著名建模专家eric evans发表的他最具影响力的书籍:<domain-driven design –tackling comple ...

  7. DDD(Domain-Driven Design) 领域驱动设计

    DDD(Domain-Driven Design) 领域驱动设计 1. DDD(Domain-Driven Design)是什么? DDD是Eric Evans在2003年出版的<领域驱动设计: ...

  8. 从0开发3D引擎(补充):介绍领域驱动设计

    我们使用领域驱动设计(英文缩写为DDD)的方法来设计引擎,在引擎开发的过程中,领域模型会不断地演化. 本文介绍本系列使用的领域驱动设计思想的相关概念和知识点,给出了相关的资料. 上一篇博文 从0开发3 ...

  9. 驱动领域DDD的微服务设计和开发实战

    你是否还在为微服务应该拆多小而争论不休?到底如何才能设计出收放自如的微服务?怎样才能保证业务领域模型与代码模型的一致性?或许本文能帮你找到答案. 本文是基于 DDD 的微服务设计和开发实战篇,通过借鉴 ...

  10. 一缕阳光:DDD(领域驱动设计)应对具体业务场景,如何聚焦 Domain Model(领域模型)?

    写在前面 阅读目录: 问题根源是什么? <领域驱动设计-软件核心复杂性应对之道>分层概念 Repository(仓储)职责所在? Domain Model(领域模型)重新设计 Domain ...

随机推荐

  1. Symbol类型

    Symbol 是ES6引入的一种新的原始数据类型,由于Symbol是一个原始类型的值,不是对象,不能添加属性.基本上 是一种类似于字符串的数据类型 概述 Symbol 可以接受一个字符串作为参数,主要 ...

  2. Server2008通过bat命令自动定时备份MySQL数据库

    第一种方法: 环境: MySQL 安装位置:D:\MySQL 论坛数据库名称为:Db_Test 数据库备份目的地:D:\db_bak\ 1.首先新建一个bat文件 rem ************** ...

  3. redis底层数据结构之跳表(skiplist)

    跳表(跳跃表, skiplist) 跳跃表(skiplist)是用于有序元素序列快速搜索查找的数据结构,跳表是一个随机化的数据结构,实质是一种可以进行二分查找的.具有层次结构的有序链表 跳表在原有的有 ...

  4. Mac上好用的app们

    记录下自己在mac上用的一些很不错的app,大多免费. 排名随缘. 不定期更新. Amphetamine 来源 AppStore 说明 欢迎使用Amphetamine,一款为macOS打造的最棒的防睡 ...

  5. C# 读取电脑CPU、主板、硬盘序列号等信息

    ManagementObjectSearcher 解析不到头文件,需要手动 Add Referance 需要添加引用:System.Management,然后引入命名空间:using System.M ...

  6. Qt设置程序图标

    修改.pro文件添加一下代码:要求.pro文件和.ico文件在同一文件夹下 RC_ICONS = xxx.ico (你的程序图标)最后重新构建一次即可

  7. VM虚拟机的创建和CentOS 7的安装

    1.vm和CentOS的下载. 一:vm和CentOS的下载,这是创建虚拟机和CentOS安装的必要条件. 2.vm虚拟机的创建. 一:打开vm软件界面,会看到虚拟机的字,点击虚拟机开始创建虚拟机.二 ...

  8. python+接口参数化(ddt和pytest.mark.parametrize())使用

    一.ddt(基于unittest) 实例:字典解包[{},{}] test_data=t.read_excel(mode,case_list)@ddt class Interface(unittest ...

  9. typora文件中不显示公式

    行内公式在typora中不显示 解决办法 打开typora--文件(F)--偏好设置--markdown--内联公式--打勾选中 若改后没有反应,关闭重新打开.

  10. java-文件IO常用操作对比

    文件IO中,常用的方法如下方代码中的readMethod1~8方法所示. 测试了2.5M读100次.100M读3次.250M读1次三种情况,耗时(单位:毫秒)如下: 2.5M读100次 2.5M读10 ...