文章已收录至https://lichong.work,转载请注明原文链接。 ps:欢迎关注公众号“Fun肆编程”或添加我的私人微信交流经验🤝

简介

互联网后微服务时代,软件质量是一个非常让人头疼的问题,而DDD(Domain-Driven Design)被认为是系统老化问题的新希望。众多互联网大厂都在积极推行DDD的落地实践。而对IT程序员,尤其对于高级职位,DDD成了一个越来越重要的技能加分项。 但是DDD只是一套庞大的理论体系,非常多复杂的基础概念成了学习DDD不小的门槛。并且DDD如何落地,目前整个业界都还在一个摸索的阶段。 本文以通俗易懂的风格给大家介绍DDD,降低DDD的学习门槛,尽量在实战中尝试将DDD进行落地。

思考

如何提高软件质量?

  1. 单体架构阶段,注重封装,在不同项目中共性的内容抽象为公共模块
  2. 微服务架构阶段,注重封装与扩展之间的平衡,但是开发人员对业务的理解很多时候是跟不上业务的变化的,经过若干次的迭代,复杂多变的业务足以摧毁前期的设计模式
  3. 直到后微服务架构阶段,业务复杂,敏捷当道,某一个小的隐患就会逐渐滚雪球,将整个项目拖成一个大平台最终难以维护

举例: 我们做个一个商品详情页面,为了提高性能支持秒杀设计了懒加载和页面静态化。随后的迭代开发过程中引入了团购、套餐、活动、预售等等的需求,完成这些需求的过程中后面进来的新人已经不知道前面成堆的代码是怎样的设计了,为了完成功能在页面上引入了ajax从而动态修改价格,后面维护的人也陆陆续续的开始使用ajax从而拖垮系统。

如何防止系统变老?

  • 新系统开发时:做充分的设计、使用最先进的技术、考虑非常多的后期维护场景,仅仅五六个人就能开发出来非常优秀的有创新有竞争的系统。
  • 迭代一段时间后:沟通难(产品提出来简单的需求,结合到系统中时增加了复杂度,产品和开发内耗严重)、开发难(上千行代码的类,之前代码有什么用也不知道)、测试难(没办法单元测试,一个小需求还得回归测试)、创新难(系统背负的技术栈繁多,且代码耦合严重)。

传统MVC架构做设计时习惯于从数据库ER图开始,之后向下维护数据库表,向上设计POJO(贫血模型),有了贫血模型数据实体之后再向上去梳理业务结构,这时候就会开始面向过程方式去编程(事务脚本),这种贫血模型+事务脚本业内戏称为Dada Driven Design。在简单场景下这种架构模式有着短频快速的优点,而且只要ER图确定之后,之后扔给研发去开发其实就大差不差了。 但是,将上述Dada Driven Design模式应用在大型项目中时会造成庞大复杂的事务脚本!

当然现在也有一些方案去优化事务脚本(比方说静态代码检查,利用阿里巴巴开发规范,sonar等),这些方案的真正目的是想要把软件设计的过程分散到每个迭代的过程中,逼得团队成员在每次迭代过程中不得不引用一些设计模式优化代码结构,而不要把架构问题、代码膨胀问题集中到某几次的迭代过程中从而引发需求失控只能重构。 但是,真实的开发过程中,很多设计成了摆设,既起不到作用,还增加了程序复杂度!!!例如上面例子中的页面静态化设计,后期迭代过程中引入了ajax,这个设计就成了过度设计,其实过度设计在项目中总会存在的,我们也没办法去回避这个问题!

因此,这种传统的Dada Driven Design不可避免的会造成系统老化问题。

再思考:

  • 微服务如何拆分?
  • 微服务如何扩展?
  • 微服务如何做到“高内聚低耦合”?
  • 微服务在后续长时间迭代过程中业务逐渐复杂后怎样保证质量?
  • 微服务项目如何控制成本?
  • 企业中台怎样规划?

现在: DDD提供了一整套完整的理论体系解决这些问题,但是缺乏落地实践经验,他不像微服务有成整套的框架体系(例如Spring Cloud),这也造成使用DDD的过程中非常容易走型,一旦走型项目会变得更加混乱。ok,后续文章我会带着问题结合实战来看下DDD是怎样解决这些问题的。

鸣谢

图灵学院-楼兰老师 这个专栏课程我是再看了楼兰老师课程后的二刷总结,一是希望帮助自己巩固学到的内容,二是希望总结能够记录下来帮助到自己和他人。 最后,感谢楼兰老师。

文章已收录至https://lichong.work,转载请注明原文链接。 ps:欢迎关注公众号“Fun肆编程”或添加我的私人微信交流经验🤝

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~往期精选🪶~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

【前端-开发环境】使用NVM实现不同nodejs版本的自由切换(NVM完整安装使用手册) 【前端-NPM私服】内网使用verdaccio搭建私有npm服务器 【前端-IE兼容】Win10和Win11使用Edge调试前端兼容IE6、IE7、IE8、IE9、IE10、IE11问题 【工具-Shell脚本】java程序产品包模板-linux和windows通用shell启动停止脚本(无需系统安装Java运行环境) 【工具-Nginx】从入门安装到高可用集群搭建 【工具-Nginx】Nginx高性能通用配置文件-注释版-支持防刷限流、可控高并发、HTTP2、防XSS、Gzip、OCSP Stapling、负载、SSL 【工具-WireShark】网络HTTP抓包使用教程 【后端-maven打包】通过profile标签解决同时打jar包 war包需求 【后端-SpringCache】基于Spring Cache封装一个能够批量操作的Redis缓存记录下踩坑历程(pipeline或mget封装) 【后端-SkyWalking】SkyWalking前后端开发环境搭建详细教程步骤-6.x/7.x/8.x版本通用-插件二次开发利器(一) 【后端-Quartz】Springboot整合Quartz支持集群环境-设计业务与框架分离及实现定时任务调度

✨欢迎为耿直少年点赞、关注、收藏!!!

👇👇👇