前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦 💕

共同探索软件研发!敬请关注【宝码香车】
关注描述

csdngif标识


📚📗📕📘📖🕮💡📝🗂️✍️🛠️💻🚀🎉🏗️🌐🖼️🔗📊👉🔖⚠️🌟🔐⬇️·正文开始⬇️·🎥😊🎓📩😺🌈🤝🤖📜📋🔍✅🧰❓📄📢📈 🙋0️⃣1️⃣2️⃣3️⃣4️⃣5️⃣6️⃣7️⃣8️⃣9️⃣🔟🆗*️⃣#️⃣

【热门主题】000047 Spring Cloud:微服务架构的强大引擎

📚一、Spring Cloud 概述

Spring Cloud 是一套基于 Spring Boot 的工具,用于快速构建分布式系统,通过整合多种微服务框架和库,简化分布式系统常见问题的解决过程。
Spring Cloud 包含了一系列的子项目,这些子项目可以大致分为两类。一类是对现有成熟框架进行 “Spring Boot 化” 的封装和抽象,这也是数量最多的项目类别。例如,Spring Cloud Netflix 是对 Netflix 开发的一套分布式服务框架的封装,其中包括服务的发现和注册、负载均衡、断路器、REST 客户端、请求路由等功能。另一类是开发了一部分分布式系统的基础设施的实现,如 Spring Cloud Stream 扮演着类似于 Kafka、ActiveMQ 这样的角色。
对于想要快速实践微服务的开发者来说,第一类子项目通常就已经足够使用。Spring Cloud 的核心优势在于它能够在保留 Spring Boot 的开发风格的同时,实现服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等功能的一键部署。
据统计,使用 Spring Cloud 一站式解决方案,中小型互联网公司可以在从容应对业务发展的同时大大减少开发成本。随着近几年微服务架构和 Docker 容器概念的火爆,Spring Cloud 在未来越来越 “云” 化的软件开发风格中也将占有一席之地。它提供了标准化、全站式的技术方案,其意义可能堪比当年 Servlet 规范的诞生,有效推进服务端软件系统技术水平的进步。

📚二、Spring Cloud 的优势与劣势

📘(一)优势呈现

服务独立部署,耦合性低。
每个服务都是独立的项目,可以独立部署,不依赖于其他服务。这使得系统的各个部分之间的耦合度大大降低,当一个服务出现问题时,不会影响到其他服务的正常运行。例如,在一个电商系统中,商品服务、订单服务、用户服务等都可以独立部署,当商品服务出现问题时,订单服务和用户服务仍然可以正常为用户提供服务。
服务快速启动,依赖少代码量少。
服务拆分后,启动的速度必然比拆分前快很多。因为每个服务依赖的库少了,代码量也相应减少。这对于开发和测试过程来说非常重要,可以大大提高开发效率。比如,一个小型的微服务可能只需要几秒钟就可以启动起来,而一个大型的单体应用可能需要几分钟甚至更长时间。
适合敏捷开发,可快速发布新版本。
敏捷开发以用户的需求进化为核心,采用迭代、循序渐进的方法进行。服务拆分可以快速发布新版本,修改哪个服务只需要发布对应的服务即可,不用整体重新发布。这样可以更快地响应市场变化和用户需求,提高产品的竞争力。例如,当需要对某个功能进行优化时,只需要对相关的服务进行修改和发布,而不会影响到其他服务。
职责专一,便于团队分工。
业务发展迅速时,研发人员也会越来越多。每个团队可以负责对应的业务线,服务的拆分有利于团队之间的分工。每个服务都对应唯一的业务能力,做到单一职责,避免重复业务开发。这样可以提高开发效率,同时也可以提高代码的质量和可维护性。例如,在一个金融系统中,交易服务、结算服务、风控服务等可以由不同的团队负责开发和维护。
可按需扩容,提高资源利用率。
当某个服务的访问量较大时,我们只需要将这个服务扩容即可。可以根据实际需求动态地调整服务的规模,提高资源利用率。比如,在一个电商促销活动期间,订单服务的访问量可能会大幅增加,这时可以通过增加订单服务的实例数量来应对高并发的访问。
代码复用性高,接口提供基础服务。
每个服务都提供 REST API,所有的基础服务都必须抽出来,很多的底层实现都可以以接口方式提供。这使得代码的复用性大大提高,减少了重复开发的工作量。例如,一个用户服务可以提供用户注册、登录、查询等接口,其他服务可以通过调用这些接口来获取用户信息,而不需要在每个服务中都实现用户管理的功能。

