Spring Cloud

ops/2024/12/26 17:36:33/

一、什么是SpringCloud?

SpringCloud是用于构建分布式系统的工具集,它提供了一系列的框架和组件,帮助开发者快速搭建、部署和管理微服务架构的应用程序。Spring Cloud 基于 Spring Boot 构建,利用了 Spring Boot 的快速开发和自动配置特性,使得开发微服务变得更加容易。

二、核心组件

1.服务注册与发现

1.1 Spring Cloud Eureka

Spring Cloud Eureka是Spring Cloud的一个核心组件。

功能概述:Eureka 是一个服务注册中心,用于管理微服务实例的注册和发现。各个微服务在启动时,会将自己的服务信息(如服务名称、IP 地址、端口号等)注册到 Eureka 服务器上。其他微服务可以从 Eureka 服务器获取这些服务信息,从而实现服务之间的相互调用

工作原理:Eureka 采用了客户端 - 服务器(Client - Server)模式。服务提供者(微服务实例)作为 Eureka 客户端,向 Eureka 服务器发送心跳包,以表明自己处于可用状态。如果 Eureka 服务器在一定时间内没有收到某个服务提供者的心跳包,就会将该服务从可用服务列表中移除。服务消费者(需要调用其他服务的微服务)也是 Eureka 客户端,它从 Eureka 服务器获取服务列表,然后使用负载均衡策略选择一个服务实例进行调用。

1.2 Spring Cloud Consul

Consul 是一个分布式的服务发现和配置工具。在服务注册方面,服务提供者将自己的服务信息(包括服务名称、IP 地址、端口号、健康检查信息等)发送到 Consul 服务器进行注册。

例如,一个订单服务启动后,会向 Consul 发送包含自身详细信息的注册请求,Consul 会将这些信息存储在其内部的服务目录中。服务消费者可以通过 Consul 提供的 API 或者基于 DNS 的服务发现机制来查询服务目录,获取可用的服务实例列表。

Consul 具有强大的健康检查功能。它可以通过多种方式检查服务的健康状况,如 HTTP 健康检查(定期发送 HTTP 请求到服务的健康检查端点)、TCP 健康检查(检查服务的 TCP 端口是否可访问)等。如果一个服务实例在多次健康检查中都没有响应,Consul 会将其标记为不健康,并在服务发现过程中排除这个实例,从而保证服务调用的可靠性。

Spring Cloud Consul 的配置管理功能支持将配置数据存储在 Consul 的键值存储中。配置数据可以按照层次结构进行组织,方便管理和分类。

例如,可以将不同环境(开发、测试、生产)下的配置分别存储在不同的键值路径下,如 “/configs/dev - application” 和 “/configs/prod - application”。微服务可以通过简单的配置来从 Consul 中获取自己所需的配置,并且支持配置的版本控制和动态更新。

与其他配置管理工具相比,Consul 的配置管理更加灵活和易于集成,它可以与 Spring Boot 的配置加载机制无缝配合,使得微服务能够方便地获取和更新配置。

Consul 使用 Raft 协议来实现分布式一致性。Raft 协议确保在集群环境下,服务注册信息、配置信息等数据在多个 Consul 节点之间能够保持一致。

例如,当一个服务在一个 Consul 节点上进行注册后,通过 Raft 协议,这个注册信息会被复制到其他 Consul 节点上,保证所有节点上的服务目录都是一致的。这使得 Consul 在分布式环境下具有高可用性和数据的可靠性,即使部分节点出现故障,系统仍然能够正常运行并提供准确的服务发现和配置管理服务。

与 Spring Cloud Gateway 集成,作为 API 网关的服务发现后端。Spring Cloud Gateway 可以利用 Consul 的服务发现功能来路由请求到不同的服务实例。

与 Spring Cloud Sleuth 集成实现分布式链路追踪。通过在服务调用过程中传递相关的追踪信息,并将这些信息存储在 Consul

1.3 Spring Cloud Zookeeper

