德国大神的软件架构手册( 二 )


API 有多种实现方式 。最常用的是 REST、SOAP 和 GraphQl 。
关于 API 的通信方式,最常见的是使用 HTTP 协议,并以 JSON 或 XML 格式交换内容 。但是其他协议和内容格式是完全可能的 。
如果您想扩展此主题,这里有一篇不错的文章供您阅读 。
什么是模块化?
【德国大神的软件架构手册】当我们谈论软件架构中的“模块化”时,我们指的是把大的东西分成小块的做法 。这种分解事物的做法是为了简化大型应用程序或代码库 。
模块化具有以下优点:
 

  • 它有利于划分关注点和特征,这有助于项目的可视化、理解和组织 。
  • 当项目被清晰地组织和细分时,它往往更容易维护并且不易出错和错误 。
  • 如果您的项目被细分为许多不同的部分,则每个部分都可以单独和独立地进行处理和修改,这通常非常有用 。
 
我知道这听起来有点笼统,但是模块化或细分事物的实践是软件架构的重要组成部分 。所以只要把这个概念放在你的脑海里——当我们通过一些例子时,它会变得更加清晰和明显 。;)
如果您想了解有关此主题的更多信息,我最近写了一篇关于在 JS中使用模块的文章,您可能会发现它很有用 。
您的基础设施是什么样的?
好的,现在让我们来看看好东西 。我们将开始讨论组织软件应用程序的多种不同方式,首先是如何组织项目背后的基础设施 。
为了让这一切不那么抽象,我们将使用一个名为 Notflix 的假设应用程序 。
旁注:请记住,这个例子可能不是最现实的例子,我将假设/强制情况以呈现某些概念 。这里的想法是通过示例帮助您理解核心架构概念,而不是执行现实世界的分析 。
单体架构
所以 Notflix 将是一个典型的视频流应用程序,用户将能够在其中观看电影、连续剧、纪录片等 。用户将能够在网络浏览器、移动应用程序和电视应用程序中使用该应用程序 。
我们应用程序中包含的主要服务将是身份验证(因此人们可以创建帐户、登录等)、支付(因此人们可以订阅和访问内容......因为你不认为这一切都是免费的,对吧? )当然还有流媒体(这样人们就可以实际观看他们所支付的费用) 。
我们的架构的快速草图可能如下所示:
德国大神的软件架构手册

文章插图
 
经典的单体架构
在左侧,我们有三个不同的前端应用程序,它们将充当该系统中的客户端 。例如,它们可能是使用 React 和 React-native 开发的 。
我们有一个服务器,它将接收来自所有三个客户端应用程序的请求,在必要时与数据库通信,并相应地响应每个前端 。比方说,后端可以使用 Node 和 Express 开发 。
这种架构被称为单体架构,因为有一个服务器应用程序负责系统的所有功能 。在我们的例子中,如果用户想要验证、支付我们或观看我们的一部电影,所有的请求都将被发送到同一个服务器应用程序 。
单片设计的主要好处是它的简单性 。它的功能和所需的设置简单易懂,这就是大多数应用程序以这种方式开始的原因 。
微服务架构
事实证明,Notflix 完全摇摆不定 。我们刚刚发布了最新一季的“Stranger thugs”,这是一部关于青少年说唱歌手的科幻系列,以及我们的电影“Agent 404”(关于一个秘密特工,他潜入一家模拟高级程序员的公司,但实际上并没有了解代码)正在打破所有记录......
我们每个月都会从世界各地获得数以万计的新用户,这对我们的业务来说非常好,但对于我们的单一应用程序来说却不是那么好 。
最近我们一直在经历服务器响应时间的延迟,即使我们已经垂直扩展了服务器(将更多的 RAM 和 GPU 放入其中),可怜的东西似乎无法承受它所承受的负载 。
此外,我们一直在为我们的系统开发新功能(例如,一个可以读取用户偏好并推荐适合用户个人资料的电影的推荐工具),我们的代码库开始看起来庞大且使用起来非常复杂 。
深入分析这个问题,我们发现占用资源最多的功能是流媒体,而其他服务如身份验证和支付并不代表很大的负载 。
为了解决这个问题,我们将实现一个看起来像这样的微服务架构:
德国大神的软件架构手册

文章插图
 
我们的第一个微服务实现
因此,如果您不熟悉这一切,您可能会想“微服务到底是什么”,对吧?好吧,我们可以将其定义为将服务器端功能划分为许多只负责一个或几个特定功能的小型服务器的概念 。


推荐阅读