Spring Start Here 读书笔记:附录A. Architectural approaches
第1,7和11章都提到了附录A。
A.1 单体架构
当开发者将某个应用称为“单体式”或“单体应用”时,这意味着它只包含一个需要部署和执行的组件。该组件实现了该应用的所有功能。
如今,科技不再只是技术人员的专利,而是人人共享的。这种变化意味着许多系统的用户数量和处理数据量都将显著增长。为了应对用户数量和数据增长的变化,应用程序需要更多资源,而仅使用一个进程会使资源管理更加困难。其他因素还包括安全,可用性,运维等。
就以用户数量为例,如果用户数大幅增加,我们可以部署多个单体应用,每个处理部分用户,这种方法称为“水平扩展”。(前端可以假设负载均衡)。
任何一个小的程序改动都会导致单体应用重新部署,而微服务则只需要重新部署收改动影响的部分。(当然,前提是微服务架构将服务边界和API定义得很清楚;从模块化角度来说,单体应用也支持动态链接库的)。
单体架构自有其适合的场景;但他也不能适应所有情况,所以我们要讨论面向服务架构。
其实单体架构和SOA架构的对比,也类似于应用使用单个数据库和多个数据库(而非分布式数据库)的对比。
A.2 使用面向服务架构(SOA)
以销售书籍应用为例,我们有产品、交付、账单和客户多个模块。假设这些模块消耗的资源不同,如果我们希望按模块做不同程度的扩展,那么单体应用就做不到。而使用SOA架构则可以。
SOA 还具有更好地隔离职责的优势:多个模块/服务更容易保持实现的解耦和更高的内聚性。这有利于系统的可维护性。您可以为不同的团队提供他们所需的特定服务,而不是让多个团队开发同一个应用程序。
但是SOA也增加了复杂性,包括:
- 服务间通信
- 安全性
- 数据持久化
- 部署
A.2.1 服务间通信带来的复杂性
单体应用中的方法调用变成了进程间的通讯。这两个进程很可能位于不同的主机,而网络是不可靠的,错误处理更复杂。根据应用的不同,开发者会使用不同的技术或模式来解决此问题,例如重复调用、断路器或缓存。
然后服务间的通讯方式面临多种选择,如REST,SOAP,gRPC,Kafka,JMS message broker等。
A.2.2 系统安全性的复杂性
网络上信息的传输增加了信息暴露的风险,如口令,银行卡信息,个人信息等。需要考虑加密,防篡改等。
A.2.3 数据持久化带来的复杂性
是多个服务各自用一个数据库,还是共用一个数据库。可能还需要看应用的规模。
大多数人认为共享数据库是一种不好的做法。根据我将单体应用拆分成多个服务的经验,共享数据库可能会成为部署的噩梦(不认同)。
使用一个数据库更容易保证数据一致性。当拥有更多独立数据库时,确保所有数据库之间的数据一致性就变得非常具有挑战性。
A.2.4 系统部署的复杂性
SOA 并不一定容易实现,事实上,对于某些系统来说,单体架构比 SOA 更有意义。单体架构的负面含义源于它代表着旧系统。在大多数情况下,旧系统是在人们关注简洁的代码和设计原则之前实现的。现在,我们会考虑所有这些原则,以确保我们编写的代码易于维护。
如今,许多开发人员将混乱且编写糟糕的代码与单体式架构概念联系在一起。然而,单体式应用可以是(也应该是)模块化的(例如JAVA的package, class, interface,C的library,SQL的package,function/procedure,甚至Sping框架的Controller, Service和Repository),并且其代码可能很简洁,而面向服务的应用则可能混乱且设计糟糕。
A.3 从微服务到无服务器架构
微服务是 SOA 的一种特殊实现。微服务通常设计为只承担一项职责,并具有独立的持久化功能(不共享数据库)。
随着时间的推移,我们部署应用的方式发生了变化。软件架构不仅与应用的功能相关,还与团队在系统上的工作方式和系统部署方式相关。例如DevOps不仅涵盖了如何部署软件,也涵盖了我们如何进行软件开发。
如今,我们使用虚拟机或容器化环境在云端部署应用,这些方法通常意味着需要缩小应用规模。当然,演进也带来了另一个不确定性:服务应该有多小?
服务的最小化发展到今天,我们只需几行代码就可以实现一个简短的功能,并将其部署到环境中。像 HTTP 请求、计时器或消息这样的事件会触发并执行此功能。我们将这些小型实现称为无服务器函数。 “无服务器”一词并不意味着函数不在服务器上执行。但由于与开发相关的所有内容都被隐藏,我们只关注实现其逻辑的代码和触发该逻辑的事件,因此它看起来就像不存在服务器一样。
A.4 延伸阅读
软件架构及其演进是一个如此奇妙而复杂的主题。永远不会有太多书籍能够彻底涵盖这个主题。以下是按阅读顺序推荐的书籍:
- 《Microservices in Action》(由 Morgan Bruce 和 Paulo A. Pereira 合著,Manning出版社,2018年)是一本优秀的微服务入门书籍。本书涵盖了所有微服务基础知识,并配有实用示例。
- 《Microservices Patterns》(Chris Richardson著,Manning出版社,2018年)。作者提出了一种实用的方法,教你如何使用微服务开发可用于生产环境的应用程序。
- 《Spring Microservices in Action》(John Carnell 和 Illary Huaylupo Sánchez 合著,Manning,2020 年)可以帮助您更好地理解如何应用 Spring 构建微服务。
- 《Microservices Security in Action》(Prabath Siriwardena 和 Nuwan Dias 合著,Manning出版社,2020年出版)详细介绍了在微服务架构中应用安全性的意义。安全性是任何系统的关键要素,您需要从开发过程的早期阶段就始终将其纳入考量。本书从零开始讲解了安全性,阅读本书将帮助您更好地理解微服务安全性方面需要注意的方面。
- 《Monolith to Microservices》(Sam Newman 著,O’Reilly Media,2020 年出版)探讨了将单体架构转换为微服务的模式。本书还探讨了是否需要使用微服务以及如何做出选择。