掘金 后端 ( ) • 2024-04-07 10:18

关注微信公众号 “程序员小胖” 每日技术干货,第一时间送达!

引言

俗话说,没有最好的架构,只有最合适的架构。微服务架构也是随着信息产业的发展而出现的最有普 遍适用性的一套架构模式。通常来说,我们认为架构发展历史经历了这样一个过程:单体架构——> 垂直架构 ——> SOA 面向服务架构 ——> 微服务架构。

单体应用架构

单体架构是一种软件架构模式,其中所有的功能模块和组件都被打包在一个独立的应用程序中。这种架构在软件开发的早期非常常见,因为它简单、易于理解和部署。在单体架构中,应用程序的所有部分都紧密耦合在一起,共享相同的代码库、资源和运行环境。

优点:

  • 项目架构简单, 小型项目的话, 开发成本低
  • 项目部署在一个节点上, 维护方便

缺点:

  • 全部功能集成在一个工程中, 对于大型项目来讲不易开发和维护
  • 项目模块之间紧密耦合, 单点容错率低
  • 无法针对不同模块进行针对性优化和水平扩展

垂直应用架构

垂直应用架构是一种软件设计方法,其中应用程序被构建为独立的单元,每个单元负责特定的业务功能或服务。这种架构通常涉及到将应用程序分解为多个层次,每个层次负责不同的职责,例如用户界面、业务逻辑、数据访问和存储。

还是以上面的电商为例子, 用户访问量的增加可能影响的只是用户和订单模块, 但是对消息模块的影响就比较小. 那么此时我们希望只多增加几个订单模块, 而不增加消息模块. 此时单体应用就做不到了, 垂直应用就应运而生了.

所谓的垂直应用架构, 就是将原来的一个应用拆成互不相干的几个应用, 以提升效率. 比如我们可以将上面电商的单体应用拆分成:

  • 电商系统(用户管理 商品管理 订单管理)
  • 后台系统(用户管理 订单管理 客户管理)
  • CMS系统(广告管理 营销管理) 这样拆分完毕之后, 一旦用户访问量变大, 只需要增加电商系统的节点就可以了, 而无需增加后台和CMS的节点.

优点:

  • 系统拆分实现了流量分担, 解决了并发问题, 而且可以针对不同模块进行优化和水平扩展
  • 一个系统的问题不会影响到其他系统, 提高容错率

缺点:

  • 系统之间相互独立, 无法进行相互调用
  • 系统之间相互独立, 会有重复的开发任务

分布式架构

分布式架构是一种软件架构模式,它将应用程序或系统的功能分散到多个独立的计算机节点上,这些节点通过网络相互连接。这种架构的核心思想是将工作负载分散到多个处理单元,以提高可用性、可靠性、伸缩性和性能。

优点:

  • 抽取公共的功能为服务层, 提高代码复用性
  • 可伸缩性:通过增加更多的节点来处理增加的负载,系统可以水平扩展以满足不断增长的需求。
  • 高可用性:如果一个节点失败,其他节点可以接管其工作,从而减少系统的整体停机时间。
  • 容错性:分布式系统可以设计成能够在某些组件失败的情况下继续运行,提供持续的服务。
  • 性能提升:通过在多个节点上并行处理任务,可以提高系统的响应速度和处理能力。

缺点:

  • 系统间耦合度变高:调用关系错综复杂,难以维护
  • 复杂性:管理和维护一个分布式系统通常比单体系统更复杂,因为它涉及到跨多个节点的协调和同步。
  • 数据一致性:在分布式系统中保持数据的一致性和完整性是一个挑战,需要采用如两阶段提交、分布式事务等技术来解决。
  • 网络依赖:分布式系统的性能和可用性高度依赖于网络的稳定性和速度。
  • 安全性:由于系统分布在多个节点上,因此需要更复杂的安全措施来保护系统免受攻击和数据泄露。

SOA架构

SOA(面向服务的架构,Service-Oriented Architecture)是一种软件架构设计,它将应用程序构建为相互独立、松耦合的服务集合12。这些服务通常具有定义良好的接口,可以通过网络进行通信,通常是使用HTTP或其他网络协议3。SOA的目标是提高业务灵活性和重用性,使得服务可以在不同的应用程序和组织中重复使用

优点:

  • 使用注册中心解决了服务间调用关系的自动调节

缺点:

  • 服务间会有依赖关系, 一旦某个环节出错会影响较大( 服务雪崩 )
  • 服务关心复杂, 运维、测试部署困难

微服务架构

微服务架构是一种软件开发风格,它鼓励将一个大型、复杂的应用程序分解为一组小型、松耦合的服务。每个服务围绕特定的业务功能构建,运行在自己的进程中,并通常通过轻量级的通信机制(通常是HTTP RESTful API)进行交互。

微服务架构的核心优势:

  • 可维护性和可测试性:由于服务的粒度较小,每个服务更易于理解和维护。同时,这也使得针对特定服务的测试变得更加容易。
  • 灵活性和可扩展性:微服务架构允许团队独立地开发和部署服务,这意味着可以针对特定服务的需求进行扩展,而不影响整个系统。
  • 技术多样性:不同的服务可以使用最适合它们需求的技术栈,包括编程语言、数据库和工具,从而提高开发效率和系统性能。
  • 容错性:当某个服务出现故障时,不会直接影响到其他服务,从而提高了整个系统的稳定性和可靠性。
  • 持续集成和持续部署(CI/CD):微服务架构支持快速迭代和频繁部署,使得新功能和修复可以快速推向生产环境。

微服务架构的挑战:

  • 服务间通信:服务之间的通信可能会变得复杂,需要设计合理的API和协议来确保服务间的有效协作。
  • 数据一致性:在分布式系统中保持数据一致性是一个挑战,尤其是在服务之间共享数据时。可能需要采用最终一致性模型和分布式事务处理策略。
  • 运维复杂性:随着服务数量的增加,运维工作变得更加复杂,需要有效的监控、日志记录和故障恢复机制。
  • 安全性:每个服务都可能成为攻击的入口点,因此需要在每个服务中实施严格的安全措施。
  • 服务发现和负载均衡:在动态环境中,服务可能频繁地启动和停止,需要有机制来确保服务可以被正确地发现和负载均衡。

结语

微服务架构的演进是一个不断适应和改进的过程。从单体应用到微服务架构,每一步都旨在解决前一阶段的挑战,并为未来的技术发展做好准备。理解这一演进过程,将有助于我们更好地设计和维护现代软件系统