当前位置: 首页 > news >正文

JavaWeb学习------SpringCloud入门

        SpringCloud 是一系列框架的有序集合,它利用 SpringBoot 的开发便利性,巧妙地简化了分布式系统基础设施的开发。它为开发者提供了快速构建分布式系统中常见模式的工具,如配置管理、服务发现、断路器、智能路由、微代理、控制总线等。​SpringCloud 并非一个单一的框架,而是整合了众多成熟的开源项目,并基于 SpringBoot 进行封装,使得这些项目能够更好地协同工作,为微服务架构提供了完整的解决方案。它基于 SpringBoot 的自动配置特性,降低了开发者使用这些分布式系统工具的门槛,让开发者可以专注于业务逻辑的实现,而无需过多关注底层基础设施的搭建和维护。

        在微服务架构中,各个微服务之间需要进行通信、协作,同时还面临着服务治理、负载均衡、容错、配置管理等一系列问题。SpringCloud 的主要作用就是为这些问题提供标准化的解决方案,具体如下:

(1)服务治理:实现服务的注册与发现,让微服务之间能够自动感知彼此的存在,简化服务之间的调用流程。​

(2)负载均衡:在多个服务实例之间合理分配请求流量,提高系统的吞吐量和可用性,避免单个服务实例过载。​

(3)容错机制:当某个服务出现故障时,能够快速响应并采取相应的容错措施,如服务降级、熔断等,防止故障扩散,保证系统的稳定性。​

(4)配置中心:集中管理各个微服务的配置信息,实现配置的动态更新,无需重启服务即可使配置生效,提高系统的灵活性和可维护性。​

(5)API 网关:提供统一的入口,对请求进行路由、过滤、认证授权等处理,简化客户端与微服务之间的交互,同时增强系统的安全性。​

(6)分布式追踪:对微服务之间的调用链路进行追踪,便于排查问题和分析系统性能瓶颈。

        SpringCloud 有五大核心组件,他们分别是:

        (一)服务注册与发现组件:Eureka

        Eureka 是 Netflix 开发的服务注册与发现组件,它主要用于实现微服务架构中的服务注册和发现功能。服务提供者在启动时会将自己的服务信息(如服务名称、IP 地址、端口号等)注册到 Eureka 服务器,服务消费者则可以从 Eureka 服务器获取服务提供者的信息,从而实现服务之间的调用。

        Eureka 采用了 C-S(Client-Server)架构,由 Eureka Server 和 Eureka Client 两部分组成:​

(1)Eureka Server:作为服务注册中心,负责接收服务提供者的注册信息,并维护服务注册表,同时向服务消费者提供服务发现功能。​

(2)Eureka Client:包括服务提供者和服务消费者。服务提供者客户端在启动时会向 Eureka Server 注册自己的服务信息,并定期发送心跳来续约服务。如果 Eureka Server 在一定时间内没有收到服务提供者的心跳,就会将该服务从服务注册表中移除。服务消费者客户端会定期从 Eureka Server 获取服务注册表,并缓存到本地,以便在调用服务时能够快速找到服务提供者。

        Eureka会带来许多好处,例如:

(1)Eureka Server 支持集群部署,通过相互注册实现数据同步,当其中一台服务器出现故障时,其他服务器可以继续提供服务,保证了服务注册中心的高可用性。​

(2)Eureka Client 在获取服务注册表后会进行本地缓存,即使 Eureka Server 暂时不可用,服务消费者仍然可以基于本地缓存进行服务调用。​

(3)服务提供者可以自动注册到 Eureka Server,服务消费者可以自动发现服务提供者,简化了服务调用的配置。​

        但其也有一些缺点,如:​

(1)一致性较差:Eureka 强调的是可用性和分区容错性,在一致性方面表现相对较弱。当服务注册表发生变化时,数据同步到所有 Eureka Server 节点可能存在一定的延迟。​

(2)不适合大规模服务集群:在服务数量非常多的情况下,Eureka Server 的性能可能会受到一定影响,需要进行合理的集群规划和优化。

        (二)负载均衡组件:Ribbon

        Ribbon 是 Netflix 提供的一款客户端负载均衡工具,它可以在客户端侧实现服务的负载均衡。当服务消费者需要调用服务提供者时,Ribbon 会从 Eureka Server 获取服务提供者的列表,然后根据一定的负载均衡策略选择一个合适的服务实例进行调用。     

        Ribbon 的核心原理是通过拦截器对 RestTemplate 的请求进行拦截,在请求发送之前,根据服务名称从服务注册表中获取可用的服务实例列表,然后根据配置的负载均衡策略选择一个服务实例,并将请求的 URL 替换为该服务实例的实际地址,从而实现负载均衡。​Ribbon 提供了多种负载均衡策略,如轮询、随机、权重等。默认情况下,Ribbon 采用的是轮询策略。

        Ribbon的优点主要有:

