Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >可落地的DDD的(2)-为什么说MVC工程架构已经过时

可落地的DDD的(2)-为什么说MVC工程架构已经过时

作者头像
方丈的寺院
发布于 2019-08-05 09:43:49
发布于 2019-08-05 09:43:49
1.6K00
代码可运行
举报
文章被收录于专栏:方丈的寺院方丈的寺院
运行总次数:0
代码可运行

摘要

mvc是一种软件设计模式,最早由Trygve Reenskaug在1978年提出,他有效的解决了表示层,控制器层,逻辑层的代码混合在一起的问题,很好的做到了职责分离。但是在实际的编码实践过程中,你会发现这个模式随着业务的扩展,变的逻辑混乱,代码重合度很高。这里借鉴DDD思想提出一种新的工程结构。

mvc的问题

通常一个前后端分离的系统,后端工程系统结构图通常下面这样

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1. 四层 controller/service/manager/mapper

  2. 不可以同级调用

  3. 上级可以知晓下级,下级不可知晓上级,也就是bean的转化放在上级

这个分层结构职责分离是按照纵向切分的

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1. 资源服务层repository是面向DB编程

  2. service层是面向前端页面编程。

也就是说,对于某一块的业务,他没有将逻辑抽象到一起,他只是将一次request按照纵向切分了。没有进行横向的业务切分。 这样将会导致的问题职责分散,逻辑重复度高

  • bean的创建太随意,基本就是一个需求对应一些dto, vo,query bean
  • 不同开发者对于同一个领域的东西有不同的bean,同一个开发者对于相同逻辑的bean,过了几个月,又定义出一个差不多的bean

没有边界

  • 根本没有上下文/边界的概念,比如说店铺会和用户有交互,订单会和用户有交互,通常在DB存储时只会存关联id,然后需要去取对应的名称,其他属性信息。这些信息的获取,有些开发在manager层操作,然后将属性定义到了店铺相关的DTO中;有些放在了service层做。controller/service/manager各个层次都可以调用,没有任何约束。

mvc的演进

按照上述的说明,在一个单体服务中,随着业务的不断迭代,可能会发生什么严重的问题。

举几个真实鲜活的例子

分库分表的例子实体A是我们业务中的一个基础的重要的实体,对应的数据表tableA,一开始业务很简单,只有1个服务,在这个服务里面调用。后来业务扩张了,有十几个服务了,然后十几个服务直接查这个tableA。tableA也扩张成为了tableA,tableB,tableC。有些人觉得代码重复度高了,将mapper/manager层拆成共通的部分打成一个jar包,然后各个微服务中引入这个jar。业务变得更加复杂了,服务扩展到几十个了,tableA数据也有几千万了,这时候要做分库分表了,怎么整。

最后花了差不多1年,涉及十几个团队,才把这个mapper/manager调用改掉,然后做分库分表。

有人可能觉得这个只要在服务拆分时,避免直接调用就可以了,那再举个其他类型的例子。

用户等级的例子

用户的等级,用户的分级是很复杂的,不同的业务阶段有这个不同的定义。比如一开始定义一个字段叫grade的代表用户等级。 然后各个业务都在查这个表的字段grade进行判断,然后产品需要改了,增加了判断必须同时要达到什么条件才能称作等级x。这时候你又得满世界的改了。

DDD的工程架构

那如何运用DDD的思想进行改造呢核心思想:封装领域内的逻辑,统一对外暴露的入口,防止业务逻辑泄露。

  • 在mvc纵向切分的基础上,增加一层领域的横向切分
  • 同一个工程里面,领域之间的调用只能通过domainService,这样可以屏蔽领域内的数据库是如何持久化的,业务逻辑是如何判断的、算法是如何实现的。 service之间可以直接调用。
  • 领域内还是纵向切分,安装mvc分层结构。

上面的只是一个草图,我们真实的结构图比这要稍微复杂些。领域内会区分领域对象,领域服务,基础设施层。这样在领域内进行指责分离,不过从实际的执行过程中领域内的比较细节,执行起来ROI比较低,推荐大家可以先按这套执行。

画外音:估计有些程序员看到这个工程结构变化呵呵一笑,觉得没多大价值,没什么改变必要。

这种工程的结构划分从提出来的到真正被我们团队成员接受的时间周期差不多是8个月。 原因大概是这么几类

  1. 引入新的分层,太复杂了,增加了代码复杂度
  2. 我这块业务很简单,CRUD就行了,没涉及到服务之间的交互。直接mvc一条道走到黑就可以。

如果你看这篇文章也是这种感受,不妨花点时间看下你们业务的代码,看看重复度有多高,看看逻辑有多散乱。你就会明白。

DDD工程的演进

DDD工程的演进也就是服务的拆分了,放到下期讲。

总结

