DDD学习笔记

1)ddd:
    软件复杂性的应对之道。
    但是不是说:redis这种不会使用。
    开发过程中,一直面临的一种复杂性。

    是一种架构思想: 领域之间的组合。 让开发软件具有搭积木的感觉。

    领域的核心是边界。

    以领域划分为基础。

    以通用语言为建设核心:
        如: 在一个项目中每个模块具有相同的包结构。

2)mvc的做法:
    UserController: 负责用户的注册等。
    OrderController: 创建订单也需要用户信息。

    导致:这2个Controller都引入了UserService。  

3)业务优先: 一个一个模块,一个模块一个文件夹。 // 不看细节,也能看懂大概是干什么的。

4)技术优先: 根本看不懂实体是干什么的。

5)三大设计原则:
    1.单一职责:一个类只负责单一的职责,也就是只有一个引起变化的原因。
    2.开放封闭:对扩展开放,对修改关闭。
    3,依赖反转:值依赖抽象接口,而不依赖于具体实现。

6)DDD模型妙招:
    1.使用充血模型的实体对象,描述核心业务能力。--》对数据库下手。
        系统能做什么事情,一目了然。
    2.使用仓库与工厂,封装实体持久化操作,拜托数据库限制。

7)Martin Flowler:
    贫血模型: pojo ==> 问题: 贫血失忆症,本来定义实体是为了承载业务,我们只能在Service中翻,我们现在不知道用于做什么业务了。

    充血模型: 解决之道:属性 + 引起属性变化的方法写在一起。

8)DDD改造mvc后: // 其实就是: 在3个设计原则下。 
    只有业务逻辑,没有任何实现细节。
    因为面向接口编程了,所有的参数其实都是Entity实体,你也看不出来到底是: mysql还是mongo。
    更加容易做单元测试。 如: 针对AccountReponsitory即可,从Dao换成mapper。 对其他业务没有任何影响。
    领域层不需要任何的依赖。

9)DDD缺点: 带来了类爆炸。

10)聚合:
    将确保这些领域对象在实现共同的业务逻辑时,能保证数据的一致性。

    一个不存在了,其它也不存在了。

    通过聚合根。

11)通过接口去做各种类似的东西。
        如: 微服务、feign、dubbo。

        不是从本地找实现,而是从nacos之类的,从本地查找实现转化为从rpc找实现。

12)MVC: 技术边界清晰,但是业务逻辑边界模糊,很难拆分为: 微服务。
    DDD: 优先设计业务实体,形成业务领域。 通过防腐层和限界上下文实现逻辑边界。 从而很容易调整,如:从本地接口发现改为从rpc发现,
            那么就很容易改为支持微服务的架构。

13)一个注解,从单体架构变为微服务架构。


14)MVC做好后的问题(看起来简单,但是...):
    1.功能扩展性带来负载的重构: 从普通的认证改为 OAuth2鉴权需要重构。
    2.负载问题: GenSIController非常繁忙,SysManageController却很空闲。

    微服务的缺点: 需要部署很多周边服务,非常昂贵,很可能项目上线后不就就撤掉了。
                    因此,我们开始希望是单体。 然后根据发展拆分为微服务。

15)重构对于甲方是没有任何业务价值的。

16)软件核心复杂性的问题: // 也就是DDD出现的原因
    项目迭代过程中,发展出了超出设计之外的问题,这些问题重构又很困难。
        比如: 淘宝开始是php做的,它根本不知道以后还要支持"双11" "秒杀"。

17)DDD的核心:
    1.技术主动理解业务: 我当前的业务需要哪些对象来参与,这些对象构成什么样的业务流程。
    2.打破自己的包结构,向业务调整。
    3."刚刚好"解决问题: DDD强调的是每一步的实现支持当前的业务就行了。

