引言
当谈论软件架构的演进时,就像讨论建筑物的演变一样,它揭示了技术领域中不断发展的本质。从简单的单体应用到复杂的微服务体系,软件架构一直在适应着不断变化的需求和技术进步。本文将进入后端架构的世界,了解各种架构范例的特点和演进。
像一栋大厦的结构需要根据不同的需求和环境进行设计一样,软件系统的架构也必须根据项目的规模、复杂性以及性能要求来选择。我们接下来将粗略了解传统的单体应用程序、垂直架构的复杂性、分布式系统的协作,以及面向服务架构(SOA)和微服务架构以及其特点。
单体架构
单体架构(Monolithic Architecture)是一种将所有功能打包在一个容器中运行的设计风格,一个实例中集成了一个系统的所有功能。通过负载均衡软件/设备实现多实例调用。
在互联网早期,单体架构非常流行,时至今日单体架构以其开发、调试、部署简单的特性在一些特定场景下仍然有着无可比拟的优势。单体架构在初创公司、中小型系统、产品试错等场景下开发的周期快、对开发人员的技能要求低而任然被广泛地采用。
但从目前中大型项目的业务形态、复杂度及响应速度等维度回看单体架构时可以发现它存在如下几个问题:
- 扩展性差:很难梳理功能依赖清单,一个功能点的变更往往很难评估其影响模块进而无法有效地组织测试,测试与发布都会需要整体部署,非常耗时。
- 无法实现复杂业务:一个容器中实现所功能,服务耦合性高,需要极为精巧的设计。
- 技术升级困难:牵一发而动全身,无法模块化地实现技术框架地升级。在项目生命周期内我们不可能不去升级依赖框架/类库的版本,更有甚者会重新选择基础框架。
- 开发效率低:每个成员都需要有完整的环境依赖,开发环境的搭建成本高,协同开发时版本冲突频繁,一个有问题的提交可能会影响其他所有同事的开发调试。达到一定代码量后编译慢启动慢,一次调试启动可能都要5、6分钟
- 不利于安全管理:所有开发人员都拥有全量代码,在安全管控上存在很大风险,尤其是对用大量外包人员或新招大量开发人员的团队。个别公司要求员工用虚拟桌面(一种集中存储、操作受限的虚拟环境)以避免代码外流,但这种开发体验差、受员工抵触,故普及度极低
特点
优势:性能最高;冗余小
劣势:debug困难;模块相互影响;模块分工;开发流程
垂直架构
在1980s时代,大型应用和超大型应用开始兴起,特别是操作系统和数据库的出现和广泛应用,数百万行代码量的系统较为普遍。随着业务的发展、单体架构越来越臃肿,系统代码量日益膨胀,在同一系统上协作的开发人员越来越多。基于单体架构的协作效率越来越低,系统故障率越来越高。将一个大型应用拆分成多个相互独立的小型应用成为解决单体应用的一种方案,这就是垂直架构(也称为“竖井式架构”)。垂直架构根据业务属性将一个大的单体应用拆分成多个模块或子系统,子系统之间没有直接关联。
垂直架构相较于单体架构而言,进行了部分解耦,但是不够彻底。在各个子系统相互依赖的代码和模块中,存在重复的代码拷贝和模块功能重复开发的情况。
特点
优势:业务独立开发维护
劣势:不同业务存在冗余;每个业务还是单体
分布式架构
将系统演变为垂直应用架构之后,当垂直应用越来越多时,重复编写的业务代码就会越来越多。此时,需要将重复的代码抽象出来,形成统一的服务,供其他系统或者业务模块调用,这就是分布式架构。
分布式架构是指在垂直架构的基础上,将公共业务模块抽取出来,作为独立的服务,供其他调用者消费,以实现服务的共享和重用。
分布式架构的特点
分布式架构的优点如下:
- 将重复的业务代码抽象出来,形成公共的访问服务,提高了代码的复用性。
- 可以有针对性地对系统和服务进行性能优化,以提升整体的访问性能。
分布式架构的缺点如下:
- 服务之间直接调用,服务提供方地址等信息一旦产生变更,所有消费方都需要变更。
- 系统之间的调用关系变得复杂,系统之间的依赖关系变得复杂,系统维护成本高。
在分布式架构中,我们会将系统整体拆分为服务层和表现层。服务层封装了具体的业务逻辑供表现层调用,表现层则负责处理与页面的交互操作。分布式系统架构如下图示例:
总结
优势:业务无关的独立服务
劣势:服务模块bug可导致全站瘫痪、调用关系复杂、不同服务冗余
SOA架构
面向服务的架构(SOA)是一种软件开发方法,它使用称为服务的软件组件来创建业务应用程序。每项服务提供一种业务能力,并且服务也可以跨平台和语言相互通信。开发人员使用 SOA 来重用不同系统中的服务,或者组合几个独立的服务来执行复杂的任务。
在分布式系统中表现层和业务逻辑层 并不处于同一物理部署,所以必须存在分布式服务,以契约方式发布于网络中,我们的关注点在于服务,面向服务编程,这种通过组合业务逻辑暴露可用服务的架构叫做面向服务架构即SOA。
特点
优势:服务注册
劣势:整个系统设计是中心化的、需要从上而下设计、重构困难
微服务
微服务是系统架构上的一种设计风格,主旨是将一个原本独立的系统拆分成多个小型服务,这些小型服务都在各自独立的进程中运行,服务之间通过基于HTTP/HTTPS协议的RESTful API进行通信协作,也可以通过RPC协议进行通信协作。被拆分成的每一个小型服务都围绕着系统中一些耦合度较高的业务功能进行构建,并且每个服务都维护着自身的数据存储,业务开发,自动化测试案例以及独立部署机制。由于有了轻量级的通信协作基础,所以这些微服务可以使用不同的语言来编写。
与SOA的区别
相比较于单体应用架构和SOA架构,微服务架构的主要特点是组件化、松耦合、自治、去中心化,体现在以下几个方面:用 4个字描述就是小、独、轻、松
- 小:体现每个微服务粒度要小,而每个服务是针对一个单一职责的业务能力的封装,专注做好一件事情。
- 独:独立部署运行和扩展。每个服务能够独立被部署并运行在一个进程内。这种运行和部署方式能够赋予系统灵活的代码组织方式和发布节奏,使得快速交付和应对变化成为可能。
- 轻:系统相比较复杂单体应用更为简洁轻量化,每个微服务因为独立部署,可以使用不同跨语言编写,这样使得微服务架构更为灵活.
- 松:低耦合性,符合面向对象设计高内聚低耦合特性。不同模块间依赖低,相互关联小(因为每个微服务设计的初衷是每个服务专注一个模块开发)
| SOA | 微服务 | |
|---|---|---|
| 服务粒度 | 粗粒度 | 细粒度 |
| 业务划分方式 | 水平多层 | 纵向业务划分 |
| 部署方式 | 整体部署 | 独立部署 |
| 通信方式 | 使用重量级通信方式,ESB充当服务之间通信的角色 | 使用轻量级通信方式,如HTTP RESTful |
| 服务交付 | 交付慢 | 交付块 |
| 应用场景 | 庞大、复杂、异构的企业级系统 | 快速、轻量级、基于 Web 的互联网系统 |
微服务核心要素
服务治理:服务注册、服务发现、负载均衡、扩缩容、流量治理、稳定性治理...
可观测性:日志采集、日志分析、监控打点、控制大盘、异常报警、链路追踪...
安全:身份认证、认证授权、访问令牌、审计、传输加密、黑产攻击...
微服务特点
优点:
- 每个服务为独立的业务开发,单独部署,跑在自己的进程中。
- 自动化测试、部署、运维( DevOps )。
- 快速演化、快速迭代。
- 整个业务由一系列的独立的服务共同组成系统。
- 高度容错性、高可用、高并发。
挑战
- 服务规模大,部署、运维、管理难度大。
- 服务间调用关系复杂,调用链路长,排障难度大。
- 服务间通信成本变大,性能和容错带来的挑战。
- 服务间依赖较多,系统集成、测试难度变大。
- 开发人员技术能力挑战,各服务间重复代码,重复建设等。
- 集群规模大,功能性能监控、告警带来的挑战。
- 大规模分布式,数据一致性带来的挑战。
- 需求和版本协调复杂度大大增加,测试难度也增加。
- 对基础架构要求大大提高,规模大幅增加。
总结
优势:开发效率;业务独立设计;自下而上;故障隔离
劣势:治理、运维难度;观测挑战;安全性;分布式系统复杂性
结束语
当我们观察软件架构的世界时,就像参观一栋大厦,我们可以看到不同的楼层、不同的设计风格,每一层都展现着技术领域的不断演进和创新。从单体到微服务,每一种架构都有着自己的特点和优势,适用于不同的项目和场景。
正如大厦的结构需要根据不同的需求和环境进行设计一样,软件系统的架构也必须根据项目的特点来选择。希望本文可以帮助到你更好的理解各种架构的区别。