大家好!在本手册中,您将了解软件架构这一广阔而复杂的领域。
当我第一次开始编码之旅时,我发现这是一个既令人困惑又令人生畏的领域。所以我会尽量避免你的困惑。
在这本手册中,我将尝试为您提供一个简单、浅显、易于理解的软件架构介绍。
我们将讨论软件世界中的架构是什么,您应该了解的一些主要概念,以及当今使用最广泛的一些架构模式。
对于每个主题,我都会给出一个简短的理论介绍。然后我将分享一些代码示例,让您更清楚地了解它们是如何工作的。让我们开始吧!
目录什么是软件架构?
要了解的重要软件架构概念什么是客户端-服务器模型?什么是API?什么是模块化?
你的基础设施是什么样的?单体架构微服务架构什么是前端(BFF)的后端?如何使用负载均衡器和水平扩展
您的基础设施所在的位置本地托管传统服务器提供商托管在云端传统的松紧带无服务器许多其他服务
要了解的不同文件夹结构一站式文件夹结构图层文件夹结构MVC文件夹结构
结论
什么是软件架构?根据这个来源:
系统的软件架构代表与整个系统结构和行为相关的设计决策。这很笼统,对吧?绝对地。在研究软件架构时,这正是让我非常困惑的地方。这是一个包含很多内容的主题,该术语用于谈论许多不同的事物。
我可以说的最简单的方式是,软件架构是指您在创建软件的过程中如何组织东西。而这里的“东西”可以指:
实现细节(即你的repo的文件夹结构)
实施设计决策(您使用服务器端还是客户端渲染?关系型数据库还是非关系型数据库?)
您选择的技术(您的API使用REST还是GraphQl?Python和Django还是Node和Express作为后端?)
系统设计决策(比如你的系统是单体还是被划分为微服务?)
基础架构决策(您是在本地还是在云提供商上托管您的软件?)
这是很多不同的选择和可能性。更复杂一点的是,在这5个部门中,可以组合不同的模式。这意味着,我可以拥有一个使用REST或GraphQL的单体API,一个托管在本地或云上的基于微服务的应用程序,等等。
为了更好地解释这个混乱,首先我们要解释一些基本的通用概念。然后我们将介绍其中的一些部门,解释当今用于构建应用程序的最常见的架构模式或选择。
需要了解的重要软件架构概念什么是客户端-服务器模型?客户端-服务器是一种在资源或服务提供者(服务器)与服务或资源请求者(客户端)之间构建应用程序任务或工作负载的模型。
简而言之,客户端是请求某种信息或执行动作的应用程序,而服务器是根据客户端所做的事情发送信息或执行动作的程序。
客户端通常由运行在Web或移动应用程序上的前端应用程序表示(尽管也存在其他平台,并且后端应用程序也可以充当客户端)。服务器通常是后端应用程序。
为了举例说明这一点,假设您正在进入您最喜欢的社交网络。当您在浏览器上输入URL并按Enter键时,您的浏览器将充当客户端应用程序并向社交网络服务器发送请求,该服务器通过向您发送网站内容来响应。
现在大多数应用程序都使用客户端-服务器模型。需要记住的最重要的概念是客户端请求服务器执行的资源或服务。
另一个需要了解的重要概念是客户端和服务器是同一系统的一部分,但每个都是独立的应用程序/程序。这意味着它们可以单独开发、托管和执行。
如果你不熟悉前端和后端的区别,这里有一篇很酷的文章来解释它。这是另一篇扩展客户端-服务器概念的文章。
什么是API?我们刚刚提到客户端和服务器是相互通信以请求事物和响应事物的实体。这两个部分通常通信的方式是通过API(应用程序编程接口)。
API只不过是一组定义的规则,用于确定应用程序如何与另一个应用程序通信。这就像两部分之间的合同,上面写着“如果您发送A,我将始终响应B。如果您发送C,我将始终响应D……”等等。
有了这组规则,客户端就可以准确地知道完成某项任务需要什么,而服务器也可以准确地知道客户端在必须执行某个操作时需要什么。
API有多种实现方式。最常用的是REST、SOAP和GraphQl。
关于API的通信方式,最常见的是使用HTTP协议,并以JSON或XML格式交换内容。但是其他协议和内容格式是完全可能的。
如果您想扩展此主题,这里有一篇不错的文章供您阅读。
什么是模块化?当我们谈论软件架构中的“模块化”时,我们指的是把大的东西分成小块的做法。这种分解事物的做法是为了简化大型应用程序或代码库。
模块化具有以下优点:
它有利于划分