18)Demo架构:
    Client // 向Server发起Http请求。
 
    Interface // 是Dubbo接口定义
    Resource
    Server // 向Resource之间是Dubbo协议交互。 Server做流量的管理。

    Nacos // Server向Nacos注册消费者接口,Resource向Nacos注册生产者接口。

19)初步领域划分:
    HisRequest  // 负责交易日志管理服务
    GsService   // 负责核心的请求转发业务
    SysManage   // 负责客户端管理业务

20)1个注解从单体到微服务
    SPI: ServiceLoader 去加载本地服务的实现。
    否则使用Nacos去从远程加载实现。

21)单体架构到微服务: 让资源的投入更加的精准。

22)DDD中领域暴露出来的,其实还是接口。

23)单体架构快速验证,微服务部署。

24)DDD: 只是一种思想,没有一个类似的框架。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/182924.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

持续集成交付CICD:安装Jenkins Slave(从节点)

目录 一、实验 1.安装Jenkins Slave(从节点) 二、问题 1.salve节点启动jenkins报错 2.终止命令行后jenkins从节点状态不在线 一、实验 1.安装Jenkins Slave(从节点) (1)查看jenkins版本 Version 2.…

c语言进阶部分详解(《高质量C-C++编程》经典例题讲解及柔性数组)

上篇文章我介绍了介绍动态内存管理 的相关内容:c语言进阶部分详解(详细解析动态内存管理)-CSDN博客 各种源码大家可以去我的github主页进行查找:唔姆/比特学习过程2 (gitee.com) 今天便接“上回书所言”,来介绍《高质…

ElasticSearch 实现 全文检索 支持(PDF、TXT、Word、HTML等文件)通过 ingest-attachment 插件实现 文档的检索

一、Attachment 介绍 Attachment 插件是 Elasticsearch 中的一种插件,允许将各种二进制文件(如PDF、Word文档等)以及它们的内容索引到 Elasticsearch 中。插件使用 Apache Tika 库来解析和提取二进制文件的内容。通过使用 Attachment 插件&a…

Qt的事件

一、鼠标按下事件 //鼠标按下事件,获取屏幕位置,并显示,移动显示框 void Widget::mousePressEvent(QMouseEvent *event) {if(event->button() ! Qt::LeftButton){return ;}QPoint point event->pos();QPointF winPt event->…

Python学习-shutil模块和OS模块学习

shutil模块 针对文件的拷贝,删除,移动,压缩和解压操作 # 1.copyfileobj只能复制文件内容,无法复制权限#复制文件时,要选择自己有权限的目录执行操作,创建的文件会根据系统umask设定的参数来指定用户权限 s…

首发scitb包,一个为制作统计表格而生的R包

目前,本人写的第3个R包scitb包已经正式在R语言官方CRAN上线,scitb包是一个为生成专业化统计表格而生的R包。 可以使用以下代码安装 install.packages("scitb")scitb包对我而言是个很重要的R包,我的很多想法需要靠它做平台来实现&a…

项目实战:优化Servlet,把所有围绕Fruit操作的Servlet封装成一个Servlet

1、FruitServlet 这些Servlet都是围绕着Fruit进行的把所有对水果增删改查的Servlet放到一个Servlet里面,让tomcat实例化一个Servlet对象 package com.csdn.fruit.servlet; import com.csdn.fruit.dto.PageInfo; import com.csdn.fruit.dto.PageQueryParam; import c…

多级缓存之JVM进程缓存

1.什么是多级缓存 传统的缓存策略一般是请求到达Tomcat后,先查询Redis,如果未命中则查询数据库,如图: 存在下面的问题: 请求要经过Tomcat处理,Tomcat的性能成为整个系统的瓶颈 Redis缓存失效时&#xff0…

STM32笔记—DMA

目录 一、DMA简介 二、DMA主要特性 三、DMA框图 3.1 DMA处理 3.2 仲裁器 3.3 DMA通道 扩展: 断言: 枚举: 3.4 可编程的数据传输宽度、对齐方式和数据大小端 3.5 DMA请求映像 四、DMA基本结构 4.1 DMA_Init配置 4.2 实现DMAADC扫描模式 实现要求…

