随着互联网的蓬勃发展,互联网应用架构的演进分为如下几个阶段:
单体架构:早期的互联网应用往往运行在单一服务器上,负责处理所有的请求和数据存储。这种架构简单易实现,但在面对大量用户和高并发时存在性能和可扩展性的限制。
分层架构:随着互联网用户规模的增长,逐渐出现了分层架构的设计。应用服务器和数据库服务器被拆分为多个层次,每个层次专注于特定的功能。例如,前端服务器负责接收用户请求和处理静态资源,应用服务器处理业务逻辑,数据库服务器负责数据存储。分层架构提高了系统的可扩展性和性能,并且允许更好的模块化和团队协作。
分布式架构:为了进一步提高系统的可扩展性和容错性,引入了集群和负载均衡技术。通过将多台服务器组成集群,可以实现请求的负载均衡,将流量分散到不同的服务器上,提高系统的处理能力和可用性。
微服务架构:随着互联网应用的复杂性增加,传统的单体应用架构变得难以维护和扩展。微服务架构的概念应运而生,将应用拆分为多个小型、自治的服务,每个服务专注于特定的业务功能。微服务架构通过解耦、独立部署和横向扩展等特点,提供了更高的灵活性、可扩展性和可维护性。
云原生架构:随着云计算技术的兴起,云原生架构成为互联网架构的新趋势。云原生架构利用云计算提供的弹性资源和服务,通过容器化和编排技术实现应用的快速部署、弹性伸缩和自动化管理。它鼓励使用轻量级的容器、微服务和敏捷的开发流程,以支持快速迭代和持续交付。
1.分布式系统的设计原则
由于分布式系统的复杂性,业界提出了不同的理论,其中最著名的是 CAP 原则和 BASE 理论。
1.1 CAP 原则
分布式的复杂主要体现在一致性、可用性、分区容错性三个方面:
- 一致性(consistency):保持所有节点在同一时刻具有相同的、逻辑一致的数据。
- 可用性(availability):保证每个请求不管成功还是失败都应响应。
- 分区容错性(partitiontolerance):系统中任何的信息丢失或者失败不会影响系统的继续运行。
CAP 原则指出任何分布式系统都不能同时满足 3 个方面,只能满足如下三种情况:
CA:满足一致性和可用性的系统。该系统在扩展性上比较差。采用 CA 的分布式系统:
- Google Spanner:Google Spanner 是一个全球分布式数据库系统,提供强一致性和高可用性。它使用 TrueTime API 和全球时钟同步来实现分布式一致性,并在多个数据中心中复制数据以提供高可用性。
- Oracle RAC(Real Application Clusters):Oracle RAC 是 Oracle 数据库的一种架构,它将数据库实例部署在多个节点上,以实现高可用性和可扩展性。Oracle RAC 提供了强一致性的事务处理和高可用性的故障恢复能力。
- CockroachDB:CockroachDB 是一个分布式数据库系统,旨在提供强一致性和高可用性。它使用分布式事务和多副本复制来实现数据的一致性,并使用 Raft 一致性协议来保证故障容错和高可用性。
CP:满足一致性和分区容错性的系统。为了一致性牺牲性能,该系统通常性能不会特别高。采用 CP 的分布式系统:
- ZooKeeper:ZooKeeper 是一个分布式协调服务,用于协调和管理分布式系统中的进程。它强调一致性和分区容错性,并在可用性方面做出一些妥协。ZooKeeper 通过使用强一致性协议(ZAB)来确保数据的一致性。它的设计目标是在网络分区的情况下保持一致性,并且在分区恢复后恢复正常的一致性状态。
- Nacos:Nacos 是一个服务发现、配置管理和服务治理的平台(既满足 CP 又可以满足 AP),它强调一致性和分区容错性。Nacos 使用 Raft 一致性协议来保证分布式节点之间的数据一致性。Raft 协议能够在节点之间达成共识,保证数据的一致性,并在网络分区恢复后自动恢复一致性状态。在 Nacos 中,当网络发生分区时,节点之间的通信可能会受到影响,但系统仍然保持一致性。节点之间的数据同步可能会有延迟,但一旦网络分区解决,Nacos 会尽最大努力恢复一致性。因此,Nacos 满足了 CP 属性,强调一致性和分区容错性。
AP:满足可用性和分区容错性的系统。该系统通常对一致性要求较低,但性能相对比较好。采用 AP 的分布式系统:
Eureka:Eureka 是 Netflix 开发的一个开源服务发现框架,用于在分布式系统中管理和发现微服务。Eureka 强调可用性和分区容错性,而对于一致性的要求相对较低。Eureka 的设计目标是保持系统的可用性,即使在出现网络分区(如节点之间的通信故障)的情况下,也能继续提供服务。它采用了一种去中心化的架构,其中每个节点都可以独立地提供服务发现和注册功能,节点之间相互独立,没有单点故障。
Nacos:Nacos 是一个服务发现、配置管理和服务治理的平台。Nacos 旨在提供高可用性和分区容错性,将服务的可用性放在首要位置。在 Nacos 的设计中,当发生网络分区时,节点之间的通信仍然可以继续,并且可以提供服务注册和发现的功能。即使在网络分区期间,Nacos 节点之间的信息同步可能存在延迟,但节点仍然可以提供服务。
在互联网应用中,保证可用性往往是第一位的,其次是性能,而微服务主要追求可用性和分区容错性(AP),轻一致性(C)。
1.2 BASE 理论
在分布式系统中,不同的线程和机器之间保证一致性是非常困难的,保证一致性的同时,会增加系统的复杂性,且会牺牲性能。在 BASE 理论中,一致性分为强一致性和弱一致性(CAP 原则的一致性是指强一致性):
- 强一致性:当数据完成更新操作之后,对于后续任何线程或其它节点都能访问到最新值。根据 CAP 原则,实现强一致性需要对性能做出较大牺牲,例如保证 RPC 网络调用的数据强一致性,通常依赖于分布式锁等方案,这些方案性能开销较大。
- 弱一致性:当数据完成更新操作之后,并不能保证后续任何线程或其它节点马上访问到最新值。弱一致性允许数据存在短暂不一致性,但可以保证数据的最终一致性。
BASE 理论的核心思想是:即使分布式系统无法做到强一致性,也可以采用适当的方法保证最终一致性。BASE 理论是几个名词的简写:
- BA(Basically Available,基本可用):系统保证在面对异常情况或部分故障的情况下仍能提供基本的功能和可用性。即使在出现故障或异常情况下,系统仍然能够部分正常工作,不会完全瘫痪。
- S(Soft state,软状态):系统中的状态可以短暂地不一致。分布式系统中的节点之间可能存在通信延迟、网络分区等问题,导致数据的同步和一致性可能存在一定的延迟。软状态接受在一段时间内的数据不一致或部分失效的情况,但最终会趋向于一致状态。
- E(Eventual consistency,最终一致性):系统保证最终会达到一致的状态,但在某个时刻可能存在短暂的不一致性。即使在系统中的所有节点之间出现网络分区等情况,系统最终会通过合适的机制将数据达到一致的状态。最终一致性强调的是在一段时间后,系统能够保持一致性。
BASE 理论的思想是通过放松一致性的要求,提高系统的可用性和性能。相对于强一致性(如 ACID 事务),BASE 理论更适用于一些对于实时性要求不高、可容忍一定程度数据不一致的场景,如分布式缓存、日志系统等。
2.微服务的定义
微服务是一种软件架构风格,用于构建复杂的应用程序。它将一个大型的应用程序拆分成一组小型、自治的服务,这些服务可以独立部署、扩展和维护,每个微服务都专注于执行特定的业务功能,通过明确定义的接口与其他微服务进行轻量级通信(通过 HTTP 或消息队列)。微服务架构的目标是提高灵活性、可伸缩性和快速交付,使得团队可以独立开发、部署和维护服务。在微服务架构中推荐使用 RESTful 风格进行服务通讯,RESTful 是一种基于 HTTP 协议的轻量级 API 接口设计风格,它提供了一种简单、一致、可伸缩、面向资源的设计理念,非常适合微服务的分散性和松耦合性的要求。在一些性能敏感或内部环境中可以使用 RPC 方式进行服务调用,相较于 RESTful 风格 RPC 使用二进制进行传输,比 RESTful 的文本协议更紧凑、轻量,而且支持多种传输协议(TPC 或 HTTP2 等等)和跨语言、强类型等特点,因此,非常适合性能要求高、强调直观接口和面向服务的场景中。
微服务架构通常建立在分布式系统的基础上,每个微服务可以是一个独立的部署单元,它们可以在不同的计算机或容器中运行。这些微服务通过网络进行通信,形成一个分布式系统。微服务架构在实现业务逻辑的同时,也考虑了分布式系统中节点间的通信、协作和故障处理等问题。虽然微服务架构是构建分布式系统的一种方法,但它并不等同于分布式系统。分布式系统可以采用多种架构风格,而微服务只是其中之一。微服务架构更强调服务之间的松耦合、独立性和快速交付,而分布式系统更关注系统整体的分布式特性、性能优化和容错性。
2.2 微服务核心组件
在微服务架构中,由于涉及服务发现、服务调用、服务追踪监控等功能,因此,开发微服务应用变得复杂困难。在一些微服务解决方案中将可重用的、独立部署的软件单元抽离为一个单独的组件,以降低微服务微服务应用的复杂度。常见的微服务组件如下:
注册中心:注册中心是微服务架构中的一种关键组件,用于管理和维护微服务实例的信息(类似于一个服务名单)。它是一个集中式的服务,负责记录和存储微服务的元数据,包括服务名称、IP 地址、端口号、健康状态等。其他微服务和客户端可以通过查询注册中心来发现和定位特定的微服务实例。注册中心具有以下主要功能:
- 服务注册:在微服务架构所有微服务都应向注册中心进行注册。这包括服务名称和它的网络位置(IP 地址和端口号)。这样,注册中心会维护一个服务实例的列表,以便其他服务和客户端能够找到它。
- 服务发现:客户端和其他微服务可以查询注册中心,以获取感兴趣的服务的实例列表。这样,它们可以根据需要选择一个可用的实例来进行通信,从而实现负载均衡和故障恢复。
- 健康检查:注册中心可以定期或根据需要检查注册的微服务实例的健康状态。如果一个实例不再健康,它可以从注册中心中移除,确保其他服务不会发送请求到故障的实例。
- 负载均衡:注册中心可以提供服务实例的权重和负载信息。这使得客户端可以根据实例的负载情况来进行负载均衡,避免将请求发送到过载的实例。
- 动态变更:注册中心能够处理微服务实例的动态变更,包括实例的添加、删除和状态变化。这确保了服务发现和负载均衡的准确性和实时性。
负载均衡:在微服务架构中,负载均衡是一种技术手段,用于在多个相同或类似的微服务实例之间分发传入的请求,以实现更好的性能、可靠性和可扩展性。负载均衡的主要目标是确保每个服务实例都能够处理适量的请求,并避免某个实例过载而影响整体系统性能。在微服务架构中,负载均衡的作用包括:
- 分发请求:负载均衡器将传入的请求分发到不同的微服务实例,确保每个实例都有机会处理请求。
- 提高性能:将请求分发到多个实例可以减少单个实例的负载,从而提高整体系统的性能和响应时间。
- 实现高可用性:如果某个微服务实例发生故障,负载均衡器可以将请求转发到其他正常工作的实例,确保服务的可用性。
- 动态调整:负载均衡器可以根据实例的负载情况动态调整请求的分发,以实现更平衡的负载分布。
- 容错处理:当某个实例出现性能问题或错误时,负载均衡器可以将请求转发到其他健康的实例,避免将请求发送到有问题的实例。
配置中心:配置中心是微服务架构中的一个关键组件,用于集中管理和存储应用程序的配置信息。在传统的单体应用中,配置通常存储在应用程序代码中或配置文件中。然而,在微服务架构中,由于可能涉及到多个不同的微服务实例,以及不同环境下的配置差异,配置管理变得更加复杂。配置中心的目标是简化配置的管理和分发,使得微服务的配置更加灵活和可维护。配置中心的作用包括:
- 集中管理配置:配置中心允许将应用程序的配置集中存储在一个地方,从而使得配置更容易管理和维护。
- 动态更新:配置中心支持动态更新配置,无需重新部署应用程序。这使得配置的修改和调整变得更加灵活和快速。
- 环境隔离:可以在不同的环境(如开发、测试、生产)中维护不同的配置,确保每个环境使用适合的配置。
- 版本控制:配置中心通常支持配置版本控制,可以跟踪和管理配置的历史变更。
- 动态刷新:微服务实例可以从配置中心定期或根据需要刷新配置,以应用最新的配置更改。
- 安全性:配置中心可以提供访问控制和权限管理,确保只有授权的人员可以修改和访问配置信息。
API 网关:在微服务架构中,API 网关是一个位于前端的组件,用于管理和控制微服务的入口点,以及处理外部请求和内部微服务之间的通信。API 网关的主要目标是提供一个单一的入口,使得客户端只需与 API 网关进行通信,而不需要直接与每个微服务进行交互。这有助于简化客户端与后端服务的通信,同时也可以实现许多其他功能。API 网关的作用和功能包括:
- 路由和转发:API 网关根据请求的路径或其他条件将请求路由到适当的微服务实例。这使得客户端无需知道微服务的具体位置,而只需通过网关进行通信。
- 负载均衡:API 网关可以实现负载均衡,将请求分发到多个微服务实例,以实现更好的性能和可用性。
- 认证和授权:API 网关可以处理认证和授权,确保只有经过身份验证的用户可以访问受保护的微服务。
- 请求转换:API 网关可以对请求和响应进行转换,以适应不同的数据格式或协议,使得客户端和微服务可以使用不同的数据模型。
- 请求聚合:在某些情况下,一个页面或应用程序可能需要调用多个微服务来获取所需的数据。API 网关可以聚合多个请求,将数据整合在一起并返回给客户端。
- 缓存:API 网关可以实现缓存策略,缓存响应以减少对后端微服务的请求,提高性能。
- 日志和监控:API 网关可以记录请求和响应信息,从而提供监控和分析能力,帮助监控微服务的运行状况。
- 安全性:API 网关可以提供防御性安全功能,例如 DDoS 保护、防止恶意请求等。
断路器:在微服务架构中,断路器(Circuit Breaker)是一种模式和组件,用于处理分布式系统中的故障情况,以避免故障蔓延并提高系统的可用性和稳定性。断路器组件负责监控服务调用的状态,当发现服务不稳定或故障时,会打开断路器,阻止请求进入故障的服务,从而快速失败并减少对故障服务的影响。断路器组件包括如下功能:
- 故障防护:断路器能够检测调用远程服务时的错误率、响应时间等指标。如果错误率超过阈值,断路器将进入打开状态,停止转发请求。
- 快速失败:当断路器处于打开状态时,所有请求会被快速失败,而不是等待远程服务的响应。这可以避免客户端长时间的等待。
- 降级策略:断路器在打开状态时可以执行降级策略,返回预定义的备用响应,以提供基本的功能或信息,而不是完全失败。
- 自动恢复:断路器会在一段时间后进入半开状态,尝试发送一些请求到远程服务,以测试其是否已经恢复。如果测试成功,断路器会切换回关闭状态。
- 监控和仪表板:断路器组件通常提供监控仪表板,可以可视化地展示断路器的状态、故障率、响应时间等性能指标。
分布式链路跟踪:微服务的分布式链路跟踪组件是用于实现分布式链路跟踪的工具或服务。它可以帮助开发人员追踪和监控微服务架构中不同微服务之间的请求流程和数据传递路径,以便识别性能问题、故障和瓶颈。
2.2 Java 微服务解决方案
在 Java 中实现微服务架构有多种解决方法,比较成熟的有 Spring Cloud、Spring Cloud Alibaba、Spring Cloud Azure 等等,其中 Spring Cloud 和 Spring Cloud Alibaba 是 Java 微服务领域最成熟、使用人数最多的微服务解决方案。
Spring Cloud: Spring Cloud 是基于 SpringBoot 实现的一套微服务组件集合,提供了注册中心、负载均衡、配置中心、API 网关、断路器、分布式链路跟踪等组件,通过 Spring Cloud 提供的组件可以快速构建微服务应用。
Spring Cloud Alibaba:Spring Cloud Alibaba 是 Spring Cloud 下的一个子项目,Spring Cloud Alibaba 为分布式应用程序开发提供了一站式解决方案,它包含开发分布式应用程序所需的所有组件,可以轻松地使用 Spring Cloud 开发应用程序,使用 Spring Cloud Alibaba,只需要添加一些注解和少量配置即可将 Spring Cloud 应用程序连接到 Alibaba 的分布式解决方案,并使用 Alibaba 中间件构建分布式应用程序系统。
Spring Cloud 与 Spring Cloud Alibaba 组件介绍如下:
| 组件名称 | Spring Cloud | Spring Cloud Alibaba |
|---|---|---|
| 注册中心(服务注册/发现) | Eureka、Consul、Zookeeper | Nacos |
| 负载均衡 | Ribbon | Dubbo LB |
| 服务调用 | Openfeign | Dubbo |
| 配置中心 | Apllo、Spring Cloud Config | Nacos |
| API 网关 | Spring Cloud Gateway、Zuul | Dubbo Proxy |
| 断路器 | Spring Cloud Circuit Breaker | Sentinel |
| 链路跟踪 | SkyWalking、Spring Cloud Sleuth | SkyWalking |
Spring Cloud 与 SpringBoot 版本关系:
| Spring Cloud 版本 | Spring Boot 版本 |
|---|---|
| 2022.0.x aka Kilburn | 3.0.x, 3.1.x (Starting with 2022.0.3) |
| 2021.0.x aka Jubilee | 2.6.x, 2.7.x (Starting with 2021.0.3) |
| 2020.0.x aka Ilford | 2.4.x, 2.5.x (Starting with 2020.0.3) |
| Hoxton | 2.2.x, 2.3.x (Starting with SR5) |
| Greenwich | 2.1.x |
| Finchley | 2.0.x |
| Edgware | 1.5.x |
| Dalston | 1.5.x |
由于 Spring Boot 3.0,Spring Boot 2.7~2.4 和 2.4 以下版本之间变化较大,Spring Cloud Alibaba 同时维护了 2022.x、2021.x、2.2.x 三个分支迭代, 版本关系如下:
2022.x 分支:该分支适配 Spring Boot 3.0,Spring Cloud 2022.x 版本及以上的 Spring Cloud Alibaba 版本按从新到旧排列如下表:
Spring Cloud Alibaba Version Spring Cloud Version Spring Boot Version 2022.0.0.0* Spring Cloud 2022.0.0 3.0.2 2022.0.0.0-RC2 Spring Cloud 2022.0.0 3.0.2 2022.0.0.0-RC1 Spring Cloud 2022.0.0 3.0.0 2021.x 分支:该分支适配 Spring Boot 2.4,Spring Cloud 2021.x 版本及以上的 Spring Cloud Alibaba 版本按从新到旧排列如下表:
| Spring Cloud Alibaba Version | Spring Cloud Version | Spring Boot Version |
|---|---|---|
| 2021.0.5.0* | Spring Cloud 2021.0.5 | 2.6.13 |
| 2021.0.4.0 | Spring Cloud 2021.0.4 | 2.6.11 |
| 2021.0.1.0 | Spring Cloud 2021.0.1 | 2.6.3 |
| 2021.1 | Spring Cloud 2021.0.1 | 2.4.2 |
2.2.x 分支:该分支适配 Spring Boot 2.4,Spring Cloud Hoxton 版本及以下的 Spring Cloud Alibaba 版本按从新到旧排列如下表:
Spring Cloud Alibaba Version Spring Cloud Version Spring Boot Version 2.2.10-RC1* Spring Cloud Hoxton.SR12 2.3.12.RELEASE 2.2.9.RELEASE Spring Cloud Hoxton.SR12 2.3.12.RELEASE 2.2.8.RELEASE Spring Cloud Hoxton.SR12 2.3.12.RELEASE 2.2.7.RELEASE Spring Cloud Hoxton.SR12 2.3.12.RELEASE 2.2.6.RELEASE Spring Cloud Hoxton.SR9 2.3.2.RELEASE 2.2.1.RELEASE Spring Cloud Hoxton.SR3 2.2.5.RELEASE 2.2.0.RELEASE Spring Cloud Hoxton.RELEASE 2.2.X.RELEASE 2.1.4.RELEASE Spring Cloud Greenwich.SR6 2.1.13.RELEASE 2.1.2.RELEASE Spring Cloud Greenwich 2.1.X.RELEASE 2.0.4.RELEASE(停止维护,建议升级) Spring Cloud Finchley 2.0.X.RELEASE 1.5.1.RELEASE(停止维护,建议升级) Spring Cloud Edgware 1.5.X.RELEASE
2.3 Go 微服务解决方案
在 Go 语言中,有一些流行的微服务框架和库,它们为开发者提供了一些方便的工具和模型来构建和管理微服务。
- go-zero: go-zero 是一个基于 Go 语言的开发框架,专注于构建分布式应用和微服务。它提供了一套完整的微服务支持,包括服务注册与发现、负载均衡、熔断器(Circuit Breaker)、限流等功能。这使得开发者可以轻松构建和管理微服务架构。
- Gokit:Go kit 是一个基于标准库的微服务框架,提供了一系列的库和工具,用于构建分布式系统。Go kit 支持服务发现、负载均衡、通信等微服务架构中常见的模式,同时允许开发者根据实际需求进行选择和替换组件。
- Go Micro: Micro 是一个用于构建分布式系统的微服务框架。它提供了服务发现、负载均衡、消息总线等功能,并支持多种传输协议。Micro 还包括一组工具,用于构建、测试和部署微服务。
- Kratos: Kratos 是 Bilibili 开源的 Go 微服务框架。它基于 Go kit 构建,提供了一系列的组件和工具,用于简化微服务的开发和部署。Kratos 支持 HTTP、gRPC 等协议,并提供了服务注册、配置中心等功能。
Java知识库