📘(二)劣势分析

分布式部署,调用复杂。
在微服务架构中,每个服务都是独立部署的,通过 HTTP 来进行通信,这当中会产生很多问题,比如网络问题、容错问题、调用关系等。分布式部署增加了系统的复杂性,需要考虑网络延迟、故障转移、负载均衡等问题。例如,当一个服务调用另一个服务时,可能会因为网络故障而导致调用失败,需要进行重试和错误处理。
独立数据库带来分布式事务挑战。

每个微服务都有自己的数据库,这就是所谓的去中心化的数据管理。这种模式的优点在于不同的服务,可以选择适合自身业务的数据,比如订单服务可以用 MySQL、评论服务可以用 Mongodb、商品搜索服务可以用 Elasticsearch。缺点就是事务的问题了,目前最理想的解决方案就是柔性事务中的最终一致性。分布式事务需要保证多个服务之间的数据一致性,这是一个非常复杂的问题,需要使用一些特殊的技术和算法来解决。

测试难度提升,接口变动影响大。

服务和服务之间通过接口来交互,当接口有改变的时候,对所有的调用方都是有影响的,这时自动化测试就显得非常重要了。如果要靠人工一个个接口去测试,那工作量就太大了。这里要强调一点,就是 API 文档的管理尤为重要。接口的变动可能会导致多个服务出现问题,需要进行全面的测试和验证。例如,当一个服务的接口发生变化时,所有调用这个接口的服务都需要进行相应的修改和测试。

运维难度增加,服务增多监控复杂。

在采用传统的单体应用时,我们可能只需要关注一个 Tomcat 的集群、一个 MySQL 的集群就可以了,但这在微服务架构下是行不通的。当业务增加时,服务也将越来越多,服务的部署、监控将变得非常复杂。需要使用一些专门的工具和技术来管理和监控微服务,比如容器化技术、服务网格等。例如,在一个大型的微服务系统中,可能有几十个甚至上百个服务,需要对每个服务的性能、可用性、故障等进行实时监控和管理。

📚三、Spring Cloud 的主要组件

📘(一)Eureka

Eureka 是 Spring Cloud Netflix 项目的一部分,它是一个服务注册表,允许微服务注册自身并发现其他服务。就像一个微服务的电话簿,提供了服务与服务之间发现和注册的机制。
在设置 Eureka 服务器时,首先需要在 pom.xml 中添加 spring-cloud-starter-netflix-eureka-server 依赖项。然后,在 Spring Boot 应用程序的主要应用类中添加 @EnableEurekaServer 注解,启用 Eureka 服务器。最后,在 application.properties 文件中,定义 Eureka 服务器的属性,如端口、注册和获取注册表信息的设置等。
当微服务向 Eureka 服务器注册时,需要在 pom.xml 文件中添加 spring-cloud-starter-netflix-eureka-client 依赖项,在主要应用类中启用 Eureka 客户端,并在 application.properties 文件中定义 Eureka 服务器的 URL。
Eureka 还具有健康监控功能,服务会发送心跳以告知 Eureka 它们正在运行。如果 Eureka 在一定时间内未收到心跳,它将注销该服务。Eureka 服务器的仪表板可以通过特定地址访问,提供了一个可视化界面显示所有注册的服务及其详细信息。

📘(二)Ribbon

Spring Cloud Ribbon 是一个基于 HTTP 和 TCP 的客服端负载均衡工具,它是基于 Netflix Ribbon 实现的。理解 Ribbon 对于使用 Spring Cloud 来讲非常重要,因为负载均衡是对系统的高可用、网络压力的缓解和处理能力扩容的重要手段之一。
通过 ribbon 实现负载均衡,默认按照轮询方式。所谓轮询方式是:A,B 两个服务,对请求的处理方式是 AB,AB,AB…。第一个请求 A 处理;第二个请求 B 处理,总共 A,B 两个服务,到此第一轮询完成。第三个请求 A 处理,第四个请求 B 处理,到此第二轮询完成。以此类推。
例如,在一个案例中,我们创建多个微服务模块,包括注册中心、服务提供者和负载均衡的模块。通过配置文件和启动类的设置,使负载均衡模块能够调用服务提供者,并实现负载均衡的效果。在测试负载均衡时,可以通过反复调用特定接口,观察不同服务的响应情况,来验证负载均衡的能力。

