1.1.1  一张图看懂单体架构

早期的计算机程序就像一个包含多个功能的瑞士军刀:所有功能都集中在一起。这就是单体架构。

这听起来有点像玩具积木盒,所有积木都放在一个盒子里,想玩哪个,从里面挑出来就行。方便吧?但是,当这个盒子里的积木越来越多时,你可能就开始懊恼——为何当初不买一个分隔板来组织一下盒子里的结构呢?随着时间和功能的增加,有时单体架构就会遇到这种情况。

 提示  单体架构将所有模块紧密地集成在单一的代码库中,并作为一个系统进行开发、部署和扩展。在许多应用的早期,单体架构是首选,因为它简单、易于开发和测试。但随着时间的推移和业务的发展,单体架构会逐渐显得臃肿,代码间的依赖关系变得复杂,维护和扩展变得困难。

单体架构如图1-1所示。

看上去是不是很整齐?所有业务都在一个“大房间”(服务器)中,用户业务、商品业务、订单业务、支付业务都有自己的“小房间”,所有数据都住在“地下室”(数据库)中,这整个“大房间”坐落在服务器的“土地”上。

但别忘了,这只是开始。随着业务变得火爆,这个“大房间”可能会逐渐变得不合适。后面章节会探讨如何将业务从这个“大房间”搬到一个更加宽敞的新地方。

1.1.2  一张图看懂集群架构

在单体架构中,所有业务模块都集中在同一个服务器中。随着业务量和用户量的增加,这种架构很快会遇到瓶颈:系统难以承受高并发的压力,开发和部署变得笨重,维护成本逐渐增加。

为了解决这些问题,需要一种新的架构来提高系统的可用性,这就是集群架构的起点。

集群架构实际上就是将单体架构复制多份,分别部署在多个服务器上,每个服务器都运行一个应用实例。这样,应用的访问和负载就被分散到不同的服务器上。当某个服务器出现故障时,其他服务器可以继续提供服务,从而实现高可用性。

在图1-2中,将单体架构复制到了两个服务器上。

  • 客户端:任何发起请求的设备,如用户的手机、计算机或其他网络连接的终端。客户端中运行的应用或浏览器通过互联网发送对特定资源的请求。
  • 负载均衡器:一个网络设备。它可以根据特定的策略(如轮询、权重分配、最少连接数)将传入的网络流量分散到多个服务器上。负载均衡器通常位于客户和服务器集群之间,作为请求和响应的中介。其主要功能是将来自用户的请求分发到多个服务器上,确保各服务器的工作负载大致相等,从而最大化吞吐量,减少响应时间。负载均衡器还具有其他功能,如SSL(Secure Sockets Layer,安全套接层)终结、缓存、请求过滤等。
  • 服务器集群:服务器A和服务器B表示服务器集群中的两个服务器。每个服务器上都包含多个业务模块,这些模块都是相同的应用实例。每个服务器都可以同时处理多个请求,而不是按顺序一个接一个地处理请求。
  • 数据库:在集群架构中,通常所有服务器都连接到同一个数据库上,以确保数据的完整性和一致性。采用单个数据库的优点是,可以确保数据的一致性,简化数据管理流程,但可能会遇到并发访问冲突、数据库的性能瓶颈、单点故障风险等问题。数据库通常提供了锁定机制、事务处理和备份恢复策略,以确保数据的安全性和完整性。

集群架构通过一组协同工作的服务器来提供服务,这些服务器共同处理用户请求。相比于单体架构,集群架构提供了更强的处理能力和更好的容错性。

 提示  在集群架构中,单点故障不会导致整个系统不可用,这是因为请求可以在多个服务器之间重新分配。集群架构的可扩展性也较单体架构更出色,可以通过增加更多的服务器来轻松扩展系统的处理能力。

1.1.3  一张图看懂微服务架构

集群架构通过多个服务器的协同工作具备可伸缩性和冗余性,但在应对快速变化的市场和技术需求时,它仍然存在局限性,需要一种新的方式来更高效、灵活地开发和维护系统。这就要求后端系统能够支持更细粒度的服务划分和独立部署。此时可以考虑微服务架构,即将一个庞大的单体架构划分为更小、更易于管理和扩展的部分。

