常见架构演变过程

传统架构 → 垂直应用架构 → 分布式架构 → SOA架构 → 微服务架构

  • 传统架构:采用单体式应用,将所有功能都集成在一个应用中,开发和部署较为简单,但可扩展性差,维护和更新困难;
  • 垂直应用架构:采用垂直划分的方式,将应用按照功能或业务进行拆分,并部署到不同的服务器上,缓解了单体应用的可扩展性问题,但应用之间存在耦合,系统复杂度高,并发展到一定程度后难以维护;
  • 分布式架构:通过分布式计算技术将应用部署在不同的服务器上,实现应用间的解耦,部署和处理大规模数据较为方便,但不同应用之间需要通过远程调用来通信,网络延迟等问题需要考虑;
  • SOA架构:采用面向服务的架构模式,将应用拆分成可重用的服务,服务之间使用标准化的协议通信,实现联合编排和可重用性,但复杂度高、部署和维护成本较高;
  • 微服务架构:基于SOA架构模式,进一步将应用拆分为更小的、相互独立的服务,每个服务都有自己的数据存储和业务逻辑,服务间通过轻量级协议进行通信,提高了可扩展性和灵活性,但也需要考虑分布式事务和服务治理等问题。

SpringCloud

SpringCloud简介

(1)Spring Cloud是基于Spring Boot实现的开源分布式系统开发框架,用来支持快速构建、部署和管理分布式应用程序

(2)Spring Cloud提供了许多组件和工具,来协助开发人员创建和管理分布式应用程序,如服务注册与发现、配置中心、负载均衡、熔断器、服务网关、远程调用等等

SpringCloud常见组件

组件名称功能描述
Spring Cloud Config分布式配置中心,用于管理应用的配置文件
支持Git、SVN等多种后端存储方式,可以实现动态更新应用配置。
Spring Cloud Netflix集成Netflix OSS开源组件,提供了负载均衡、服务发现、断路器和网关等功能
包括Eureka、Ribbon、Hystrix、Zuul、Archaius等组件
Eureka:服务注册与发现组件,可以实现高可用、弹性和自我治愈的分布式系统
Ribbon:客户端负载均衡组件,通过负载均衡策略和规则,将请求分配到不同的服务实例中
Hystrix:断路器组件,实现服务容错和降级机制,避免因单个服务故障而导致整个系统不可用
Zuul:网关组件,提供动态路由、过滤器、负载均衡等功能,对微服务集中管理和控制
Archaius:配置管理组件,支持热部署、动态配置、灰度发布等高级特性
Spring Cloud Bus事件消息总线,用于在分布式系统中传播状态的变化或者事件信息
支持多种消息代理,如RabbitMQ和Kafka等。
Spring Cloud Sleuth分布式跟踪系统,追踪请求路径和流经不同服务的时间,从而快速定位问题,提升系统可维护性。
Spring Cloud OpenFeign声明式REST客户端,用于简化HTTP请求的调用和处理,支持Feign内置的编解码器和拦截器。
Spring Cloud Gateway服务网关,基于Spring Framework 5,用于构建API网关服务
提供了路由、过滤、负载均衡、熔断和动态路由等功能。
Spring Cloud Stream数据处理和消息驱动,支持多种消息中间件,如RabbitMQ、Kafka、Redis和Amazon Kinesis等
提供了高级别的应用程序开发模型和连接器,支持流数据处理和批处理。
Spring Cloud Task任务调度和批处理,用于简化和管理Spring Boot应用程序中的一次性任务和批处理作业
提供了任务的定义、执行、监控和报告等功能。

服务注册与发现

什么是服务注册与服务发现

概念简介
服务注册当一个微服务启动时,它会向注册中心发送一个注册请求
注册中心将微服务的接口信息、地址等元数据信息记录下来,以便其他服务调用
服务发现当一个微服务需要调用其他服务时,它会向注册中心发送一个查询请求
注册中心获取目标服务的IP地址和端口等信息,然后通过网络协议进行通信

为什么要有服务注册与服务发现