📘(三)Hystrix

Hystrix 是断路器组件,在微服务架构中,当某个服务不可用,可能会导致多个服务故障,造成整个系统不可用的情况被称为雪崩效应。Spring Cloud 的防雪崩利器就是 Hystrix,它是基于 Netflix 对应的 Hystrix。
Hystrix 有多种作用,包括服务降级、服务熔断、依赖隔离和监控等。服务降级是指在调用一方服务的时候没有及时返回结果,或者调用失败等情况出现以后,系统将自动采取另外一只预备方案进行处理,优先核心服务,非核心服务不可用或弱可用。服务熔断是当指定时间内的请求失败率达到设定阈值时,系统通过断路器直接将此请求链路断开。依赖隔离可以防止某个服务的故障影响到其他服务。监控功能可以通过 Hystrix Dashboard 查看系统熔断情况。

📘(四)Feign

Feign 是声明式 HTTP 客户端,它简化了服务调用。和 Ribbon 一样,Feign 也运行在消费者端,使用 Ribbon 进行负载均衡,所以 Feign 直接内置了 Ribbon。进行服务间的调用有两种方式,包括 RestTemplate 和 Feign 两种,相对于 RestTemplate 的繁琐,使用 Feign 更加简洁。
在配置文件中加入 feign:hystrix:enabled:true,并在 feign 接口中加入 fallback 属性,可以实现服务降级。当调用服务出现问题时,可以通过 fallback 方法返回备用的结果,提高系统的容错性。

📘(五)Zuul

Zuul 是 API 网关,早期版本在微服务架构中起到了重要作用。它类似 nginx,具有反向代理的功能,不过 Netflix 自己增加了一些配合其他组件的特性。
Zuul 会向 Eureka 中进行注册,从而获取到 Eureka 中的所有注册信息,然后就可以进行路由映射。可以通过自定义路由代替微服务名称以及屏蔽自身真实服务名,也可以通过路由屏蔽指定的 URL,还可以屏蔽敏感请求头。Zuul 的过滤功能可以实现令牌桶限流、权限校验、灰度发布等。
由于 Zuul 作为网关存在单点问题,为了保证高可用,需要进行集群配置,可以借助额外的负载均衡器,如 Nginx。

📘(六)Spring Cloud Gateway

Spring Cloud Gateway 为 Spring Boot 应用提供了 API 网关支持,具有强大的智能路由与过滤器功能。它基于 Spring 5,Spring Boot 2 和 Project Reactor 等技术构建。
Spring Cloud Gateway 具有动态路由、可以对路由指定 Predicate(断言)和 Filter(过滤器)、集成 Hystrix 的断路器功能、集成 Spring Cloud 服务发现功能、易于编写的 Predicate 和 Filter、请求限流功能、支持路径重写等特性。
可以通过两种不同的配置路由方式,一种是通过 yml 文件来配置,另一种是通过 Java Bean 来配置。同时,Spring Cloud Gateway 中的过滤器分为两大类:GatewayFilter(局部路由)和 GlobalFilter(全局路由)。

📘(七)Spring Cloud Config

Spring Cloud Config 是配置中心,集中管理和动态刷新配置文件。它提供服务器端和客户端,服务器存储后端的默认实现使用 git,因此它轻松支持标签版本的配置环境,以及可以访问用于管理内容的各种工具。
但 Spring Cloud Config 是静态的,需要配合 Spring Cloud Bus 才能实现动态配置的更新。拥有 Spring cloud Bus 后,我们只需要创建一个简单的请求,并且加上 @ResfreshScope 注解就可以进行配置的动态修改了。

📚四、Spring Cloud 架构详解

📘(一)服务调用方与负载均衡

服务调用方通常是客户端或者其他微服务,它们通过接口来发起服务请求。在传统架构中,nginx 常被用作负载均衡器,将请求分发到不同的网关实例上,避免单个网关承受过大压力。这样可以确保请求能够均匀地分配到各个服务实例上,提高系统的整体性能和可靠性。例如,在一个电商平台中,当用户发起商品查询请求时,服务调用方会通过接口将请求发送到 nginx,nginx 再根据负载均衡策略将请求转发到不同的网关实例上。

📘(二)网关

