(转)5、单体架构

2023-05-16

翻译转帖

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

这篇文章是软件架构编年史的一部分, 这是一系列关于软件架构的文章。在它们中,我写了我在软件架构方面学到的东西,我如何看待它,以及我如何使用这些知识。如果您阅读本系列之前的文章,这篇文章的内容可能会更有意义。

一开始,有巨石…… 

构建单体应用一直是默认的架构风格。我的意思是,一开始我们每个应用程序有一个文件,然后我们开始有包含多个文件的应用程序,直到 1990 年代我们才开始看到由其他应用程序组成的应用程序(尽管第一次实验是在 1980 年代)。

巨石本身是进化而来的。当开始使用多个文件构建应用程序时,没有太多关于它们的推理,也没有很大的必要性,因为应用程序相对简单。随着应用程序变得越来越大和越来越复杂,需要在创建什么文件以及如何将它们关联的背后进行一些推理。

模块化软件开发

模块化编程是 1960 年代后期和 1970 年代提出的解决方案。这是从类到更粗粒度的代码单元显式定义的演变。编程语言以不同级别的显式实现模块化。

例如,JAVA 具有defaultpublic 的类级别可见性,其中default级别表示类仅在其包(模块)中可见,而public表示该类在其包(模块)内外可见。这允许我们定义包的客户端应该使用哪些类。

组件化软件开发

另一种模块化风格是组件。正如我在之前的一篇博文中解释的那样,组件是在考虑领域概念的情况下创建的模块。它们是理想的独立“应用程序”,可用于创建复合应用程序。如果管道和过滤器体系结构在 Unix 系统中广泛使用,并且允许我们执行诸如“ ps -ef | grep php ”。另一个例子是使用微服务作为复合应用程序的组件,如 Netflix。

这种代码组织方式也已经存在很长时间了,可以追溯到 1960 年代后期,就像模块化软件开发一样。

现代单体

如今,拥有单体架构风格只是意味着所有应用程序代码都作为单个进程在单个节点上部署和运行。我们假设它正在使用模块和组件,尽管实际上通常并非如此。

理解为什么这里的关键词是“部署”和“节点”很重要。关于第一个,已部署,这意味着如果将代码组织在一个或多个存储库中,它的物理存储位置并不重要,重要的是它在运行时如何组织。关于第二个关键字node,这意味着如果我们将应用程序部署到多个服务器,它仍然是一个整体,就像在水平扩展上下文中一样。

在单节点服务器中,单体应用中的所有模块都组装到同一个内存映像中,该映像在单个节点上作为单个进程运行。通信是通过相同的堆栈和堆通过标准过程调用完成的。单个内存映像使应用程序成为整体。如果你在不同的进程中运行模块,你就是在做 IPC。由于模块属于不同的进程边界,您将开始面临分布式计算挑战。这正在进入微服务领域。(感谢您的反馈,  _dban_)

这种风格虽然名声很差,但即使对于大型应用程序也能很好地工作。只有当我们需要时,它才会变得足够好:

  • 不同域组件的独立可扩展性
  • 不同的组件或模块要用不同的编程语言编写;
  • 独立的可部署性,可能是因为我们的发布率高于部署管道可以处理的一个代码库,导致一个版本的部署缓慢,因为它需要等待其他版本的部署,甚至导致部署队列增长速度快于消耗。

在这一点上,我们需要以 SOA 架构风格将我们的单体应用分离到不同的应用程序中(更多内容在后续文章中)。

反模式:大泥球 / Spaghetti Architecture

“大泥球”,AKA Spaghetti Architecture,是这种风格的反模式,其中包结构和关系不明确,结构内聚和封装不存在或很小,依赖不遵循规则,非常难以推理子系统、进行更改和重构。该系统是不透明的粘稠的脆弱的僵硬的:一个大泥球

来源

1997 年——布赖恩·富特、约瑟夫·尤德——大泥球

