5.单体架构(译)

作者: qinyu | 来源:发表于2018-09-20 10:42 被阅读48次

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

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

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

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

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

模块化软件开发

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

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

组件化软件开发

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

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

现代的单体

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

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

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

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

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

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

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

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

引用来源

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

相关文章

  • 5.单体架构(译)

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

  • Spring Cloud学习day95:Spring Cloud

    一 、微服务架构介绍 1.单体架构: 单体架构也称之为单体系统或者是单体应用。就是一种把系统中所有的功能、模块耦合...

  • 1. springcloud - 微服务架构一站式解决方案

    1. 微服务架构的特点 1.1 理解微服务 软件架构经理了从单体架构、垂直架构、SOA架构到微服务架构的过程 单体...

  • SpringCloud前置知识+RabbitMQ

    一、微服务架构介绍 1.单体架构 ​ 单体架构也被称为单体应用,它是将所有的功能模块全部耦合在一个项目...

  • 分布式架构基本理论

    分布式架构vs单体式架构 分布式架构是不可逆的潮流,分布式相比于单体式架构,解决了系统容量和系统可用的问题。 单体...

  • 微服务

    1.1 软件架构的演进: |-- 单体架构 |-- SOA架构 ...

  • SpringCloud前置知识+RabbitMQ

    一、微服务架构介绍 1.单体架构 ​ 单体架构也被称为单体应用,它是将所有的功能模块全部耦合在一个项目中 1.1 ...

  • 软件架构更迭经历了哪三个时代?简要对比三个时代的软件架构优势及劣

    单体架构基于ESB(企业服务总线)的SOA架构 互联网技术发展的必然产物微服务架构 单体架构和SOA架构系统部署,...

  • Spring Cloud微服务

    一个归档包包含了应用所有功能的应用程序, 我们通常称之为单体应用。 架构单体应用的架构风格, 我们称之为单体架构,...

  • 微服务简介

    在学习spring cloud构建微服务之前,我们先对比于单体架构来了解微服务的优势和不足。 单体架构 所谓单体应...

网友评论

    本文标题:5.单体架构(译)

    本文链接:https://www.haomeiwen.com/subject/kcainftx.html