网关作为服务的入口,接收来自外部的请求。当网关接收到请求后,它会从注册中心查询请求对应的服务信息。注册中心存储了所有服务的信息,包括服务名称、IP 地址、端口号等。网关根据查询到的服务信息,通过负载均衡策略调用具体的服务。例如,Spring Cloud Gateway 可以根据请求的特定条件(如 URL 路径、请求参数、请求头等)来将请求转发到后端的多个服务,并支持动态路由配置。

📘(三)注册中心

注册中心是 Spring Cloud 架构中的重要组成部分,它负责存储所有服务的信息。注册中心就像一个服务的目录,方便网关查询请求对应的服务。常见的注册中心有 Eureka 和 Consul 等。以 Eureka 为例,服务提供者在启动时会将自己的信息注册到 Eureka 服务器上,服务消费者可以从 Eureka 服务器获取服务提供者的信息。这样,当服务提供者的 IP 地址或端口号发生变化时,服务消费者可以通过注册中心动态地获取最新的服务信息,而不需要手动修改配置文件。

📘(四)服务负载均衡调用

在 Spring Cloud 中,对多份服务实现负载均衡调用是非常重要的。例如,Ribbon 和 Feign 都可以实现服务的负载均衡调用。Ribbon 是一个客户端负载均衡器,它可以在客户端实现对多个服务实例的负载均衡。Feign 是一个声明式的 HTTP 客户端,它内置了 Ribbon,可以更加方便地实现服务的负载均衡调用。例如,在一个电商平台中,订单服务可能有多个实例,当用户下单时,服务调用方可以通过 Ribbon 或 Feign 实现对订单服务的负载均衡调用,确保请求能够均匀地分配到各个订单服务实例上。

📘(五)服务提供方

服务提供方是具体的服务提供者,如消息服务、账单服务等。服务提供方在启动时会将自己的信息注册到注册中心上,以便服务调用方能够找到它们。服务提供方通常会实现具体的业务逻辑,并对外提供 RESTful API 接口。例如,在一个电商平台中,商品服务提供方负责提供商品信息的查询、添加、修改和删除等功能。

📘(六)服务熔断、降级、限流、监控

熔断:当服务被大量请求击溃时,服务熔断机制会启动,进行自我保护,快速返回错误结果。部分服务还具有半熔断状态,会尝试恢复服务。例如,Hystrix 是一个用于处理分布式系统的延迟和容错的开源库,它可以实现服务熔断。当某个服务的错误率达到一定阈值时,Hystrix 会自动熔断该服务,避免故障扩散。据统计,在一个高并发的系统中,使用 Hystrix 可以有效地降低系统的故障率,提高系统的稳定性。
降级:当服务不可用时,降级机制会提供兜底服务,返回备用结果。例如,当订单服务不可用时,可以返回一个提示信息,告诉用户订单服务暂时不可用,请稍后再试。降级可以保证系统在部分服务不可用时,仍然能够提供一定的服务,提高系统的可用性。
限流:限流机制可以控制请求量,确保部分请求能得到正确结果。例如,Spring Cloud Gateway 支持通过配置限流规则,对请求进行限流。当请求量超过一定阈值时,网关会拒绝部分请求,以保护服务不被过多的请求压垮。据测试,在一个高并发的系统中,合理的限流规则可以有效地提高系统的稳定性和性能。
监控:监控功能可以查看服务的请求情况,搭建服务监控以观察完整调用链路。例如,Hystrix Dashboard 可以实时监控服务的熔断情况、请求量、错误率等指标。通过监控,我们可以及时发现系统中的问题,并采取相应的措施进行解决。

📘(七)统一配置文件

统一配置文件方便管理多个服务的配置文件,避免手动修改每个服务的配置。Spring Cloud Config 是一个配置中心,它可以集中管理和动态刷新配置文件。服务提供者和服务消费者可以从配置中心获取配置信息,而不需要在每个服务中都存储配置文件。这样可以提高配置文件的管理效率,降低配置文件的维护成本。

📘(八)分布式事务

分布式事务是解决服务调用中的事务一致性问题的关键。在微服务架构中,由于服务之间的调用是分布式的,传统的事务管理方式不再适用。Spring Cloud 提供了一些解决方案来解决分布式事务问题,例如通过简单注解实现分布式事务。例如,使用 @GlobalTransactional 注解可以在方法上开启全局事务,确保多个服务之间的事务一致性。据实践证明,在一个复杂的微服务系统中,合理使用分布式事务可以有效地提高系统的稳定性和数据的一致性。

📚五、Spring Cloud 实战案例与最佳实践

📘(一)设计模块化微服务