2012 年 – Len Bass、Paul Clements、Rick Kazman – 实践中的软件架构

2017 – Herberto Graça – 微服务架构:大师们怎么说

2017 – Herberto Graca – 软件架构前提

2017* – 维基百科 – 模块化编程

2017* - 维基百科 - 基于组件的软件工程

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

(转)5、单体架构 的相关文章

  • Qt中unicode转utf-8

    最经在研究AT指令接受短信 xff0c 短信是unicode编码 xff0c 接受后需要根据系统的编码方案进行相关的转码 比如接受到了一串字符4F60597D xff0c 它是 你好 的unicode编码 xff0c 一个unicode编码
  • 移植qt5.3.1到arm

    最近刚入手一款开发板 比较低端 刚毕业工作还没一个月 穷屌丝一个 在学校以前都是用的是Friendly Arm的6410 使用的qt版本是使用的最多的4 7 0版本 入手的板子是4 7 4 qt5出来也有好长的时间了 其中提供了很多的特性
  • Linux下生产者与消费者的线程实现

    代码见 现代操作系统 第3版 为了显示效果 xff0c 添加了printf 函数来显示运行效果 1 include lt stdio h gt 2 include lt pthread h gt 3 define MAX 20 4 pthr
  • 基于TCP协议的视频传输

    这个程序是为了大二上学期一个设计作业 xff0c 写的太水 xff0c 之前也发过 xff0c 那个不是最新版 xff0c 这个找到了可能是最新版的 xff0c 昨晚调试了下 xff0c 没用 xff0c 是一个itcol的函数操作无效 x
  • 使用nginx作为websocket的proxy server

    WebSocket WebSocket协议为创建客户端和服务器端需要实时双向通讯的webapp提供了一个选择 其为HTML5的一部分 WebSocket相较于原来开发这类app的方法来说 其能使开发更加地简单 大部分现在的浏览器都支持Web
  • 前后端分离开发部署模式

    身体出了点小毛病 xff0c 这周基本在家养病 xff0c 转文章一篇 xff0c 以激励学习 在开始讨论这个话题之前我们先来认识一下传统的开发模式 一 传统开发模式 相信很多做过Web开发童鞋应该都会经历这样一种开发模式 xff0c 利用
  • I2C总线协议

    毕业设计中使用到了AT24C04器件 xff0c 其是Ateml公司出品的 xff0c 是一种低功耗CMOS串行EEPROM xff0c 其使用两线串行的总线和控制器进行通讯 其内部保存的数据在掉电的情况下可以有40年以上的有效期 其采用8
  • Spark--用Java开发微服务

    这个说的Spark不是apache的Spark xff0c 这边说的是一个java的web application的框架 官网 http sparkjava com 我做过一段时间的后台架构开发 xff0c 使用的是微服务架构 xff0c
  • MQTT协议与mosquitto的安装使用

    MQTT xff08 Message Queuing Telemetry Transport xff0c 消息队列遥测传输 xff09 是一种标准化的发布 订阅消息传输协议 它是一种非常轻量级的协议 xff0c 由于对带宽需求很低 xff0
  • Linux 文件锁

    在文已经共享的情况下如何操作 xff0c 也就是当多个进程同时操作同一个文件时 xff0c 我们怎么保证文件数据的正确性 linux通常采用的方法是文件上锁 xff0c 来避免共享资源的产生竞争状态 文件锁包括建议性锁和强制性的锁 建议性的
  • 基于qt的多线程视频采集与传输

    将服务端的设备虚拟化 xff0c 供客户端调用 使用TCP IP协议传输 xff0c 使用V4L2实现视频采集 只是实现了简单的功能 资源占用大 xff0c 线程的终结还有问题 xff0c 数据大 xff0c 不知道用什么技术压缩图片 这是
  • Qt元对象系统和模板机制的冲突

    Qt元对象系统是对为了Qt对象类型和信号与槽机制引进的 xff0c Qt的工具包中有一个元对象编译器 xff0c 它是为支持Qt元对象系统而产生一些额外C 43 43 代码 xff0c 这些编码会和源码一起被标准的C 43 43 编译器编译
  • qwt学习一

    学习这个东西方向对了 xff0c 就对了一半 今天我开始学习基于qt库的一个开源的绘制2维的统计图的库 qwt 我们画东西首先要有一个容器 xff0c 不然都是徒劳 xff0c 今天我们就介绍这个类 QwtPlot 它继承自QFrame和Q
  • vs自动对齐快捷键

    vs里的行间距和字间距不是c语言的格式解决办法 xff1a 自动对齐 xff1a 方法一 xff08 部分对齐 xff09 xff1a 用鼠标选中要对齐的区域 xff0c 按Crtl 43 K 43 F 方法二 xff08 全部对齐 xff
  • Ubuntu1804编译QWebEngine

    编译环境 Ubuntu1804 43 Qt5 13 2在终端命令框转到qtwebengine源码路径 cd opt Qt5 13 2 5 13 2 Src qtwebengine 执行qmake xff0c 并增加编译参数 opt Qt5
  • 【CSharp + JSON】序列化与反序列化基类集合中的子类对象

    1 测试数据结构 span class token keyword public span span class token keyword interface span span class token class name IPerso
  • iOS开发 富文本加载html代码 (swift版本)UITextView 设置不允许选中,允许链接跳转

    记录iOS 添加 支持html 富文本展示 xff0c 针对隐私政策更新弹框效果展示 xff1a ps 修改 link 属性的颜色 textView linkTextAttributes 61 NSAttributedString Key
  • Arrays用法总结

    数组转字符串 span class hljs keyword int span span class hljs built in array span 61 span class hljs keyword new span span cla
  • 在anaconda中为jupyter安装扩展Nbextensions插件

    1 在开始菜单中 xff0c 以管理员身份打开Anaconda Prompt xff0c 否则安装的时候会提示没有写权限 2 执行安装命令 xff0c 提示是否继续的时候 xff0c 输入y conda install c conda fo
  • ElasticSearch系列(四)--springboot使用ElasticsearchRestTemplate整合ElasticSearch,实现文本高亮检索

    前言 ElasticsearchRestTemplate是spring data elasticsearch项目中的一个类 xff0c 和其他spring项目中的template类似 网上的学习资料大都是基于ElasticsearchTem