(1)如果没有服务注册和发现机制,微服务之间的调用将变得非常困难,我们需要手动维护每个服务的地址、端口等信息,然后在代码中硬编码进行调用,这样会导致系统维护难度增加、可扩展性下降等问题

(2)有了服务注册和发现机制,我们只需要在微服务启动时将自己的信息注册到注册中心上,然后其他服务就可以从注册中心上获取该服务的信息,从而进行调用。这样可以极大地简化系统的开发和维护工作,减少硬编码和手动配置的工作

负载均衡

微服务架构中的每个微服务都会有多个运行实例,通过负载均衡可以将请求流量平均地分发到不同的实例上,以达到提高服务可用性、扩展性和性能的目的

服务通信

分布式系统之中,不同的微服务需要进行通信,以实现各种业务功能,常见的两种通信方式有:远程调用消息队列

通信方式一:远程调用

(1)远程调用是指在分布式系统中,通过网络调用另一个节点上的方法或函数。

(2)基本原理:将请求参数封装成消息,通过网络传输到远程节点上,远程节点接收到消息后执行相应的方法并返回结果。

(3)常见的远程调用技术包括RPC、RESTful API、SOAP等

(4)远程调用的优点:在于接口直观、使用简单、响应速度较快。

(5)远程调用的缺点:直接耦合了发送者和接收者,当系统规模增大时,容易造成系统的耦合度过高,难以维护和扩展

通信方式二:消息队列

(1)消息队列(MQ)是一种异步消息发送机制,实现了解耦架构

(2) 消息队列作为一个中间件,可以缓存消息,进行持久化存储等操作,确保消息的可靠传输和处理。 生产者将消息发布到队列中,消费者从队列中订阅并消费消息。

(3)常见的MQ技术包括RabbitMQ、Kafka、ActiveMQ等。

服务容错

雪崩问题

当微服务运行不正常,会导致无法正常调用微服务,此时会出现异常,如果这种异常不去处理,可能会导致雪崩效应,微服务的雪崩效应表现在服务与服务之间调用,当其中一个服务无法提供服务时,可能导致其他服务也挂掉

例如服务A调用服务B,服务B调用服务C,由于服务C异常导致服务B响应缓慢,

最终导致服务B和服务C都不可用,而服务B不可用又导致服务A也不可用。

像这样由一个服务所引起的一连串的服务都无法提供服务,就是微服务的雪崩效应

熔断降级

雪崩问题可以采用熔断、降级的方法去解决

  • 熔断:当下游服务异常时,断开与上游服务的交互。 它就相当于保险丝,下游服务异常触发了熔断,从而保证上游服务不受影响
  • 降级:当下游服务异常触发熔断后,上游服务就不再去调用异常的服务, 而是执行降级处理逻辑,这个降级处理逻辑可以是本地的一个单独的方法

服务限流

服务限流是指对系统中的某个服务接口或某类请求进行流量控制,限制其处理的请求数量,防止系统过载而导致服务失效

服务网关

为什么要有网关

(1)在没有网关的情况下,客户端需要直接访问每个微服务的地址和端口号,这会增加交互复杂度,降低系统可维护性和扩展性。如果微服务的地址和端口发生变化,客户端就必须重新配置地址和端口,这也不利于系统的迁移和扩展

(2)有了网关,客户端通过调用网关的API接口,就可以访问后台系统的所有微服务提供的功能,无需知道各个微服务的具体地址和端口。网关会根据请求内容进行路由转发,将请求转发给对应的微服务进行处理,并将处理结果返回给客户端。这样,客户端只需与网关进行交互,就能够轻松访问后台系统的全部功能,大大简化了系统的交互流程

网关的应用场景

应用场景描述
服务路由和转发根据请求的URL、请求头、请求参数等信息将请求转发到对应的后端服务。
认证鉴权通过过滤器机制实现认证和鉴权功能,以保证服务的安全性。
限流控制控制并发量,通过限流控制来减轻负载,提高服务的稳定性。
API聚合将多个微服务中调用接口并将结果聚合成一个响应返回给前端。
协议转换将请求转换成不同的协议,以方便前后端通信。