在实际的项目开发中,遵循单一职责原则设计模块化的微服务至关重要。例如,在一个电商系统中,可以将商品管理、订单处理、用户服务等功能分别设计为独立的微服务。每个微服务专注于特定的业务功能,避免了功能的混乱和代码的臃肿。这样的设计使得团队能够独立地处理不同的功能模块,提高开发效率。同时,松耦合的微服务架构也便于进行功能扩展和维护。当需要对某个功能进行修改或升级时,只需要对相应的微服务进行调整,而不会影响到其他服务的正常运行。

📘(二)利用 Spring Boot 和 Spring Cloud

Spring Boot 为微服务提供了快速的开发环境,通过自动化配置大大减少了开发人员的工作量。而 Spring Cloud 则集成了众多模块,如 Eureka 实现服务发现、Ribbon 进行负载均衡、Hystrix 提供断路器功能、Config 进行集中化配置管理等。以一个在线教育平台为例,利用 Spring Cloud 的这些模块,可以轻松实现课程服务、学生服务、教师服务等微服务的注册、发现、调用以及容错处理。开发人员可以更加专注于业务逻辑的实现,而无需过多关注底层的技术细节。

📘(三)微服务容器化

使用 Docker 等容器化技术对微服务进行封装,可以确保不同环境下的部署一致性。在开发过程中,开发人员可以在本地使用 Docker 构建和运行微服务,与生产环境保持一致。同时,容器化简化了部署过程,提高了部署的效率和可靠性。例如,一个金融科技公司可以将其众多的微服务打包成 Docker 容器,快速部署到不同的服务器上。当业务需求增加时,可以轻松地增加容器的数量进行扩容,提高系统的处理能力。

📘(四)实施断路器模式

在分布式系统中,实施断路器模式可以有效地防止级联故障。以一个物流管理系统为例,当某个仓库服务出现故障时,如果没有断路器,可能会导致订单服务、运输服务等其他依赖该服务的微服务也出现故障,从而影响整个系统的正常运行。而使用 Spring Cloud Hystrix 实现的断路器模式,当检测到仓库服务出现故障时,会自动切断对该服务的调用,提供回退机制,减少故障对整个系统的影响。同时,断路器还可以在故障服务恢复后自动尝试重新连接,确保系统的稳定性。

📘(五)集中化配置管理

Spring Cloud Config 可以将配置从微服务中外部化,实现集中化的配置管理。例如,在一个社交网络平台中,不同的环境(开发、测试、生产)可能需要不同的配置参数,如数据库连接信息、缓存配置等。通过 Spring Cloud Config,可以将这些配置集中存储在 Git 仓库中,微服务在启动时从 Config Server 获取相应的配置信息。这样不仅简化了配置的维护工作,还可以实现动态更新配置而无需重启服务。同时,将敏感数据与代码存储库分离,增强了系统的安全性。

📘(六)确保服务发现

实现服务发现可以使微服务在不断变化的环境中动态地找到和通信。以一个智能家居系统为例,不同的设备服务(如灯光控制服务、温度调节服务、安全监控服务等)可以通过 Spring Cloud Netflix Eureka 或 Spring Cloud Consul 实现服务发现。当新的设备加入系统或者某个设备出现故障时,其他设备可以通过服务发现机制快速找到可用的服务,增强了系统的可扩展性和弹性。

📘(七)应用 API 网关

API 网关如 Spring Cloud Gateway 或 Spring Cloud Netflix Zuul 可以集中处理传入的 API 请求。在一个旅游预订平台中,API 网关可以集中处理身份验证、安全性和负载均衡等横切关注点。例如,当用户发起预订请求时,API 网关首先进行身份验证,确保用户的合法性。然后,根据请求的类型将请求转发到相应的微服务进行处理。同时,API 网关还可以实现负载均衡,将请求均匀地分配到各个微服务实例上,提高系统的性能和可靠性。

📘(八)日志聚合和监控

集中化的日志记录和监控对于了解微服务的健康状况和性能至关重要。利用 ELK 堆栈(Elasticsearch、Logstash、Kibana)或 Prometheus 和 Grafana 等工具,可以聚合来自各个微服务的日志和指标。例如,在一个在线医疗平台中,通过日志聚合可以快速定位系统中的问题,监控工具可以实时监测各个微服务的性能指标,如响应时间、吞吐量等。当某个微服务出现性能问题时,可以及时采取措施进行优化,确保系统的稳定运行。

