Spring Cloud是什么?
SpringCloud 是一套完整的微服务解决方案,基于Spring框架与SpringBoot框架,为开发人员提供了一套完整的微服务解决方案。
Spring Cloud核心组件
微服务的核心要素在于服务注册与发现、路由、熔断、降级、负载均衡、分布式配置,所以Spring Cloud提供相关的组件。
如下图所示:
Spring Cloud提供了一系列的组件实现微服务架构,包括Eureka(服务注册与发现)、Ribbon(客户端负载均衡)、Hystrix(容错和熔断)、Feign(声明式HTTP客户端)等等。
下面我就来一一来详解具体的组件@mikechen
Spring Cloud Zuul网关
第一步:请求统一通过API网关Zuul来访问内部服务,处理所有进出微服务系统的请求和流量。
Zuul是Spring Cloud中的微服务网关,是Spring Cloud组件之一,用于实现动态路由、请求过滤和请求转发等功能。
Zuul作为边缘服务网关,具有路由、负载均衡、认证、授权、监控等功能,它接收来自客户端的请求,并将其路由到适当的后端微服务。
Zuul还可以执行身份验证和授权,确保只有授权的请求能够访问特定的微服务。
Zuul 本质就是一系列的filter过滤器,Zuul工作原理:就是基于ZuulFilter的链式调用请求机制。
Zuul 作为一个API网关,通过路由配置和请求过滤器实现请求的动态路由、请求过滤和请求转发等功能。
它能够集中管理和保护后端的服务,并提供负载均衡和动态路由的能力,以便更好地控制和管理微服务架构中的请求流量。
Spring Cloud Eureka
网关接收到请求后,从注册中心Eureka获取可用服务。
Eureka 作为 Spring Cloud框架的注册中心,与之对应的是 Dubbo 框架的Zookeeper。
Spring Cloud的注册中心通过Eureka实现,它提供了服务注册和发现的功能。
如下图所示:
Eureka提供了服务注册和发现的功能,每个微服务都可以将自己的信息注册到Eureka服务器,并提供一个唯一的标识符。
其他微服务提供者将自己的实例信息注册到Eureka服务器上,包括:主机地址、端口号等。
而服务消费者从Eureka服务器上获取可用的服务实例列表,并通过负载均衡策略选择其中的一台实例进行调用。
Spring Cloud Ribbon
Ribbon主要作用是提供客户端的软件负载均衡算法,它与Spring Cloud集成,提供了在服务之间进行负载均衡的能力。
客户端会有一个服务器地址列表,在发送请求前通过负载均衡算法选择一个服务器,然后进行访问,在客户端就进行负载均衡算法分配。
如下图所示:
Ribbon提供了多种负载均衡策略,包括:
- 随机策略(Random);
- 轮询策略(Round Robin);
- 权重策略(Weighted);
- 最少连接策略(Least Connection)等。
Ribbon与Eureka服务发现组件无缝集成,它可以通过查询Eureka服务器获取可用的服务实例列表,并根据负载均衡策略选择合适的实例进行请求。
Spring Cloud Feign
Feign是一个声明式的、基于接口的HTTP客户端工具,微服务之间通过Feign进行通信处理业务。
Feign提供了一种简单的方式来定义和使用HTTP客户端接口,使得微服务之间的通信更加简洁和直观。
如下所示:
import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; @FeignClient(name = "userService") public interface UserServiceFeignClient { @GetMapping("/users") List<User> getUsers(); }
Spring Cloud Feign与其他Spring Cloud组件无缝集成,特别是与Eureka和Ribbon集成得非常好。
Spring Cloud Hystrix
Hystrix负责处理服务超时熔断
Hystrix是SpringCloud的一个核心组件,提供了容错机制和故障保护功能,以增加系统的稳定性和弹性。
Hystrix实现了熔断器模式,当远程服务发生故障或超时时,可以防止连锁故障并降低系统的崩溃风险。
首先,我们需要了解为什么需要熔断器这种模式。
比如在分布式系统环境下,服务间类似依赖非常常见,一个业务调用通常依赖多个别的服务。
如下图所示:
如果各个服务正常运行,那大家齐乐融融,但是如果其中一个服务Service C崩坏掉会出现什么样的情况呢?
很有可能就会出现,下图的拖挂别的服务场景。
ServiceB依赖于ServiceC,由于ServiceC访问量比较大,由于ServiceC挂了,很可能ServiceB也会被拖累挂。
最终一个服务失败,导致整条链路的服务都失败的情形,为造成大面积的服务雪崩效应。
所以就需要Hystrix 断路器,实现熔断,来隔离故障的服务。
除此之外,Hystrix提供了丰富的监控和指标收集功能,可以实时监控服务调用的健康状态和性能指标。
Spring Cloud Config
Spring Cloud Config是一个用于集中管理和动态配置分布式系统的配置管理工具。
Spring Cloud Config提供了一个集中化的配置服务器,允许应用程序在不重新部署的情况下获取配置信息。
Spring Cloud Config支持多环境的配置管理,可以为不同的环境,比如:开发、测试、生产创建不同的配置文件,并根据应用程序所在的环境自动加载相应的配置。
除此之外,Spring Cloud Config支持配置文件的动态刷新,这意味着应用程序可以在运行时获取最新的配置信息,而无需重新启动或重新部署。
Spring Cloud Sleuth
Sleuth是一个分布式跟踪系统的组件,它可以与Zipkin等跟踪工具集成,实现对请求的跟踪和监控。
随着微服务架构的流行,服务按照不同的维度进行拆分,在复杂的微服务架构系统中,会形成一个复杂的分布式服务调用链路,如下图所示:
面对复杂的调用链路就带来一系列问题:
- 如何快速发现问题?
- 如何判断故障影响范围?
- 如何梳理服务依赖以及依赖的合理性?
- 如何分析链路性能问题以及实时容量规划?
而链路追踪的出现正是为了解决这种问题,它可以在复杂的服务调用中定位问题。
Spring Cloud Turbine
Spring Cloud Turbine是Spring Cloud提供的一个组件,用于将Hystrix的监控数据聚合和展示。
Spring Cloud Turbine可以集中收集来自多个服务实例的Hystrix监控数据,并通过可视化界面进行展示和监控。
Spring Cloud Turbine提供了一个可视化监控界面,用于展示聚合的Hystrix监控数据。开发人员可以通过访问该界面,查看汇总的监控数据,并进行性能分析、故障排查等操作。
Spring Cloud原理架构
Spring Cloud原理架构,如下图所示:
通过这张图,可以比较清楚的了解到Spring Cloud组件,以及运行机制:
第一步:请求统一通过API网关Zuul来访问内部服务;
第二步:网关接收到请求后,从注册中心Eureka获取可用服务;
第三步:由Ribbon进行均衡负载后,分发到后端具体实例;
第四步:微服务之间通过Feign进行通信处理业务;
第五步:Hystrix负责处理服务超时熔断;
第六步:Turbine监控服务间的调用和熔断相关指标。
以上就是Spring Cloud详解,更多Spring Cloud请查看:Spring Cloud Alibaba详解(史上最全组件文档教程)
陈睿mikechen
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》