在考虑分布式数据库和分库分表时,实际上已经在数据层进行了微分。微服务架构可以被视为在应用层进行类似的微分,而不是将所有功能都打包在一个巨大的应用中。

微服务架构推崇将每个功能都作为一个单独的服务进行开发、部署和维护,如图1-3所示的用户业务、商品业务和支付业务。

1.集群架构中的服务划分

在集群架构中,服务划分的解决方案如下。

  • 单体应用复制:在集群架构中,通常会对单体应用进行复制,并在多个服务器上部署多个相同的应用实例。这样,每个应用实例都能处理一部分用户请求。
  • 资源共享:集群架构中的应用实例通常共享相同的数据库和其他后端资源,这意味着,它们都可以访问相同的数据。
  • 使用负载均衡器:在集群架构中,前端通常有一个负载均衡器,其主要用于将进入的请求均匀地分发到不同的应用实例上,以实现负载均衡。
2.微服务架构中的业务划分

在微服务架构中,业务划分的解决方案如下。

  • 业务功能解耦:在微服务架构中,系统被划分为多个小的、独立的服务,每个服务都负责一个特定的业务功能或功能组。
  • 独立部署与扩展:在微服务架构中,每个服务都可以独立部署、扩展和维护。这意味着,团队可以根据每个服务的需求来扩展或更新它,而不影响其他服务。
  • 专用数据存储:在纯粹的微服务架构中,每个服务都有自己的数据库存储数据,这确保了数据的独立性和一致性。
  • 服务间通信:在微服务架构中,服务间通常通过API或消息进行通信,而不直接访问其他服务的数据库或内部功能。
  • 使用API网关(API Gateway):在微服务架构中,为了简化前端的访问和服务的路由,通常使用API网关。它是唯一的入口,用于将请求路由到适当的后端服务。

 提示  集群架构关注的是如何最大化地利用硬件,可以通过部署多个相同的应用实例来提高吞吐量和可用性。

微服务架构关注的是如何将复杂的业务逻辑和功能拆分为更小、更易于管理的部分,从而提高开发效率、扩展性和容错性。

3.微服务架构的核心特性

微服务架构被许多现代企业采纳,已经从一个技术趋势演变为当代软件设计和开发的核心策略。

微服务架构包括以下核心特性。

  • 独立性:服务被设计为小型、独立的服务,每个服务都有自己的代码和数据库。这意味着,更改其中的一个服务不会对其他服务产生直接影响,使得开发、部署和维护变得更加容易。
  • 自治性:每个服务都是一个自治的单元,可以独立地运行和维护。这种自治性使得团队可以专注于一个特定的服务,而无须担心系统的其他部分。
  • 分布式通信:服务间通过网络进行通信,这使得多个服务可以分布在不同的服务上。这种分布式通信是微服务架构的关键部分,允许不同的服务协同工作。

 提示  使用微服务架构有助于提高开发速度、系统的可维护性,并能够灵活地适应需求的变化。

4.微服务架构与单体架构的区别

在单体架构中,所有模块都紧密地集成在单一的代码库中,构成了一个大而全的应用。微服务架构则将应用拆分为多个独立的服务,每个服务都负责单一的功能。

 提示  一个规模很小的服务,一般被称为“微服务”。在本书下文中,有时说“服务”,有时说“微服务”,相信读者根据语境是可以理解的。

1)架构复杂性

单体架构通常在逻辑上是一致的虽然微服务架构中的每个服务的设计可能更简单、更小、更易于管理,但微服务架构的总体架构和互操作性可能比单体架构更复杂。微服务架构与单体架构的区别如图1-4所示。

2)开发与部署速度

在单体架构中,任何一个小的改动都可能需要重新部署整个应用。而对于微服务架构,团队可以独立地开发、测试和部署各服务,这大大提高了迭代和发布新功能的速度。

3)技术堆栈的灵活性

单体架构通常使用一种技术或框架来开发整个应用。但对于微服务架构,由于每个服务都是独立的,因此团队可以为各服务选择合适的技术和工具,从而最大化服务的性能和效率。

4)可扩展性

对于单体架构,当需要扩展时,通常需要增加整个应用实例。但对于微服务架构,可以根据需要独立地扩展某个特定的服务,这为高效的资源分配和负载分发提供了更高的灵活性。

5)容错性

