经过这么久的springCloud的相爱相杀互相折磨,总结了springCloud的一些核心概念以及实战频繁使用事项,先从核心概念开始说起:
Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Spring Cloud并没有重复制造轮子,它只是将各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。
其核心组件有五个:
-
Eureka/Nacos:Eureka/Nacos是服务注册与发现组件,用于实现微服务架构中的服务注册与发现。微服务在启动时会向Eureka/Nacos服务器注册自己的信息(如IP地址、端口号、服务名等),同时定时发送心跳来告知自己的健康状态。其他微服务可以通过Eureka/Nacos服务器来发现和调用注册的微服务实例,实现了微服务之间的解耦和动态扩展。(本文章主要说Nacos)
-
Ribbon:Ribbon是客户端负载均衡组件,用于在客户端实现负载均衡,将请求分发到多个服务实例中。Ribbon提供了多种负载均衡策略(如轮询、随机、加权轮询等),可以根据实际情况选择合适的策略。与Eureka配合使用时,Ribbon可以自动从Eureka服务器获取服务实例列表,并基于负载均衡策略进行请求转发。
-
Feign:Feign是声明式的HTTP客户端,用于简化服务间的调用。通过定义接口和注解,Feign可以自动生成HTTP请求的实现,隐藏了HTTP请求的细节,使得服务间的调用更加简洁和方便。Feign还集成了Ribbon和Hystrix,可以实现负载均衡和容错处理。(本文章主要说openFeign)
-
Hystrix:Hystrix是容错管理组件,用于在分布式系统中处理延迟和故障。它实现了断路器模式,可以在服务出现故障时快速失败,并提供了降级、熔断、限流等功能,保护了整个系统的稳定性和可用性。
-
Zuul:Zuul是API网关组件,用于统一访问入口和路由请求到后端的微服务。Zuul可以实现路由、过滤、负载均衡等功能,同时集成了Ribbon和Hystrix,可以实现请求的动态路由和容错处理。(本文章主要说Gateway)
Gateway(网关)
Gateway是Spring Cloud的一部分,它提供了基于Spring Cloud的微服务架构中的网关服务。它的主要作用是为微服务架构中的客户端提供统一的入口,同时也可以处理一些路由、限流、熔断等功能。
(这里咱们解释一下网关是什么:
网关是连接两个网络的设备或软件,它负责在这两个网络之间传递数据包,并且能够对数据包进行一定程度的处理。网关可以理解为网络中的出入口,它扮演着连接不同网络之间的桥梁的角色;
网关的基本构建组成,表示一个具体的路由信息载体。它由 ID,目标 URI,谓词集合和过滤器集合定义;它提供了基于Spring Cloud的微服务架构中的网关服务。它的主要作用是为微服务架构中的客户端提供统一的入口,同时也可以处理一些路由、限流、熔断等功能。
网关的出现主要是为了解决以下几个问题:
-
路由转发:在复杂的网络环境中,不同的网络可能使用不同的协议、地址格式等,网关可以根据不同的路由规则将数据包转发到正确的目标地址,实现不同网络之间的通信。
-
协议转换:不同的网络可能使用不同的通信协议,网关可以实现协议的转换,使得不同协议的设备可以进行通信。
-
安全性:网关可以作为网络的入口和出口,实现对网络流量的监控和安全检查,比如防火墙功能,可以对进出的数据包进行过滤和检查,保护网络的安全。
-
性能优化:网关可以对网络流量进行优化和加速,比如缓存常用的数据、压缩数据包等,提高网络的性能和效率。
-
访问控制:网关可以实现对网络资源的访问控制,根据设定的规则限制不同用户或者设备对资源的访问权限,保护网络资源的安全。
)
主要特性包括
-
动态路由:可以根据请求的URL和其他条件动态地将请求路由到不同的微服务实例上,支持多种路由策略。
-
断路器:集成了Hystrix断路器,可以在微服务出现故障时进行快速的失败处理,避免故障扩散。
-
过滤器:支持自定义的过滤器,可以在请求到达网关时进行一些预处理或者在返回给客户端时进行一些后处理,如添加请求头、修改请求体、校验权限等。
-
负载均衡:集成了Ribbon负载均衡器,可以实现对微服务实例的负载均衡,提高系统的可用性和性能。
-
断言工厂:可以通过断言工厂对请求进行匹配,从而实现路由的条件筛选。
-
集成Spring WebFlux:基于Spring WebFlux构建,具有非阻塞、响应式的特性,能够处理大量并发请求。
Feign(声明式http客户端请求)
(此处工作中用到的是openFeign,咱们主要讲openFeign)
(
Feign是Spring Cloud提供的一个用于简化服务间RESTful调用的声明式HTTP客户端。它可以让开发者定义接口并使用注解的方式来描述HTTP请求,而无需手动编写HTTP客户端的代码。Feign会根据这些接口定义,自动生成具体的HTTP请求代码,并且集成了Ribbon负载均衡器,可以实现对服务实例的负载均衡调用。
)
是Spring Cloud生态系统中的一部分,它是一个基于Netflix Feign的声明式服务调用客户端。OpenFeign的主要目的是简化微服务架构中服务之间的调用,使得服务之间的调用更加简洁、优雅。
OpenFeign在Feign的基础上支持了SpringMVC的注解,如@RequestMapping等等。OpenFeign的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口,并通过动态代理的方式产生实现类
OpenFeign的特点和优势包括:
- 声明式的服务调用:OpenFeign允许开发者使用注解的方式来定义服务接口,而无需编写具体的调用逻辑,使得服务调用变得更加简单和直观。
- 集成了负载均衡:OpenFeign集成了Ribbon负载均衡器,可以自动地对服务进行负载均衡,提高了系统的可用性和性能。
- 支持熔断:OpenFeign集成了Sentinel,可以在服务调用出现异常时进行熔断,避免故障扩散,提高了系统的稳定性。
- 支持动态代理:OpenFeign使用动态代理技术来实现服务调用,使得服务调用的过程可以在运行时动态生成代理类,减少了开发者的工作量。
- 与Spring Cloud集成:OpenFeign与Spring Cloud深度集成,可以与其他Spring Cloud组件(如Eureka、Config等)无缝配合使用,提供了完整的微服务解决方案。
Ribbon(负载均衡器)
Spring Cloud Ribbon是Spring Cloud 生态系统中的一个组件,它是Netflix开源的负载均衡器Ribbon在Spring Cloud环境下的实现。Ribbon帮助开发者在分布式系统中进行服务实例的负载均衡调用,使得服务调用更加稳定和高效。
Ribbon的主要特点和优势包括:
- 负载均衡:Ribbon可以根据一定的负载均衡策略(比如轮询、随机等)从多个服务实例中选择一个进行调用,从而实现负载均衡。
- 服务实例的动态发现:Ribbon可以与服务发现组件(如Eureka、Consul等)集成,动态地获取可用的服务实例列表,实现动态的服务调用。
- 容错机制:Ribbon具有一定的容错能力,当某个服务实例不可用时,可以自动切换到其他可用的实例进行调用,提高了系统的稳定性。
- 自定义配置:开发者可以通过配置文件或者编程的方式对Ribbon进行一些自定义配置,比如负载均衡策略、超时设置等。
- 与Spring Cloud集成:Ribbon与Spring Cloud深度集成,可以与其他Spring Cloud组件(如Eureka、Config等)无缝配合使用,提供了完整的微服务解决方案。
说到负载均衡,咱们就得说说其策略了:
常用的负载均衡策略:
-
轮询(Round Robin):默认的负载均衡策略,Ribbon会按照服务实例列表的顺序依次调用每个服务实例,实现简单的轮询调用。
-
随机(Random):随机选择一个可用的服务实例进行调用,适用于服务实例的负载相对均衡的情况。
-
权重轮询(Weighted Round Robin):根据每个服务实例的权重来进行轮询调用,权重越高的服务实例被选择的概率越大,适用于服务实例的性能不均衡的情况。
-
权重随机(Weighted Random):根据每个服务实例的权重来进行随机调用,权重越高的服务实例被选择的概率越大,适用于服务实例的性能不均衡的情况。
-
最少连接数(Least Connections):选择当前连接数最少的服务实例进行调用,适用于服务实例的负载不均衡的情况。
-
IP哈希(IP Hash):根据客户端的IP地址进行哈希计算,然后将结果与服务实例列表的大小取模,选择对应的服务实例进行调用,使得同一客户端的请求始终被路由到同一台服务实例上。
Hystrix(熔断器)
Spring Cloud Hystrix是Spring Cloud Netflix项目中的一个模块,用于在分布式系统中处理服务间的延迟和容错问题。它是Netflix开源的一种容错管理工具,帮助开发者构建具有容错能力的分布式系统。
Spring Cloud Netflix Hystrix的主要特点和优势包括:
-
服务降级:当某个服务不可用或者响应时间过长时,Hystrix可以自动地进行服务降级,返回一个备用的响应或者执行预设的降级逻辑,避免故障扩散。
-
熔断器:Hystrix可以通过熔断器的机制来监控服务的调用情况,当服务出现异常或者超时时,可以快速地断开对该服务的调用,避免对下游服务产生过大压力,同时也可以自动地恢复服务调用。
-
请求缓存:Hystrix可以对重复的请求进行缓存,避免重复执行相同的请求,提高系统的性能和效率。
-
并发限制:Hystrix可以对服务的并发调用进行限制,避免因为过多的并发请求导致系统资源不足。
-
实时监控:Hystrix提供了实时的监控和报警功能,可以通过监控仪表盘来查看服务的健康状况,及时发现和处理问题。
-
与Spring Cloud集成:Hystrix与Spring Cloud深度集成,可以与其他Spring Cloud组件(如Eureka、Ribbon等)无缝配合使用,提供了完整的微服务解决方案。
Eureka(服务发现组件)/Nacos
(此处主要讲nacos,不论是Eureka还是nacos,在工作中使用非常频繁)
(Eureka是Spring Cloud Netflix项目中的一个模块,它是Netflix开源的一种服务发现组件,用于构建分布式系统中的服务注册与发现。它的主要作用是帮助开发者构建具有高可用性和可扩展性的微服务架构。
Eureka的主要特点和优势包括:
-
服务注册与发现:Eureka允许微服务将自己注册到Eureka服务器,并且能够从Eureka服务器中获取其他服务的信息,实现了服务间的自动发现和调用。
-
高可用性:Eureka使用了集群化的架构,可以部署多个Eureka服务器来实现高可用性,当某个Eureka服务器不可用时,其他服务器仍然可以正常工作。
-
自我保护机制:Eureka具有自我保护机制,当某个服务实例长时间没有发送心跳到Eureka服务器时,Eureka会将该实例从服务列表中剔除,避免将请求发送到不可用的服务实例上。
-
与Spring Cloud集成:Eureka与Spring Cloud深度集成,可以与其他Spring Cloud组件(如Ribbon、Feign等)无缝配合使用,提供了完整的微服务解决方案。
-
可扩展性:Eureka具有良好的可扩展性,可以根据实际需求进行扩展,比如可以通过配置文件来配置Eureka服务器的行为,也可以通过自定义的插件来扩展Eureka的功能。)
Nacos(官方称为Nacos)是Spring Cloud Alibaba生态系统中的一个重要组件,它是一个开源的服务发现、配置管理和服务管理平台。Nacos支持动态服务发现、动态配置管理和服务元数据等功能,为微服务架构提供了一站式解决方案。
Spring Cloud Alibaba Nacos的主要特点和优势包括:
-
服务发现与注册:Nacos可以作为服务注册中心,允许微服务将自己注册到Nacos服务器,并且能够从Nacos服务器中获取其他服务的信息,实现了服务间的自动发现和调用。
-
动态配置管理:Nacos支持动态配置管理,可以将配置信息存储在Nacos服务器中,并且能够实时推送配置变更,使得配置管理更加灵活和高效。
-
服务健康检查:Nacos可以对注册的服务进行健康检查,当服务不可用时,自动将其剔除出服务列表,确保客户端只会调用到健康的服务实例。
-
动态DNS服务:Nacos支持动态DNS服务,可以根据服务的状态动态地更新DNS解析信息,实现动态的服务地址解析。
-
分布式系统的一致性保证:Nacos提供了一致性保证机制,保证了注册中心的高可用和数据的一致性。
-
与Spring Cloud集成:Nacos与Spring Cloud深度集成,可以与其他Spring Cloud组件(如Ribbon、Feign等)无缝配合使用,提供了完整的微服务解决方案。
看着Eureka和Nacos作用都差不多,它们的区别在哪呢:
-
架构和技术栈:
- Eureka是Netflix开源的服务发现组件,它是基于RESTful的架构,使用Jersey作为HTTP客户端和服务器。
- Nacos是阿里巴巴开源的服务发现和配置管理平台,它使用了新一代的Spring Cloud组件和微服务架构。
-
功能特性:
- Eureka主要用于服务的注册与发现,它提供了服务注册、心跳检测、服务列表维护等功能。
- Nacos不仅提供了服务注册与发现的功能,还支持动态配置管理、服务路由、动态DNS、健康检查等功能,是一个更加全面的微服务基础设施平台。
-
配置管理:
- Eureka本身不提供配置管理功能,需要结合其他组件如Spring Cloud Config来实现配置管理。
- Nacos集成了配置管理功能,可以作为统一的配置中心,实现动态的配置管理和推送。
-
一致性保证:
- Eureka使用了基于AP(可用性和分区容忍性)的设计,可以在网络分区的情况下继续工作,但可能会导致数据一致性的问题。
- Nacos提供了一致性保证机制,保证了注册中心的高可用和数据的一致性。
(此处提一下CAP:
CAP(Consistency, Availability, Partition Tolerance)是分布式系统理论中的概念,指的是在分布式系统中,三种核心属性之间的权衡关系:
-
一致性(Consistency):指系统的所有节点在同一时刻看到的数据是一致的。即使系统中有多个节点,在数据更新后,所有节点都会立即看到最新的数据,不会出现数据不一致的情况。
-
可用性(Availability):指系统在任何时间都能够正常响应用户的请求,即系统不会出现长时间的不可用情况。
-
分区容忍性(Partition Tolerance):指系统在遇到网络分区(网络故障)时仍能够保持部分功能的可用性,即系统在出现网络故障或分区时,仍能够继续工作。
CAP 原则认为,在分布式系统中,无法同时满足这三种属性,只能在一致性、可用性和分区容忍性之间进行权衡。根据 CAP 原则,分布式系统只能同时满足其中的两个属性,无法同时满足所有三个属性。这就意味着在设计分布式系统时,需要根据具体的需求和场景来选择权衡方案,以满足最符合实际需求的需求。
)
(
Nacos的一致性保证机制主要是针对其作为服务注册中心和配置中心的角色,保证了注册中心和配置中心的高可用和数据的一致性。
Nacos的一致性保证主要体现在以下几个方面:
-
集群模式:Nacos支持以集群的方式部署,可以部署多个Nacos服务器来实现高可用性。在集群模式下,Nacos服务器之间会进行节点间的状态同步,保证了整个集群的一致性。
-
Raft一致性协议:Nacos使用了Raft一致性协议来保证数据的一致性。Raft协议是一种分布式一致性协议,可以保证在正常情况下,集群中的所有节点的数据保持一致。
-
Leader选举:在Raft协议中,Nacos集群会选举出一个Leader节点,Leader节点负责接收客户端的写入请求,并将写入的数据同步给其他节点,确保数据的一致性。
-
数据同步:当Leader节点接收到客户端的写入请求时,会将写入的数据同步给其他节点,其他节点接收到数据后会进行持久化,并且向Leader节点发送确认信息,确保数据写入的一致性。
-
故障恢复:当Nacos集群中的某个节点出现故障时,Raft协议会自动进行Leader重新选举,选出新的Leader节点,确保集群的高可用性和数据的一致性。
)
.....
好了,八股文咱们就说到这,网上的八股文咱就不多说了,主要概念知道一下
下一章我会将我在工作中的实战经验跟大家分享一下,若有不足的地方可评论区留言补充,大家一起进步一起学习
(说实话,咱在开发中也就见过ribbon几眼,hystrix都没看到过,下一章我会在写时尽量给各位兄弟姐妹们找找在工作中的hystrix长啥样)