Spring Cloud Zookeeper 利用 Zookeeper 的节点(znode)层次结构来实现服务注册与发现。当一个服务启动时,它会在 Zookeeper 的节点树下创建一个临时节点,节点的路径通常包含服务名称、实例的主机地址和端口号等信息。这个临时节点就代表了该服务实例在 Zookeeper 中的注册信息。

例如,对于一个名为 “user - service” 的服务,可能会在 Zookeeper 中创建一个类似于 “/services/user - service/instance - 1” 的节点,其中 “instance - 1” 可以是服务实例的标识,节点的数据部分可能包含服务实例的详细信息,如 IP 地址(“192.168.1.100”)和端口号(“8080”)。

服务消费者通过查询 Zookeeper 的节点树来获取服务实例列表。当服务实例出现故障或关闭时,对应的临时节点会自动被 Zookeeper 删除,从而实现服务实例的动态发现和故障检测。

Spring Cloud Zookeeper 可以用于分布式配置管理。配置信息可以存储在 Zookeeper 的节点中,以键值对或层次结构的形式存在。微服务可以从 Zookeeper 中读取配置信息来配置自身的运行参数。

例如,一个微服务的数据库连接配置(如数据库 URL、用户名和密码)可以存储在 Zookeeper 的特定节点下,如 “/configs/mydatabase”,微服务启动时从这个节点获取配置并加载。

它支持配置的动态更新。当配置信息在 Zookeeper 中发生变化时,微服务可以通过监听相关节点的变化事件来获取最新的配置,从而实现配置的热更新,而不需要重新启动服务。

与 Spring Cloud Ribbon 集成实现负载均衡。Ribbon 可以从 Zookeeper 获取服务实例列表,然后根据配置的负载均衡策略(如轮询、随机等)将请求分配到不同的服务实例上。

与 Spring Cloud Hystrix 集成实现容错处理。当服务调用出现故障时,Hystrix 可以采取相应的降级策略,如返回默认值或从缓存中获取数据,以避免故障的蔓延。

2.服务调用与负载均衡

2.1 Spring Cloud Ribbon(客户端负载均衡)

Ribbon 是一个客户端负载均衡器,它运行在服务消费者端。当服务消费者需要调用某个服务时,Ribbon 会从服务注册中心(如 Eureka)获取可用的服务实例列表。然后,根据配置的负载均衡策略,从列表中选择一个服务实例来发送请求。

例如,假设有 3 个相同的商品服务实例(Instance1、Instance2、Instance3)注册在 Eureka 上,服务消费者(如订单服务)通过 Ribbon 获取商品服务列表。如果配置的是轮询策略,那么第一次请求会发送到 Instance1,第二次请求发送到 Instance2,第三次请求发送到 Instance3,以此类推,实现负载均衡。

负载均衡策略

轮询(RoundRobin):按照顺序依次选择服务实例,每个实例被选中的机会均等,是最常用的一种策略。

随机(Random):从服务列表中随机选择一个服务实例,这种策略简单直接,但可能导致某些实例被选中的概率不均匀。

加权轮询(Weighted RoundRobin):根据服务实例的性能或其他因素为其分配权重,权重高的实例被选中的概率更大。例如,性能较强的服务实例可以设置较高的权重,以接收更多的请求。

加权随机(Weighted Random):类似于加权轮询,不过是在随机选择的基础上考虑权重因素。

2.2 Spring Cloud Feign(声明式 REST 客户端)

Feign 是一个声明式的 REST 客户端,它使得服务之间的调用更加简单和直观。开发者只需要定义一个接口,并使用 Feign 注解来描述服务调用的相关信息,如服务名称、请求路径、请求方法等。Feign 会在运行时自动生成实现类,完成实际的服务调用。

例如,要调用商品服务的获取商品详情接口,定义如下 Feign 接口:

@FeignClient("product - service")
public interface ProductFeignClient {@RequestMapping(value = "/product/{id}", method = RequestMethod.GET)Product getProductById(@PathVariable("id") Long id);
}

其中@FeignClient("product - service")注解指定了要调用的服务名称为product - service@RequestMapping注解描述了请求路径和方法,getProductById方法定义了如何传递参数以及返回值类型。