(1)客户端侧负载均衡:无需额外的负载均衡服务器,减轻了服务器的压力。​

(2)多种负载均衡策略:可以根据实际需求选择合适的负载均衡策略,灵活性高。​

(3)易于集成:与 SpringCloud 生态中的其他组件(如 Eureka、Feign 等)无缝集成,使用简单。​

        而其缺点则有:​

(1)配置相对繁琐:如果需要自定义负载均衡策略,需要进行较多的配置。​

(2)客户端需要维护服务列表:虽然 Ribbon 会从 Eureka Server 获取服务列表并缓存,但在服务列表变化频繁的情况下,可能会存在一定的延迟。

        (三)服务调用组件:Feign

        Feign 是一个声明式的 Web 服务客户端,它使得编写 Web 服务客户端变得更加简单。通过 Feign,开发者只需要定义一个接口,并在接口上添加相应的注解,就可以实现对服务提供者的调用,而无需手动编写大量的 RestTemplate 代码。

        Feign 的核心原理是基于接口的动态代理。当开发者定义一个 Feign 接口并添加 @FeignClient 注解后,Feign 会根据接口的定义生成一个动态代理对象。当调用该接口的方法时,动态代理对象会将方法调用转换为 HTTP 请求,并根据注解中的信息(如服务名称、请求路径、请求方法等)构建请求 URL,然后通过 Ribbon 进行负载均衡,选择合适的服务实例发送请求,最后将响应结果转换为方法的返回值。

        Feign组件的优点主要有:

(1)声明式 API:采用接口加注解的方式,代码简洁,可读性高,降低了开发成本。​

(2)集成 Ribbon:自动集成了 Ribbon 的负载均衡功能,无需额外配置。​

(3)集成 Hystrix:可以与 Hystrix 无缝集成,实现服务的熔断和降级。

        但其缺点则有:

(1)灵活性相对较低:对于一些复杂的 HTTP 请求场景,可能需要进行较多的自定义配置。​

(2)性能有一定损耗:由于采用了动态代理和反射等技术,在性能上可能会比直接使用 RestTemplate 略有损耗。

        (四)熔断与降级组件:Hystrix

        微服务架构中,服务之间的依赖关系非常复杂,当某个服务出现故障或响应延迟时,可能会导致依赖它的其他服务也出现故障,甚至引发级联故障,导致整个系统崩溃。Hystrix 是一款用于处理分布式系统延迟和容错的开源库,它通过熔断、降级、隔离等机制,防止故障扩散,保证系统的稳定性。

        Hystrix 的核心原理是 “舱壁模式” 和 “熔断器模式”,他们分别是:​

(1)舱壁模式:Hystrix 为每个依赖服务创建一个独立的线程池,这样当某个依赖服务出现故障时,只会影响该线程池中的线程,而不会影响其他服务的线程,实现了服务之间的隔离。​

(2)熔断器模式:Hystrix 会监控服务调用的成功率和响应时间。当服务调用失败率达到一定阈值或响应时间过长时,熔断器会打开,此时所有对该服务的调用都会直接返回失败,而不会实际去调用服务。经过一段时间后,熔断器会进入半开状态,允许部分请求去调用服务,如果这些请求成功,则熔断器关闭,恢复正常调用;如果仍然失败,则熔断器继续保持打开状态。

        它的优点主要有:​

(1)防止故障扩散:通过熔断和隔离机制,避免了一个服务的故障影响整个系统。​

(2)提高系统可用性:当服务不可用时,通过降级策略返回一个默认的响应,保证用户体验。​

(3)监控与告警:提供了丰富的监控指标和告警功能,便于开发者及时发现和解决问题。​

        而缺点则有:​

(1)增加了系统复杂性:引入 Hystrix 后,需要对线程池、熔断器等进行配置和管理,增加了系统的复杂性。​

