Su的技术博客

  • 首页
  • 原创
  • 视频
  • Java
  • MySQL
  • DDD
  • 事故复盘
  • 架构方案
  • AI
  • Other
  • 工具
    • AI工具集
    • 工具清单
    • JSON在线格式化
    • JSON在线比较
    • SQL在线格式化
  • 打赏
  • 关于
路很长,又很短
  1. 首页
  2. 架构方案
  3. 正文
                           

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

2023-09-03 1162点热度 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. 7. MVC及其变种(译)
  2. 9.包和命名空间(译)
  3. 2.软件架构预述(译)
  4. 6.分层架构(译)
  5. 大家一直在谈的领域驱动设计(DDD),我们在互联网业务系统是这么实践的
  6. 殷浩详解DDD 第四讲:领域层设计规范
  7. 殷浩详解DDD系列 第二讲 - 应用架构
  8. 设计模式在外卖营销业务中的实践
  9. 4.架构风格 vs. 架构模式 vs. 设计模式(译)
  10. 8. EBI 架构(译)
标签: 组件 架构 单体架构 模块
最后更新: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
取消回复

广告
文章目录
  • 模块化软件开发
  • 组件化软件开发
  • 现代的单体
  • 反模式:大泥球/意大利面架构
  • 引用来源
最新 热点 推荐
最新 热点 推荐
视频笔记:微服务架构P4 设计模式:每服务数据库、API 网关和事件驱动架构 干货 | 论Elasticsearch数据建模的重要性 马蜂窝消息总线——面向业务的消息服务设计 基于 MySQL Binlog 实现可配置的异构数据同步 视频笔记:Google发布Agent2Agent协议 视频笔记:什么是微服务,为什么是微服务? 视频笔记:什么是AI 智能体? 视频笔记:什么是Flink?
Elasticsearch 使用误区之六——富文本内容写入前不清洗基于 MySQL Binlog 实现可配置的异构数据同步马蜂窝消息总线——面向业务的消息服务设计视频笔记:微服务架构P4 设计模式:每服务数据库、API 网关和事件驱动架构干货 | 论Elasticsearch数据建模的重要性你可以不用RxJava,但必须得领悟它的思想!如何秒级实现接口间“幂等”补偿:一款轻量级仿幂等数据校正处理辅助工具视频笔记:什么是Flink?
Properties配置文件中保存中文解决办法 一次误删除MySQL主库的恢复操作 系统设计:边界与封装 - 视频总结 二级缓存架构极致提升系统性能 图解Git Kafka为什么要去掉ZooKeeper?一文了解Kafka 中 ZooKeeper 的演变过程 云音乐贵州机房迁移总体方案回顾 马蜂窝消息总线——面向业务的消息服务设计

CRUD (1) Event Sourcing (1) graphql (1) id (1) NoSQL (1) quarkus (1) rest (1) RocketMQ (2) Spring Boot (1) zk (1) zookeeper (1) 上下文 (1) 事务消息 (1) 二级缓存 (1) 值对象 (1) 关系数据库 (1) 分布式缓存 (1) 原子性 (1) 唯一ID (1) 商品 (1) 多对多 (1) 子域 (1) 字符集 (1) 客户端心跳 (1) 幂等 (2) 干货 (1) 并发 (1) 应用场景 (1) 应用架构图 (1) 康威定律 (2) 异步复制 (1) 微服务架构 (3) 总体方案 (1) 技术方案 (2) 技术架构 (2) 技术架构图 (1) 技能 (1) 持续集成 (1) 支撑域 (1) 故障恢复 (1) 数据架构图 (1) 方案选型 (1) 日记 (1) 服务发现 (1) 服务治理 (1) 服务注册 (2) 机房 (1) 核心域 (1) 泄漏 (1) 洋葱架构 (1) 消息队列 (5) 源码剖析 (1) 灰度发布 (1) 熔断 (1) 生态 (1) 画图工具 (1) 研发团队 (1) 线程 (2) 组织架构 (1) 缓存架构 (1) 编码 (1) 视频 (19) 读写分离 (1) 贵州 (1) 软件设计 (1) 迁移 (1) 通用域 (1) 集群化 (1) 雪花算法 (1) 顺序消息 (1)

推荐链接🔗
  • AI工具集
  • 工具箱🛠️

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

Theme Kratos Made By Seaton Jiang

粤ICP备15033072号-2

x