📘(九)实施异步通信

使用 RabbitMQ 或 Apache Kafka 等消息代理实现微服务之间的异步通信,可以减少紧耦合并增强可扩展性。在一个电商物流系统中,订单服务可以将订单信息发送到消息队列中,运输服务和仓库服务可以从消息队列中获取订单信息进行处理。这样的异步通信方式提供了更好的容错性,即使某个服务出现故障,也不会影响其他服务的正常运行。同时,异步通信还支持事件驱动架构,当某个事件发生时,可以触发一系列的操作,提高系统的灵活性和响应速度。

📘(十)自动化测试和部署

开发人员应该始终实施自动化测试、持续集成(CI)和持续部署(CD)流程。自动化测试可以确保变更不会引入回归问题,例如使用 JUnit 和 Mockito 等工具进行单元测试和集成测试。持续集成和持续部署流程可以简化部署过程,使其更快速和可靠。以一个软件开发团队为例,通过使用 Jenkins 或 GitLab CI/CD 等工具,可以实现代码的自动构建、测试和部署。当开发人员提交代码后,系统会自动触发构建和测试流程,一旦测试通过,就会自动部署到生产环境中,提高了开发效率和系统的可靠性。

📚六、Spring Cloud 组件介绍

📘(一)Eureka 组件

简介:Netflix 开发的服务发现框架,Spring Cloud 集成后实现服务注册与发现。Eureka 就像是一个微服务的 “导航系统”,帮助各个微服务找到彼此并进行通信。它本身是一个基于 REST 的服务,在 Spring Cloud 中将它集成在其子项目 spring-cloud-netflix 中,以实现 Spring Cloud 的服务发现功能。目前 Eureka 项目相当活跃,代码更新频繁,最新版本不断带来更强的功能和更好的扩展性。
角色结构:包括注册服务、提供服务、消费服务三个角色。
注册服务:服务提供者在启动时,会通过 Eureka Client 向 Eureka Server 进行注册自己的信息,包括服务名、IP 地址、端口号、心跳周期等。例如,一个电商系统中的商品服务在启动时,会将自己的信息注册到 Eureka Server,以便其他服务能够发现它。
提供服务:注册后的服务提供者,随时准备接收来自服务消费者的请求,并提供相应的服务。比如商品服务在接收到查询商品信息的请求后,会返回相应的商品数据。
消费服务:服务消费者从 Eureka Server 获取服务列表,根据需要调用相应的服务。例如,订单服务在处理订单时,可能需要调用商品服务来获取商品信息,它会从 Eureka Server 获取商品服务的地址,然后发起调用。
核心概念:服务注册、续约、获取服务列表、下线、服务下线机制。
服务注册:服务提供者在启动会向 Eureka Server 注册信息,Eureka Server 获取注册请求,将服务实例信息存入到读写缓存中。
续约:服务提供者会定时向 Eureka Server 发送心跳,默认 30s。Eureka Server 收到心跳后,会更新对应的服务实例信息。如果服务的状态有变化,则将实例的变化加入到 “最近租约变更记录队列” 中。
获取服务列表:服务消费者根据 Eureka service id 向 Eureka Server 获取要访问服务的注册信息,第一次请求会一次性拉取对应 Eureka service id 的全部服务实例信息。Eureka Server 收到请求后,会首先在只读缓存查找,如果找到则直接返回,否则再查找读写缓存。如果找到则将再存入到只读缓存中,然后返回查找结果。服务消费者获取信息后,将服务实例信息缓存到本地,在使用时根据算法从 N 个服务中选取一个服务并向这个服务发送请求。
下线:服务实例下线,又分为两种。主动下线,在服务实例结束前,主动通知 Eureka Server,在默认配置下,此时服务消费者最长在 30s 左右知道此服务已经下线。被动下线,服务进度崩溃 / 网络异常,此时服务消费者最长在 (3 次心跳 + 一次刷新频率 30s)(共约 120s 左右)内知道此服务已经下线。
服务下线机制:Eureka Server 有个实例过期清理定时器,如果在指定时间内没有收到心跳 (默认 90s),则认为服务已经下线,会从读写缓存中移除此实例,将并此变化更新 “最近租约变更记录队列”。

📘(二)Ribbon 组件