Feign 内部集成了 Ribbon,因此可以利用 Ribbon 的负载均衡功能。当调用 Feign 接口时,Feign 会使用 Ribbon 从服务列表中选择一个合适的服务实例进行调用。这使得在进行服务调用时,无需额外编写负载均衡相关的代码,简化了开发流程。

Feign 还集成了 Hystrix(如果启用)来进行容错处理。当服务调用出现故障(如超时、异常等)时,Hystrix 会执行预设的降级策略。例如,可以在 Feign 接口中定义一个降级方法:

@FeignClient(name = "product - service", fallback = ProductFeignClientFallback.class)
public interface ProductFeignClient {...
}

这里fallback属性指定了一个降级类ProductFeignClientFallback,当服务调用出现问题时,会调用这个降级类中的方法来返回一个默认值或者执行其他替代逻辑。

3.容错与限流

3.1 Spring Cloud Hytrix

容错机制(Hystrix)

原理与作用:Hystrix 主要通过断路器模式来实现容错。它会对每个服务调用进行监控,统计调用的成功率、响应时间等指标。当这些指标超出预设的阈值(如失败率超过 50%)时,断路器会从 “闭合” 状态转换为 “打开” 状态。在 “打开” 状态下,后续的请求会直接执行降级逻辑,而不会再去尝试调用可能出现故障的服务。

降级策略:

返回默认值:例如,在调用商品服务获取商品价格时,如果商品服务出现故障,返回一个预设的默认价格。

从缓存获取数据:如果之前缓存了部分数据,可以从缓存中获取数据作为降级后的返回值。

友好提示:向用户返回一个友好的错误提示信息,如 “系统繁忙,请稍后再试”。

配置参数:可以通过配置文件来设置 Hystrix 的各种参数,如断路器的阈值、超时时间等。例如,在 application.yml 文件中:

hystrix:command:default:execution:isolation:thread:timeoutInMilliseconds: 2000 # 设置超时时间为2秒

限流机制(Sentinel 等)

原理与目的:限流是为了防止过多的请求涌入系统,导致系统崩溃。通过限制单位时间内的请求数量,保证系统的稳定性。Sentinel 是 Spring Cloud Alibaba 提供的一个轻量级流量控制框架,它可以对服务的流量进行实时监控和控制。

工作方式:Sentinel 通过统计请求的流量指标(如 QPS - 每秒查询率),当流量超过预设的阈值时,根据配置的限流策略进行处理。例如,可以采用直接拒绝策略,当请求流量超过阈值时,直接拒绝新的请求;也可以采用排队等待策略,让请求在队列中等待,直到有资源可以处理。

与 Spring Cloud 的集成:在 Spring Cloud 应用中,通过引入 Sentinel 相关的依赖,并进行简单的配置,就可以实现对服务的限流。例如,在配置文件中设置服务的限流阈值:

spring:cloud:sentinel:flow:rules:- resource: product - service # 服务名称limitApp: default # 应用名称grade: 1 # 限流模式(QPS模式)count: 100 # 限流阈值(QPS为100)

4.API 网关

4.1 Spring Cloud Zuul

功能概述:Zuul 是一个传统的 API 网关,它位于微服务架构的前端,作为外部请求进入系统的统一入口。Zuul 可以实现请求路由、过滤等功能。它可以将外部请求根据请求路径、请求头信息等路由到不同的微服务,同时可以对请求进行安全验证、限流、日志记录等过滤操作,保护微服务的安全和稳定。

请求路由:Zuul 维护了一个路由规则表,根据请求的路径、方法等信息,将请求转发到对应的微服务。例如,如果一个请求的路径是 “/product” 开头,Zuul 会将这个请求转发到商品服务。可以通过配置文件来设置路由规则,如在 application.yml 文件中:

zuul:routes:product - service:path: /product/**serviceId: product - service # 对应的服务名称

请求过滤:Zuul 通过过滤器来实现对请求的预处理和后处理。例如,可以编写一个过滤器来检查请求是否携带有效的令牌,只有携带有效令牌的请求才能被转发到微服务。Zuul 提供了四种类型的过滤器:前置过滤器(在请求路由之前执行)、后置过滤器(在请求路由之后执行)、路由过滤器(用于处理请求路由本身)和错误过滤器(在请求处理过程中出现错误时执行)。

5.分布式配置管理

5.1 Spring Cloud Config

集中式配置中心概念

Spring Cloud Config 提供了一个集中式的配置中心,用于管理微服务的所有配置文件。它将配置文件存储在一个或多个配置仓库(如 Git)中,这样可以方便地对配置进行版本控制和修改。所有的微服务可以从配置中心获取自己所需的配置信息,实现配置的统一管理。

配置获取与动态刷新

获取配置:微服务在启动时,会通过配置中心客户端从配置中心获取配置。配置中心客户端会根据微服务的配置需求(如应用名称、环境等)从配置仓库中拉取相应的配置文件。例如,在微服务的 application.yml 文件中配置配置中心的地址和应用名称:

spring:cloud:config:uri: http://config - server:8888 # 配置中心服务器地址name: my - application # 应用名称profile: dev # 环境(开发环境)

动态刷新:当配置中心的配置文件发生修改时,微服务可以通过配置中心客户端实现配置的动态刷新。这通常需要在微服务中添加@RefreshScope注解来标记需要动态刷新配置的组件。例如,对于一个配置了数据库连接信息的数据源组件,可以这样配置:

@Configuration
@RefreshScope
public class DataSourceConfig {...
}

这样,当配置中心的数据库连接配置发生变化时,数据源组件可以在不重启微服务的情况下获取到新的配置并更新。

6.链路追踪与监控

6.1 Spring Cloud Sleuth

链路追踪(Sleuth)

目的与原理:在分布式系统中,一个请求可能会经过多个微服务,链路追踪的目的是跟踪这个请求在各个微服务之间的调用路径和耗时情况。Sleuth 通过在请求头中添加一些追踪信息(如 Trace ID、Span ID 等)来实现链路追踪。Trace ID 用于唯一标识一个请求的整个链路,Span ID 用于标识请求在每个微服务中的处理阶段。

与日志系统的集成:Sleuth 可以与日志系统(如 Logback)集成,将追踪信息记录到日志中。这样,通过查看日志,就可以了解请求在各个微服务中的详细处理过程。例如,在 Logback 的配置文件中,可以配置日志格式,包含 Sleuth 的追踪信息:

<encoder><pattern>%d{HH:mm:ss.SSS} [%X{traceId}/%X{spanId}] % - 5level %logger{36} - %msg%n</pattern>
</encoder>

6.2 Spring Boot Actuator

监控(Spring Boot Actuator 等)

监控指标与端点:Spring Boot Actuator 提供了一系列的端点来暴露微服务的监控指标,如健康检查端点(/health)、性能指标端点(/metrics)等。这些端点可以提供关于微服务的运行状态、资源使用情况(如内存、CPU 等)、请求处理情况(如请求次数、响应时间等)等信息。

可视化监控工具(如 Prometheus + Grafana):可以将 Actuator 暴露的监控指标收集到 Prometheus 等监控系统中,然后通过 Grafana 等可视化工具进行展示。例如,在 Grafana 中,可以创建仪表盘来展示各个微服务的 CPU 使用率、内存占用、请求 QPS 等指标的变化趋势,方便运维人员及时发现系统的异常情况。

7.事件总线与消息分发

7.1 Spring Cloud Bus

事件总线(Spring Cloud Bus)

概念与作用:Spring Cloud Bus 是一个用于在分布式系统中传播状态变更的工具。它可以将一个微服务中的配置变更、事件等信息广播到其他相关的微服务,实现系统中各个部分的同步更新。例如,当配置中心的配置发生变更时,通过 Spring Cloud Bus 可以将这个变更消息发送到所有使用该配置的微服务,触发它们进行配置更新。

与消息队列的集成:Spring Cloud Bus 通常会与消息队列(如 RabbitMQ 或 Kafka)集成。当有事件需要广播时,事件信息会被发送到消息队列中,其他微服务作为消息队列的消费者,接收并处理这些事件。这样可以保证事件的可靠传递和异步处理。

7.2 Spring Cloud Stream

消息分发(Spring Cloud Stream)

基本原理:Spring Cloud Stream 是一个构建消息驱动微服务的框架。它提供了一个统一的编程模型,用于在微服务之间发送和接收消息,而不依赖于特定的消息队列实现。通过定义输入通道和输出通道微服务可以轻松地与不同的消息队列进行集成。

绑定器(Binder)概念:Spring Cloud Stream 使用绑定器来实现与不同消息队列的连接。绑定器是一个抽象层,它隐藏了消息队列的具体实现细节。例如,当需要从 RabbitMQ 切换到 Kafka 时,只需要更换绑定器,而不需要修改大量的消息发送和接收代码。


http://www.ppmy.cn/ops/144683.html

相关文章

Java 网络初始 ①-OSI七层网络模型 || 网络通信 || 五元组 || 协议分层

这里是Themberfue 在上一节中&#xff0c;我们了解到 网络 是如何顺应历史发展到至今的 今天我们将正式进入到 网络 的学习中~~~ 网络通信 在早期的计算机中&#xff0c;每个计算机都是相互独立的&#xff0c;若想协同进行某一项目的开发时&#xff0c;必须等待另一台计算机的…

高考志愿填报:如何制定合理的志愿梯度?

高考志愿填报中常见的避雷行为&#xff0c;深入分析了专业选择、招生政策了解、学校选择、备选方案准备以及防诈骗等方面的关键问题&#xff0c;并提出了针对性的建议与策略。旨在为考生和家长提供实用的指导&#xff0c;助力考生科学合理地填报高考志愿&#xff0c;避免陷入各…

Latex+VsCode+Win10搭建

最近在写论文&#xff0c;overleaf的免费使用次数受限&#xff0c;因此需要使用本地的形式进行编译。 安装TEXLive 下载地址&#xff1a;https://mirror-hk.koddos.net/CTAN/systems/texlive/Images/ 下载完成直接点击iso进行安装操作。 安装LATEX Workshop插件 设置VsCode文…

T527-----音频调试

一、audiocodec audiocodec是具有数模转换功能的内置模块&#xff0c;可将音频数字信号转换成模拟信号发送出去&#xff0c;通常接耳机、扬声器等 1、音频流通路 播放流&#xff1a; Playback ──> DACL ──> LINEOUTL ──> SPKPlayback ──> DACR ──>…

AI Agent 与 Agentic AI的区别

1. AI代理 (AI Agents) 定义&#xff1a; AI代理是设计用于在受控环境中执行特定任务或一组任务的目标驱动型AI系统。它们在预定义的参数内操作&#xff0c;根据设定的目标执行任务&#xff0c;并通常依赖明确的指令或规则指导行为。 主要特征&#xff1a; 以目标为导向&…

宠物用品电子商务系统|Java|SSM|VUE| 前后端分离

【技术栈】 1⃣️&#xff1a;架构: B/S、MVC 2⃣️&#xff1a;系统环境&#xff1a;Windowsh/Mac 3⃣️&#xff1a;开发环境&#xff1a;IDEA、JDK1.8、Maven、Mysql5.7 4⃣️&#xff1a;技术栈&#xff1a;Java、Mysql、SSM、Mybatis-Plus、VUE、jquery,html 5⃣️数据库可…

剑指Offer 两数之和 - 输入有序数组

题目链接 剑指Offer 两数之和 - 输入有序数组 思路 思路一 暴力 两层循环&#xff0c;外层循环固定一个值(value)&#xff0c;内层循环寻找是否存在target-value&#xff0c;若存在就返回 public int[] twoSum(int[] numbers,int target){int[] res new int[2];for(int i0;…

【CCNA网络】Multimode Fiber和Single Mode Fiber是什么?(MMF)(多模光纤)(SMF)(单模光纤)

考点浓缩&#xff1a; 多模光纤&#xff08;MMF&#xff09;和单模光纤&#xff08;SMF&#xff09;是两种常见的光纤类型。单模光纤具有较小的纤芯&#xff08;约8-10μm&#xff09;&#xff0c;适用于长距离、高带宽的传输&#xff08;如城际连接&#xff09;。多模光纤具有…