随机推荐

  • Activemq 的topic总结

    一 activemq 使用队列 spring boot集成ActiveMQ 简单的队列和 JmsMessagingTemplate 可以参考这个 http blog csdn net zhangjq520 article details 5
  • systemctl服务部署错误:code=exited, status=217/USER

    卸载重装 xff0c 搞定了 xff0c 卸载要彻底 xff0c 参考链接https www cnblogs com nicknailo articles 8563456 html 问题描述 xff1a 在用Linux安装mysql时报错
  • 捕获并打印程序日志信息的方法(Qt)

    工作中为了方便调试 xff0c 常常需要加入一些打印 常用 Qt 中的 QDebug QWarning xff0c C 和 C 43 43 中的 printf cout 等等 xff0c 又或者是三方库提供的标准打印接口 大部分时候 xff
  • 关于华硕X205TA安装Linux操作系统的问题

    便携 廉价 续航长 键盘手感好成为很多人选择华硕这款上网本的最好理由 对于我而言 xff0c Atom Z3735F加上2G内存用来跑跑编辑器 浏览网页 整理文件是完全够用了 由于刚好需要学习学习Linux操作系统 xff0c 我设置好BI
  • 形参与实参

    形参变量 xff1a 形参变量是功能函数里的变量 xff0c 只有在被调用的时候才分配内存单元 xff0c 调用结束后立即释放 所以形参只在函数内部有效 实参变量 xff1a 实参可以是常量 xff0c 变量 xff0c 表达式 xff0c
  • 岁月划过生命线(我的2013-大二.上)

    岁月划过生命线 大二 上 又一次大清早被红马甲查赶出被窝 xff0c 让哥光着屁股就跑到隔壁宿舍去了 xff0c 真心恨死他们 这是一篇最早写于 2013 11 26 日的日志 xff0c 通过后来不断地增删改 xff0c 来总结 xff0
  • 前端与产品经理配合

    产品经理PM职业介绍 如何构建原型图 axure软件
  • 如何分析算法的运行时间(以插入排序为例)

    一个算法在特定输入上的运行时间是指执行的基本操作或步数量 简单来说就是执行每行 xff08 xff09 伪代码所需演的时间 xff08 xff09 接下来看下面这段伪代码 行代码代价次数1for j 61 2 to A lengthn2ke
  • org.mybatis.spring.MyBatisSystemException ResultMap、ResultType、ParameterMap、ParameterType

    报错信息 xff1a org mybatis spring MyBatisSystemException nested exception is org apache ibatis reflection ReflectionExceptio
  • 生产者与消费者问题(C语言 超详细全)小白可入

    include lt stdio h gt include lt pthread h gt pthread create 函数的头文件 include lt windows h gt sleep的头文件 define N 10 define
  • 深入理解Spring的@Order注解和Ordered接口

    前言 Spring的 64 Order注解或者Ordered接口大家都知道是控制顺序的 xff0c 那么它们到底是控制什么顺序的 xff1f 是控制Bean的注入顺序 xff0c 还是Bean的实例化顺序 xff0c 还是Bean的执行顺序
  • Ubuntu开机无桌面图标

    新安装了Ubuntu 16 04 xff0c 执行 sudo apt span class token operator span get update sudo apt span class token operator span get
  • centos7 无法启动网络(service network restart)错误解决办法

    centos7 无法启动网络 service network restart 错误解决办法 以下方法均为网上COPY 同时感谢原博主分享 systemctl status network service 出现以下错误 rtnetlink a
  • Android项目中@BindView的使用

    Android项目中 64 BindView的使用 第一步 xff1a 添加依赖 找到项目Android项目中的Build gradle xff0c 可以看到项目中有两个这样的文件 xff0c 那么我们要添加的依赖是在build gradl
  • FSL 处理大脑图像(预处理)

    一 TBSS处理数据大致流程 1 经过mriconvert转换之后 xff0c 得到每个被试的4D数据 xff0c b值以及向量 2 fslroi data nodif 0 1 choose a no weighted imaging na
  • 使用C语言编写程序,求10个整数中的最大值

    分析 xff1a 首先我们看到十个整数的时候就知道要 int ar 10 xff0c 这十个数字我们可以直接初始化 xff0c 这里我们用scanf初始化数组 注意下面我是怎么操作的 那么怎么找最大的那一个呢 xff1f 办法有很多 xff
  • 【数学】Frobenius范数

    Frobenius范数简称F范数 xff0c 这个范数是针对矩阵 而言的 xff0c 具体定义可以类比向量的L2 范数 简单来说就是矩阵的每个元素的平方和的开方
  • WinRAR分析

    1 xff0e 样本概况 1 1 应用程序信息 应用程序名称 xff1a WinRAR 6 11 0 MD5值 xff1a F2BD2E3D8B7C7C8EEFA2B28E3280EDA3 SHA1值 xff1a DC2B378B27D1A
  • IntelliJ IDEA License server激活(破解)

    打开idea xff0c 通过help gt Register xff0c 可以看到弹出的对话框 xff0c 选择License server 然后输入address xff1a http idea iteblog com key php
  • (转)5、单体架构

    翻译转帖 原文链接 https herbertograca com 2017 07 31 monolithic architecture 这篇文章是软件架构编年史的一部分 xff0c 这是一系列关于软件架构的文章 在它们中 xff0c 我写