很多DDD的文章都在说传统的编程方式是面试数据库编程,导致对象中只有getter,setter,也就是贫血模型,贫血模型是没有业务逻辑,面向过程设计,不符合面向对象设计原则。

对于这个结论我是同意的,但是对于造成的原因不是很同意。个人认为造成这个原因的主要原因还是在于长期以来的MVC这种模式只有纵向切分导致。如果结合横向切分,有没有DDD也无所谓。这里再引用一下驱动方法不能改变任何事情这段话,如果你能深入理解职责、封装。并随着业务的迭代,不断的重构你的代码,那么你不需要什么DDD,或者其他方法论。

使用职责、封装和组合; 以接口的视角思考,即“人们如何使用我的组件?”; 使用相关技术写好代码,包括可读性、信息性、简洁、自描述,尽量避免显式地使用模式; 有能力回答特定业务的“本质”;“本质”是一个模型,但不意味着类和方法,它意味着回答问题“这个业务如何真正地工作?”

因为这些约束,都是强迫你去思考,去做职责的思考,去做模块的封装。如果你/你团队成员已经领会其中的道理并很好的运用,还需要这些条条框框干吗呢?

下一篇领域与微服务划分,欲知后事如何,请听下回分解。

相关阅读

可落地的DDD(1)-目标讨论