如果单体架构的某个部分出现故障,那么整个应用都可能受到影响。而在微服务架构中,由于各服务是独立的,一个服务出现故障不太可能影响其他服务,从而提高了系统整体的稳定性。

6)数据管理

单体架构通常使用一个中央数据库来管理所有数据。而在微服务架构中,每个服务都可以有其私有的数据库,这确保了数据的独立性,但也为数据的一致性和完整性带来了挑战。

 提示  微服务架构和单体架构各有其优势和挑战,需要根据具体的业务需求、团队规模、技术能力和长远的发展计划来权衡。

5.微服务架构的基本组件

在微服务架构中,每个服务都围绕着业务能力构建,并可以独立部署、扩展和更新。微服务架构的基本组件如图1-5所示。


1)服务组件

  • 务:微服务架构的核心组件,负责实现特定的业务功能。服务应该足够小,能够由一个小团队管理。
  • 数据库:每个服务都可以拥有私有数据库,这样可以避免数据库级别的耦合。
  • API网关:所有客户端请求都应先经过API网关,然后被路由到相应的微服务上。API网关用于处理跨服务的请求聚合、协议转换、请求过滤等。

2)通信机制

  • 同步通信:服务间直接通过REST或gRPC等方式进行调用。
  • 异步通信:通过使用消息队列系统(如RabbitMQ或Kafka)实现事件驱动的通信。

3)支持组件

  • 服务注册与发现:服务注册中心(如Eureka或Consul)用于自动注册服务;服务发现机制允许服务查询服务注册中心以找到其他服务的网络位置。
  • 配置管理:如Spring Cloud Config,用于管理所有环境和服务的配置。
  • 熔断器:如Hystrix,提供了一种失败保护机制,当服务失败或不可用时,熔断器将中断服务间的调用。
  • 负载均衡:负责在多个服务间分配请求,可以是客户端负载均衡,也可以是服务器负载均衡。

4)安全性和监控

  • 身份认证和授权:确保只有合法用户才可以访问服务,通常通过OAuth2等协议来实现。
  • 日志管理:通过ELK采集和管理日志,帮助开发者和运维人员监控和调试服务。
  • 监控和告警:通过监控工具(如Prometheus或Grafana)实时监控服务的健康状况,并在出现问题时发出告警。

5)DevOps和自动化

  • CI/CD(持续集成/持续部署):自动化测试和部署流程,可以确保代码变更在通过所有测试后能够自动部署到生产环境中。
  • 容器化:服务通常被打包为容器,以Docker部署,这样做可以提高环境的一致性,并简化部署和扩展过程。
  • 编排:在大规模部署时,服务需要通过编排工具(如Kubernetes)进行管理,以实现自动化部署、扩展和管理。

1.1.4  一张图看懂云原生架构

云原生架构(Cloud Native Architecture)是近年来在互联网领域快速兴起的一种架构。它充分利用云计算的弹性、灵活性和可扩展性,通过容器化、微服务、持续交付和自动化编排等技术,打造高效、敏捷且可靠的应用系统。

云原生架构的核心思想在于,将单体集群应用拆分成多个可独立部署和扩展的微服务单元,并利用容器技术(如Docker)进行部署,通过容器编排工具(如Kubernetes)实现服务的自动调度与弹性伸缩。同时,通过服务网格(Service Mesh)实现服务间的安全通信、流量控制和可观测性。此外,云原生架构还强调DevOps和CI/CD,保证了快速迭代和高效交付。

图1-6所示为云原生架构。读者通过图1-6,可以直观地理解云原生架构的组成部分及各部分的关系。

读者通过图1-6,可以清晰看到云原生架构的组件及其交互方式,具体如下。

  • 客户端请求通过统一的API网关进入系统,由API网关负责请求路由和安全控制。
  • 各服务间通过服务网格实现通信和治理。服务网格层通过Sidecar实现流量控制、服务间安全通信和监控。
  • 服务编排与管理层使用Kubernetes等容器编排工具对微服务进行自动部署、扩展和管理,提供服务注册与发现和配置管理功能。
  • 服务网格基于容器技术(如Docker)实现服务的运行环境,部署在云计算基础设施上,为系统提供弹性和可扩展性。

云原生架构的优势显而易见,容器化使得部署的一致性和资源的利用率大幅度提高,服务编排提供了强大的弹性伸缩能力,服务网格保障了服务通信的安全性与可靠性。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