PMP考试都是什么题?

PMP考试都是选择题,180道选择题,单选170道,多选10道,告知答案选项数量。 这里分享一下PMP考试中的常见翻译问题,pmp干货可在文末获取。 1、题目中出现的“启动会议”或“启动大会”开工会议(kick-off mee…

康耐视深度学习ViDi-ViDi四大工具介绍与主要用途

Cognex ViDi 工具是一系列机器视觉工具,通过深度学习解决各种难以解决的挑战。虽然这些工具共享一个引擎,但它们在图像中寻找的内容不同。更具体地说,在分析单个点、单个区域或完整图像时,每个工具都有不同的侧重点。 Locate&…

极致性能优化:前端SSR渲染利器Qwik.js | 京东云技术团队

引言 前端性能已成为网站和应用成功的关键要素之一。用户期望快速加载的页面和流畅的交互,而前端框架的选择对于实现这些目标至关重要。然而,传统的前端框架在某些情况下可能面临性能挑战且存在技术壁垒。 在这个充满挑战的背景下,我们引入…

基础课18——智能客服系统架构

1.基础设施层 基础设施主要包括以下几点: 1. 硬件设施:包括服务器、存储设备、网络设备等,这是整个系统运行的物理基础。 2. 软件设施:包括操作系统、数据库管理系统、自然语言处理(NLP)工具和机器学习算法等,这些是…

Jmeter分布式压测 —— 易踩坑点

1、压测机 无论是从成本角度还是维护的难易方面,压测机的数量,适量就好。举个例子,8C16G的一台服务器,部署Jmeter后,根据我个人的测试比对数据,配置≤1500个线程数,最好。太多了性能损耗较大&a…

Cannot run program “D:\c\IntelliJ IDEA 2021.1.3\jbr\bin\java.exe“

如果你的idea在打开后出现了这个故障 Cannot run program "D:\c\IntelliJ IDEA 2021.1.3\jbr\bin\java.exe" (in directory "D:\c\IntelliJ IDEA 2021.1.3\bin"): CreateProcess error2, 系统找不到指定的文件。 打开IDEA的设置 file --> settings --&…

机器人制作开源方案 | 管内检测维护机器人

一、作品简介 作者:李泽彬,李晋晟,杜张坤,禹馨雅 单位:运城学院 指导老师:薛晓峰 随着我国的社会主义市场经济的飞速发展和科学技术的革新,各行各业的发展越来越离不开信息化和网络化的…

【扩散模型】5、Diffusion models beat GAN | 使用类别引导图像生成

论文:Diffusion models beat GAN on image Synthesis 代码:https://github.com/openai/guided-diffusion 出处:OPENAI | NIPS2021 时间:2021 贡献: 在本文章之前,扩散模型生成的图片已经非常逼真了&am…

ubuntu20.04配置解压版mysql5.7

目录 1.创建mysql 用户组和用户2.下载 MySQL 5.7 解压版3.解压 MySQL 文件4.将 MySQL 移动到适当的目录5.更改mysql目录所属的用户组和用户,以及权限6.进入mysql/bin/目录,安装初始化7.编辑/etc/mysql/my.cnf配置文件8.启动 MySQL 服务:9.建立…

linux之信号

Linux之信号 什么是信号信号的产生方式signalsignactionkill信号集信号屏蔽 什么是信号 信号机制是一种使用信号来进行进程之间传递消息的方法,信号的全称为软中断信号,简称软中断。 信号的本质是软件层次上对中断的一种模拟(软中断&#xff…

第26期 | GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区,集成了生成预训练Transformer(GPT)、人工智能生成内容(AIGC)以及大型语言模型(LLM)等安全领域应用的知识。在这里,您可以…