Su的技术博客

  • 首页
  • Java
  • MySQL
  • DDD
  • 事故复盘
  • 架构方案
  • AI
  • Other
  • 工具
  • 打赏
  • 关于
路很长,又很短
  1. 首页
  2. 架构方案
  3. 正文
                           

【组件】5.单体架构(译)

2023-09-03 47点热度 0人点赞 0条评论

 

这篇文章是软件架构编年史(译)的一部分,这部编年史由一系列关于软件架构的文章组成。在这一系列文章中,我将写下我对软件架构的学习和思考,以及我是如何运用这些知识的。如果你阅读了这个系列中之前的文章,本篇文章的的内容将更有意义。

混沌初开,单体始现...

默认的架构风格就是构建一个单体。我的意思是,最开始应用程序就只有一个文件,然后应用程序开始由多个文件组成,从 20 世纪 90 年代开始才出现由其它应用程序组成的应用(尽管20世纪80年代就开始了最初的尝试)。

单体自己也在发生变化。当应用程序开始使用多个文件创建时,其实并没有太多的思考,也没有太多思考的必要,因为应用程序都相当简单。当应用程序开始膨胀变得越来越复杂时,才会需要推敲应用程序背后有哪些文件需要创建,它们又该如何关联。

模块化软件开发

模块化编程是 20 世纪 60 年代末到 70 年代间提出的方案。它是从类到更粗粒度代码单元的明确定义的进化。编程语言使用不同等级的明确性来实现模块化。

例如,JAVA 在类这个层级的可见性有默认级别和 public 级别,默认级别意味着类只在它所属的 package (模块)内可见,而 public 级别意味着这个类在 package (模块)内和 package (模块)外都可见。

组件化软件开发

组件是另一种模块化风格。如我之前一篇文章(译)所述,组件是按照领域概念划分的模块。理想情况下,它们是可以组成应用的独立的“应用程序”。老生常谈的例子是在 Unix 系统中广泛使用的管道和过滤器架构,例如我们可以使用这样的命令ps -ef | grep php。另外的例子就是 Netflix 将微服务作为应用的组件。

代码的组织风格和模块化软件开发一样,早在 20 世纪 60 年代末就已经存在了。

现代的单体

现在,单体架构风格就是简单地意味着所有应用代码被部署并运行在单一节点的单一进程中。我们认为它会用到模块和组件,尽管事实往往并非如此。

这里有两个关键词“部署”和“节点”要好好地理解。第一个词“部署”的意思是运行时代码的组织方式,无论代码在物理上是存储在一个还是多个代码库之中。而第二个词“节点”的意思是即便是在横向扩展的情况下我们将应用部署到了多个服务器,它依然是一个单体。

在单一节点的服务器上,单体的所有模块都被集中到同一个内存映像里,作为单一节点上的单个进程运行。通过标准进程调用在同一个栈和堆内进行模块间的通信。单个的内存映像让应用变成了单体。如果模块在不同的进程中运行,通信就变成了 IPC (进程间调用)。由于模块进入了不同的进程边界,你将要面临分布式计算的挑战。这就进入了微服务的范畴。(感谢dban的反馈)。

尽管这种风格声名狼藉,但它依然可以在大型应用中工作得很好。只是下面这些条件下表现得不足够好:

  • 不同的领域组件需要独立可伸缩;
  • 不同的组件需要不同的编程语言来编写;
  • 独立可部署,因为我们的发布频率比一个代码库的持续交付流水线要快,由于需要等待其它发布的部署导致自身发布的部署变慢,或者导致部署队列增长太快无法及时响应。

这时,我们需要将单体按照面向服务的架构风格(接下来的文章中将详细介绍)拆分成不同的应用程序。

反模式:大泥球/意大利面架构

5.单体架构(译)

“大泥球”又称意大利面架构,是这种风格的反模式。这种反模式中,包结构和关系十分模糊,结构化的内聚和封装完全没有或极少,依赖毫无规则,子系统很难分辨,也很难修改和重构。系统晦涩、粘滞、脆弱、僵化:就是一个大泥球!

引用来源

1997 – Brian Foote, Joseph Yoder – Big Ball of Mud
2012 – Len Bass, Paul Clements, Rick Kazman –Software Architecture in Practice
2017 – Herberto Graça – Microservices architecture: What the gurus say about it
2017 – Herberto Graca –Software Architecture Premises
2017* – Wikipedia –Modular programming
2017* – Wikipedia –Component-based software engineering

 

原文:https://herbertograca.com/2017/07/31/monolithic-architecture/

 

本文仅供学习!所有权归属原作者。侵删!文章来源:作者 https://www.jianshu.com/p/28c3439c11d3

更多文章:

  1. 殷浩详解DDD 第四讲:领域层设计规范
  2. 设计模式在外卖营销业务中的实践
  3. Spring事务无法生效的11个场景
  4. Go整洁架构实践
  5. 手把手教你实战TDD
  6. DDD系列第五讲:聊聊如何避免写流水账代码
  7. 2.软件架构预述(译)
  8. 殷浩详解DDD 第三讲 - Repository模式
标签: 组件 架构 单体架构 模块
最后更新:2023-09-03

coder

分享干货文章,学习先进经验。

打赏 点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

文章目录
  • 模块化软件开发
  • 组件化软件开发
  • 现代的单体
  • 反模式:大泥球/意大利面架构
  • 引用来源
最新 热点 推荐
最新 热点 推荐
单体分层应用架构剖析 MySQL事务死锁问题排查 浅谈DDD中的聚合 高并发场景下JVM调优实践之路 ChatGPT的探索与实践 生产环境的CMS垃圾回收,一定要这样配置参数
Log4j框架疯狂写日志,导致磁盘打满问题排查高并发场景下JVM调优实践之路3.编程语言的演化(译)4.架构风格 vs. 架构模式 vs. 设计模式(译)5.单体架构(译)6.分层架构(译)
ElasticSearch之各大版本演进,发布8.0.0 Alpha 2版本 《解构领域驱动设计》读书笔记 笔记08 | 搜狗面试题:IO多路复用之select、poll、epoll的区别 JAVA字节码增强解密(上) 笔记 | 面试官问我高并发的问题:并发编程的三大挑战 浅析设计模式4——模板方法模式

AIGC (1) BASE (1) bigkey (1) CAP (1) codeium (2) Copilot (2) hotkey (1) inject (1) jar包 (1) mvc (1) OOP (1) UML (1) vivo (2) 事务隔离级别 (1) 人工智能 (2) 代码质量 (1) 低耦合 (1) 依赖倒置原则 (1) 六边形架构 (1) 分层架构 (3) 分布式事务 (1) 分页 (1) 单体架构 (2) 可复用性 (1) 可读性 (1) 合同 (1) 后端开发 (1) 命名 (1) 四色建模法 (1) 垃圾回收器 (1) 开源 (1) 性能调优 (4) 智能助手 (1) 架构模式 (1) 架构设计 (4) 架构风格 (1) 模块 (1) 死锁 (1) 物流 (1) 系统架构 (4) 缓存穿透 (1) 缓存雪崩 (1) 编程助手 (3) 编程技能 (1) 编程语言 (2) 聚合 (1) 软件工程师 (1) 软件架构 (2) 驱动升级 (1) 高内聚 (1)

COPYRIGHT © 2014-2023 verysu.com . ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

粤ICP备15033072号-2