(2)可能导致资源消耗增加:每个依赖服务都需要一个独立的线程池,在服务数量较多的情况下,可能会消耗较多的系统资源。

        (五)API 网关组件:Zuul/Gateway

        API 网关是微服务架构中的一个重要组件,它作为客户端与微服务之间的中间层,提供了统一的入口。API 网关可以实现请求路由、负载均衡、认证授权、限流熔断、日志监控等功能,简化了客户端与微服务之间的交互,同时增强了系统的安全性和可管理性。​在 SpringCloud 中,早期常用的 API 网关是 Zuul,而目前更推荐使用功能更强大的 Spring Cloud Gateway。​

        Zuul 基于 Servlet 实现,采用的是阻塞式 I/O 模型。它通过一系列的过滤器(Filter)来实现各种功能,如请求路由、认证授权等。当请求到达 Zuul 网关时,会经过前置过滤器、路由过滤器、后置过滤器等一系列过滤器的处理,最终将请求路由到相应的微服务。​

       而Spring Cloud Gateway 是基于 Spring Framework 5、Project Reactor 和 Spring Boot 2 构建,采用的是非阻塞式 I/O 模型,性能相较于Zuul更优。它通过路由(Route)、断言(Predicate)和过滤器(Filter)来实现功能。路由是网关的基本构建块,由 ID、目标 URI、断言集合和过滤器集合组成。当请求到达网关时,网关会根据断言判断该请求是否匹配某个路由,如果匹配,则通过过滤器处理后将请求转发到目标 URI 对应的微服务。

        二者的优点分别有:

        Zuul:

(1)易于集成:与 SpringCloud 生态中的其他组件集成简单。​

(2)功能丰富:提供了多种过滤器,可以实现各种需求。

        Spring Cloud Gateway :​

(1)性能优异:基于非阻塞式 I/O 模型,性能比 Zuul 更好。​

(2)功能强大:支持动态路由、熔断、限流等多种功能,且配置灵活。​

(3)易于扩展:基于 Spring 生态,易于扩展和定制。

        而二者的缺点分别是:

        Zuul :​

(1)性能较差:基于 Servlet 的阻塞式 I/O 模型,在高并发场景下性能表现不佳。​

(2)扩展性有限:过滤器的扩展相对复杂。

        Spring Cloud Gateway :​学习成本较高,对于新手来说,理解和使用 Spring Cloud Gateway 的一些概念和配置可能需要一定的时间。

        SpringCloud 作为微服务架构的核心引擎,为开发者提供了一套完整的微服务解决方案,涵盖了服务注册与发现、负载均衡、服务调用、熔断降级、API 网关、配置中心等关键功能。在实际开发中,我们需要根据项目的需求和特点,合理选择和配置 SpringCloud 的组件,以构建稳定、高效、可扩展的微服务系统。        

http://www.lryc.cn/news/609237.html

相关文章:

  • 最小半径覆盖问题【C++解法+二分+扫描线】
  • 研报复现|史蒂夫·路佛价值选股法则
  • [硬件电路-138]:模拟电路 - 什么是正电源?什么是负电源?集成运放为什么有VCC+和VCC-
  • 【RH124 问答题】第 8 章 监控和管理 Linux 进程
  • MySQL学习之MVCC多版本并发控制
  • 浅谈Python中的os.environ:环境变量交互机制
  • [硬件电路-141]:模拟电路 - 源电路,信号源与电源,能自己产生确定性波形的电路。
  • IO流-数据流
  • LLM的训练:RLHF及其替代方案
  • 2025年6月电子学会青少年软件编程(C语言)等级考试试卷(七级)
  • 当Windows远程桌面出现“身份验证错误。要求的函数不受支持”的问题
  • 电机结构设计与特性曲线分析:基于MATLAB和FEMM的仿真研究
  • 【软考中级网络工程师】知识点之 IS-IS 协议
  • AI Agent 重塑产业发展新格局
  • SpringAI的使用
  • 图像张量中的通道维度
  • 【C 学习】04.1-数字化基础
  • Spring Boot 整合 Minio 实现高效文件存储解决方案(本地和线上)
  • Monaco Editor 开发流程详解
  • Flutter Dart类的使用
  • Redisson高并发实战:守护Netty IO线程的关键指南
  • 一加Ace5无法连接ColorOS助手解决(安卓设备ADB模式无法连接)
  • 【MySQL】MySQL 中的数据排序是怎么实现的?
  • FreeRTOS源码分析三:列表数据结构
  • 深度学习-读写模型网络文件
  • 03.一键编译安装Redis脚本
  • 07.config 命令实现动态修改配置和慢查询
  • ThinkPHP8.x控制器和模型的使用方法
  • VUE-第二季-01
  • 【实习总结】Qt通过Qt Linguist(语言家)实现多语言支持