基本概念:客户端负载均衡器,控制 HTTP 和 TCP 客户端访问。Ribbon 能够在消费者中对服务提供者进行负载均衡操作,默认是轮询的方式。例如,有两个服务提供者 A 和 B,当有请求到来时,Ribbon 会按照 AB、AB、AB…… 的顺序依次将请求分发到不同的服务提供者上,以实现负载均衡。
负载均衡分类:集中式和进程内,Ribbon 属于进程内方式。
集中式负载均衡:即在服务的消费方和提供方之间使用独立的负载均衡设施,可以是硬件如 F5,也可以是软件如 nginx。由该设施负责把访问请求通过某种请求策略转发至服务的提供方。
进程内负载均衡:将负载均衡逻辑集成在消费方,消费方从服务注册中心获取那些地址可用,然后自己再从这些地址选择出一个合适的服务器。Ribbon 就是属于进程内负载均衡,它只是一个类库,集成于消费方的进程,消费方通过它来获取到服务器的提供方地址。
负载策略:轮询、随机、重试等。
随机策略 ——RandomRule:随机选择一个服务提供者进行请求分发。
轮询策略 ——RoundRobinRule:注:Ribbon 默认策略。按照顺序依次选择服务提供者,例如 A、B、C 三个服务提供者,第一次请求分发到 A,第二次请求分发到 B,第三次请求分发到 C,然后再从 A 开始循环。
重试策略 ——RetryRule:当请求失败时,进行重试操作,尝试连接其他服务提供者。
最低并发策略 ——BestAvailableRule:过滤掉那些因为一直连接失败的被标记为 circuit tripped 的后端 server,并过滤掉那些高并发的的后端 server(active connections 超过配置的阈值)。性能仅次于最低并发策略。
可用过滤策略 ——AvailabilityFilteringRule:过滤掉那些因为一直连接失败的被标记为 circuit tripped 的后端 server,并过滤掉那些高并发的的后端 server(active connections 超过配置的阈值)。
响应时间加权策略 ——WeightedResponseTimeRule:每隔 30 秒计算一次服务器响应时间,以响应时间作为权重,响应时间越短的服务器被选中的概率越大。
区域权衡策略 ——ZoneAvoidanceRule:考虑服务器所在的区域,避免将请求集中分发到某个区域的服务器上,以实现更好的负载均衡效果。

📘(三)Feign 组件

基本概念:声明式 Web Service 客户端,简化开发。Feign 提供了一种声明式的方式来定义和实现服务间的调用,使得开发者可以像编写本地方法调用一样编写远程服务调用。例如,在一个电商系统中,订单服务需要调用商品服务的查询接口,使用 Feign 可以直接在订单服务的代码中定义一个与商品服务接口对应的方法,然后通过注解将其标记为远程调用,无需手动编写 HTTP 请求代码。
执行流程:通过注解开启扫描加载,生成请求模板,结合 Ribbon 实现负载均衡。
首先通过 @EnableFeignClients 注解开启 Feign 功能,程序启动时开启对 @FeignClient 注解的扫描。当接口的方法调用时,通过动态代理 SynchronousMethodHandler 生成具体的 RequestTemplate。在构建 RequestTemplate 的时候会进行参数解析,如果参数是 @RequestBody 的会调用 Encoder 的 encode 方法进行编码(BuildEncodedTemplateFromArgs)。
再根据 RequestTemplate 生成 HTTP 的 Request 对象,Request 对象交给 Client 处理,可配置 HttpURLConnection、HttpClient、OkHttp 等。Client 被封装到 LoadBalanceClient 类进行负载均衡,Object executeAndDecode (RequestTemplate template, Options options) throws Throwable 方法会调用 RequestInterceptor 的 apply 方法处理请求,之后才会进行请求发送。执行完之后调用 Decoder 的 decode 方法来进行解码。

📘(四)熔断器