常见的开源微服务网关工具

工具名称语言特点
ZuulJavaNetflix OSS 套件中的一员,使用 Netflix Ribbon 实现负载均衡和Netflix Hystrix 实现熔断。
GatewayJavaSpring Cloud 套件中的一员,基于 Reactor 的 Netty 底层,灵活性高,可插拔式的过滤器链。
KongLua基于 Nginx 构建的 API 网关,可扩展性强。支持RESTful API和协议转换。
TraefikGo轻量级的 API 网关,支持多种负载均衡算法。自带各种插件,方便扩展。

Gateway 简介

Spring Cloud Gateway是Spring Cloud生态系统中的一个基于异步非阻塞编程模型的API网关,它提供了统一的路由、负载均衡、限流等功能,是微服务架构中不可或缺的一部分

消息总线

微服务消息总线是指在微服务架构中,使用一个独立的消息队列或中间件作为服务之间的通信媒介,以实现服务之间的异步通信和解耦

消息驱动

消息驱动是一种编程模型,其目的是隐藏底层消息中间件的差异,并降低在不同中间件之间切换的成本。目前常见的消息中间件包括ActiveMQ、RabbitMQ、RocketMQ、Kafka等,但在不同中间件之间进行切换需要投入大量学习成本。通过使用消息驱动,可以实现在不同的消息中间件之间的适配和绑定,将未熟悉的中间件转换为熟悉的消息中间件。此外,消息驱动还可以将多个不同类型的消息中间件统一为一个中间件,从而方便微服务应用程序的开发和管理

链路追踪

微服务链路跟踪是指通过对微服务架构中各个服务之间的请求(调用)进行记录和追踪,来了解整个调用链路的性能和行为,以便于监控、分析和优化系统

配置中心

分布式系统的配置问题

在传统的单体应用中,配置信息通常是写死在代码中或者硬编码在配置文件中,因此配置管理相对简单。但随着分布式系统和微服务架构的兴起,系统的配置变得越来越复杂。由于微服务架构中存在着多个独立的服务实例,配置信息需要按照不同的环境,部署节点等进行管理。此外,当需要调整或修改配置信息时,需要将所有相关的服务实例的配置信息都进行修改,这无疑增加了配置修改的难度和工作量

配置中心解决配置问题

通过将所有的配置信息集中化管理,提供一致的访问接口并支持动态刷新,配置中心减少了配置信息的维护成本,同时也能够提高系统的可维护性和灵活性。此外,配置中心还可以支持多种环境,多种部署模式等,实现了配置的快速适配和发布,进一步提高了系统的可靠性和可用性

SpringCloudAlibaba

SpringCloudAlibaba相关技术栈

技术简介
Nacos服务注册和发现动态配置管理服务路由于一体的中间件
提供了更简单和更可靠的服务治理平台,能够帮助开发者更敏捷地构建微服务应用
相当于 Eureka + Config + Bus
Sentinel阿里巴巴开源的一款轻量级流量控制框架,熔断、降级、限流、监控
相当于 Hystrix
Seata分布式事务解决方案,致力于为微服务架构下的分布式事务提供解决方案和简化用户使用体验
Seata提供了 AT、TCC、SAGA 三种分布式事务处理方案,并支持 Spring Cloud、Dubbo 等多种微服务框架的集成

Nacos

Nacos是注册中心 + 配置中心的组合,替代Eureka做服务注册中心;替代Config做服务配置中心, Nacos = Eureka + Config + Bus

Sentinel

Sentinel 是阿里巴巴开源的一款微服务流量控制组件;功能类似于Hystrix,目的都是为了保护系统稳定性,避免因突发流量而导致系统的瘫痪或者崩溃。与 Hystrix 相比,Sentinel 具有更为全面和强大的流量控制能力,在容错、降级、限流等方面都有很好的实践和应用

Seata

Seata 是一款分布式事务解决方案,能够帮助开发者实现分布式事务控制