关注【方丈的寺院】,第一时间收到文章的更新,与方丈一起开始技术修行之路

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-05-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 方丈的寺院 微信公众号,前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
试用clusterfuzzlite
clusterfuzzlite是是一种持续的模糊测试解决方案,作为持续集成 (CI) 工作流的一部分运行,比如我们一旦push代码,便可以自动build,之后自动fuzz。
用户1423082
2024/12/31
1960
试用clusterfuzzlite
从研究者的视角看Fuzzing技术发展30年
1988年,在威斯康星大学Barton Miller教授的计算机实验课上(http://pages.cs.wisc.edu/~bart/fuzz/CS736-Projects-f1988.pdf),首次提出Fuzz生成器(Fuzz Generator)的概念,用于测试Unix程序的健壮性,即用随机数据来测试程序直至崩溃。因此,Barton Miller教授也被多数人尊称为"模糊测试之父"。但是,当时更多是为了验证代码质量和程序的稳定性,而非专门用于挖掘安全漏洞,真正用于软件安全漏洞挖掘的开端要从下面两件事说起。
泉哥
2020/02/14
2.5K0
etcd集成持续Fuzzing
作者:Adam Korczynski、David Korczynski、Sahdev Zala
CNCF
2022/03/28
1K0
etcd集成持续Fuzzing
一系列用于Fuzzing学习的资源汇总
本文主要是向大家推荐一系列,用于fuzzing和Exploit开发初始阶段学习的资源合集,其中将包括相关的书籍,课程 - 免费或收费的,视频,工具,教程,以及一些供大家练习使用的靶机应用。(PS:文内所有链接点击“阅读原文”均可查看)
FB客服
2018/07/30
2.3K0
Argo发布fuzzing报告|使用OSS-Fuzz实行安全自动化
作者:Yuan Tang(Akuity)、Adam Korczynski 和 David Korczynski(Ada Logics)、Jann Fischer(Red Hat)、Henrik Blixt(Intuit)
CNCF
2022/03/28
1.1K0
Argo发布fuzzing报告|使用OSS-Fuzz实行安全自动化
Flux项目谈安全:通过Fuzzing增强信心
Flux Security 博客系列的下一篇是我们如何在 Flux 及其控制器中实现 fuzzing(模糊测试),以及如何让项目变得更安全。
CNCF
2022/03/28
5090
Flux项目谈安全:通过Fuzzing增强信心
一些值得学习的Fuzzer开源项目
之前GitHub上有人整理过一个叫Awesome-Fuzzing的资料,整理了关于Fuzzing技术的电子书、视频、工具、教程以及用于练习的漏洞程序。整体上不错,但工具上还是不够全,有些不错且希望阅读代码学习的工具,发现未在其中,因此重新整理出下面这一份资源,其中有些还曾二次开发过,有些是还未来得及学习的,写出来权且当作学习计划。
泉哥
2019/07/18
2.9K0
对微软开源的模糊测试平台OneFuzz的看法
上周微软开源了一款叫OneFuzz的模糊测试平台,主要是由开发团队驱动的可持续模糊测试平台,通过开发与集成项目对应的Fuzzer工具,在CI构建中持续Fuzz,自动化分析跟踪崩溃,告警通知、远程调试与漏洞重现等功能。
泉哥
2020/09/24
1.3K0
对微软开源的模糊测试平台OneFuzz的看法
ClusterFuzz的bot源码(fuzz engine的选择与调度之libfuzzer)阅读
上一次我们选择了fuzz task的代码进行阅读,这次我们进一步深入,看看fuzz engine的选择
用户1423082
2024/12/31
800
ClusterFuzz的bot源码(fuzz engine的选择与调度之libfuzzer)阅读
关于Fuzzing模糊测试入门原理及实践的讨论
"The best alternative to defense mechanisms is to find and fix the bugs."
王驭停
2021/09/19
3.7K0
关于Fuzzing模糊测试入门原理及实践的讨论
洞察与思考Fuzzing技术发展趋势
近年来,Fuzzing无疑是漏洞挖掘技术中最热门常见的技术之一,代码覆盖引导的思路成为主流,随之发展起来的各种路径探索技术也应运而生,相关话题的论文也常见于学术与工业顶会上,相信未来几年仍将继续活跃在安全领域之上。笔者日常也多有关注,基于个人的一些洞察与思考,对Fuzzing未来的发展趋势作个简单总结,因个人水平有限,皆为一家之言,仅供参考。
泉哥
2021/11/02
1.3K0
Linkerd引入了fuzz测试
在过去的几个月里,Ada Logics[1]的团队一直在努力将模糊测试引入到Linkerd 的 Rust 代理[2]。这些 fuzz 测试现在通过谷歌的OSS-Fuzz[3]服务在 Linkerd 上持续运行,为全球 Linkerd 用户提供了另一层安全保障。总的来说,fuzzing 被集成到代理的 7 个依赖项以及代理本身中,其中 5 个项目现在正在 OSS-Fuzz 上持续运行。
CNCF
2021/05/27
4580
Linkerd引入了fuzz测试
libfuzzer 文档
就是变异,覆盖率那些都给你做好了,你只需要定义LLVMFuzzerTestOneInput,将编译的数据喂给要fuzz的目标函数就行
用户1423082
2024/12/31
1180
云原生模糊测试:Istio - 40 次崩溃和高严重性 CVE
在这篇博文中,我们将深入介绍我们为设置 Istio 的连续模糊测试所做的工作。这项工作是与 Istio 维护人员和 Google 开源安全团队合作完成的。
Khan安全团队
2022/02/25
1.1K0
Gitlab的“DevSecOps发展蓝图”概览
印象中,Gitlab作为Github的竞品,是一款“仓库管理系统”。但,士别三日,当刮目相看。
用户1713112
2019/06/20
1.8K0
Gitlab的“DevSecOps发展蓝图”概览
ClusterFuzz的bot源码(fuzz task)阅读
之后执行中的src/local/butler/run_bot.py中的execute
用户1423082
2024/12/31
520
Istio公布2022年安全审计结果
Istio 是平台工程师信任的一个项目,用于在其 Kubernetes 生产环境中实施安全策略。我们非常关注代码的安全性,并维护一个健壮的漏洞管理程序[2]。为了验证我们的工作,我们定期邀请项目的外部审查,我们很高兴地公布我们的第二次安全审计的结果[3]。
CNCF
2023/02/12
4160
Istio公布2022年安全审计结果
libprotobuf-mutator学习
Protocol Buffers是一种序列化数据结构的协议。他是Google的开发的,而且与语言无关,与平台无关的可扩展机制,用于对结构化数据进行序列化(例如XML),但更小,更快,更简单。您定义要一次构造数据的方式,然后可以使用生成的特殊源代码轻松地使用各种语言在各种数据流中写入和读取结构化数据。
用户1423082
2024/12/31
630
libprotobuf-mutator学习
本地使用ClusterFuzz
修改./local/install_deps_linux.bash中的 bower install 为bower install --allow-root(因为bower install的时候默认不允许root用户)
用户1423082
2024/12/31
1400
本地使用ClusterFuzz
“安全需要每个工程师的参与”-DevSecOps理念及思考
多年来,软件开发以及其引发的信息安全领域总是相生相伴地持续发展。安全领域一直在适应软件研发的流程和模式,为研发出更加安全的系统保驾护航。最近几年,国内越来越多的人开始提及以及实践DevOps的研发模式。腾讯内部以腾讯CI、k8s等为代表的DevOps平台不断发展和完善,也有越来越多的业务开始尝试使用这种研发模式。伴随着DevOps在公司内的快速发展,研发安全保障的思维和技术也需要不断演化发展,其中一个重要的思想就是DevSecOps,它完全遵循DevOps的思想,将安全无缝集成到其中,使之升级成为DevSecOps。亚马逊首席技术官、副总裁Werner Vogels也在腾讯公司主办的第五届互联网安全领袖峰会(CyberSecurity Summit2019,简称CSS2019)上重点讲了DevSecOps的议题,指出“不仅仅是安全团队,所有人都应该加入到其中,我们要有将安全纳入战略思考的思维”。
腾讯安全应急响应中心
2020/05/14
1.3K0
“安全需要每个工程师的参与”-DevSecOps理念及思考
相关推荐
试用clusterfuzzlite
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验