服务熔断:快速切断故障服务,防止雪崩效应,指定时间后测试依赖是否恢复。当某个服务的单个点的请求故障会导致用户的请求处于阻塞状态,最终的结果就是整个服务的线程资源消耗殆尽。由于服务的依赖性,会导致依赖于该故障服务的其他服务也处于线程阻塞状态,最终导致这些服务的线程资源消耗殆尽,直到不可用,从而导致整个服务系统都不可用,即雪崩效应。为了防止雪崩效应,我们采用的熔断器 Hystrix。当服务的某个 API 接口的失败次数在一定时间内小于设定的阀值时,熔断器处于关闭状态,该 API 接口正常提供服务。当该 API 接口处理请求的失败次数大于设定的阀值时,Hystrix 判定该 API 接口出现了故障,打开熔断器,这时请求该 API 接口会执行快速失败的逻辑(即 fallback 回退的逻辑),不执行业务逻辑,请求的线程不会处于阻塞状态。处于打开状态的熔断器一段时间后会处于半打开的状态,并将一定数量的请求执行正常的逻辑。剩余的请求会执行快速失败,若执行正常逻辑的请求失败了,则熔断器继续打开;若成功了,则将熔断器关闭。
服务降级:高并发下根据业务情况降级部分服务,缓解服务器压力。当调用一方服务的时候没有及时返回结果,或者调用失败等情况出现以后,系统将自动采取另外一只预备方案进行处理,优先核心服务,非核心服务不可用或弱可用。例如,在电商促销活动期间,订单服务的访问量大幅增加,此时可以将一些非核心服务如商品推荐服务进行降级,以确保订单服务的正常运行。

📘(五)聚合监控简介

Dashboard 组件:监控断路器状态,提供数据监控和图形化界面。Hystrix Dashboard 可以实时监控服务的熔断情况、请求量、错误率等指标。通过监控,我们可以及时发现系统中的问题,并采取相应的措施进行解决。例如,在一个金融系统中,通过 Hystrix Dashboard 可以实时监控各个服务的运行状态,当发现某个服务的错误率过高时,可以及时进行调整,避免影响整个系统的稳定性。
Turbine 组件:聚合多个 Dashboard 监控,集中展示微服务熔断状况。Turbine 可以将多个服务的监控信息聚合到一起,方便进行统一的监控和管理。例如,在一个大型的微服务系统中,可能有几十个甚至上百个服务,通过 Turbine 可以将这些服务的监控信息集中展示,便于管理员快速了解整个系统的运行状况。

📘(六)Zuul 组件

基础概念:提供动态路由、监控、弹性、安全管控等功能。Zuul 网关主要提供动态路由,监控,弹性,安全管控等功能。在分布式的微服务系统中,系统被拆为了多个微服务模块,通过 zuul 网关对用户的请求进行路由,转发到具体的后微服务模块中。
作用:转发请求、聚合 API 接口、实现请求过滤和服务熔断降级。
转发请求:按照不同策略,将请求转发到不同的服务上去。例如,在一个电商系统中,用户的请求可能需要经过多个微服务的处理,Zuul 网关可以根据请求的类型和目的,将请求转发到相应的微服务进行处理。
聚合 API 接口:统一对外暴露,提高系统的安全性。将多个微服务的接口聚合到一起,对外提供统一的入口,减少了外部系统对微服务的直接访问,提高了系统的安全性。
实现请求过滤和服务熔断降级:实现请求统一的过滤,以及服务的熔断降级。例如,通过 Zuul 的过滤器,可以对请求进行权限校验、日志记录等操作。当某个微服务出现故障时,Zuul 可以实现服务熔断,快速返回错误结果,避免故障扩散。

📘(七)Config 组件

解决多服务相同配置管理问题,通用配置存储在统一地址,配置中心读取后以 RESTful 发布,服务调用接口获取配置信息。Spring Cloud Config 是配置中心,集中管理和动态刷新配置文件。它提供服务器端和客户端,服务器存储后端的默认实现使用 git,因此它轻松支持标签版本的配置环境,以及可以访问用于管理内容的各种工具。服务提供者和服务消费者可以从配置中心获取配置信息,而不需要在每个服务中都存储配置文件。这样可以提高配置文件的管理效率,降低配置文件的维护成本。例如,在一个电商系统中,不同的环境(开发、测试、生产)可能需要不同的配置参数,如数据库连接信息、缓存配置等。通过 Spring Cloud Config,可以将这些配置集中存储在 Git 仓库中,微服务在启动时从 Config Server 获取相应的配置信息。这样不仅简化了配置的维护工作,还可以实现动态更新配置而无需重启服务。同时,将敏感数据与代码存储库分离,增强了系统的安全性。

到此这篇文章就介绍到这了,更多精彩内容请关注本人以前的文章或继续浏览下面的文章,创作不易,如果能帮助到大家,希望大家多多支持宝码香车~💕,若转载本文,一定注明本文链接。


整理不易,点赞关注宝码香车

更多专栏订阅推荐:
👍 html+css+js 绚丽效果
💕 vue
✈️ Electron
⭐️ js
📝 字符串
✍️ 时间对象(Date())操作

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