一、什么是Spring Cloud
【百度百科】--Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Spring Cloud并没有重复制造轮子,它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。
二、组件
1.Eureka
Eureka分为客户端和服务端和注册中心:
- 服务端提供服务注册,服务同步,服务续约等。
- 客户端有获取服务,服务调用,服务下线等功能。
- 服务注册中心有失效剔除,自我保护等。
有关eureka的总结及其实例链接如下:
2.Ribbon
Ribbon是一个基于HTTP和TCP的客户端负载均衡器,它可以在通过客户端中配置的ribbonServerList服务端列表去轮询访问以达到服务均衡的作用。
在微服务架构中使用客户端负载均衡调用只需要如下两步:
- 服务提供者只需要启动多个服务实例并且注册到一个注册中心或是多个相关联的服务注册中心
- 服务消费者直接通过调用被@LoadBalanced注解修饰过的RestTemplate来实现面向服务的接口调用
有关Ribbon的总结及其实例链接如下:
3.Hystrix
在微服务架构中,存在着那么多的服务单元,若一个单元出现故障,就很容易因依赖关系而引发故障的蔓延,最终导致整个系统的瘫痪,这样的架构相较传统架构更加不稳定。为了解决这样的问题,产生了断路器等一系列的服务保护机制
在分布式架构中,当某个服务单元发生故障之后,通过断路器的故障监控,向调用方返回一个错误响应,而不是长时间的等待。这样就不会使得线程因调用故障服务被长时间占用不释放,避免了故障在分布式系统中的蔓延
Hystrix具备服务降级、服务熔断、线程和信号隔离、请求缓存、请求合并以及服务监控等强大功能
Hystrix使用舱壁模式实现线程池的隔离,它会为每一个依赖服务创建一个独立的线程池,这样就算某个依赖服务出现延迟过高的情况,也只是对该依赖服务的调用产生影响,而不会拖慢其他的依赖服务。
有关hystrix的总结及其实例链接如下:
4.Feigin
Fegin的关键机制是使用了动态代理
- 首先,对某个接口定义了@FeginClient注解,Fegin就会针对这个接口创建一个动态代理
- 接着调用接口的时候,本质就是调用Fegin创建的动态代理
- Fegin的动态代理会根据在接口上的@RequestMapping等注解,来动态构造要请求的服务的地址
- 针对这个地址,发起请求、解析响应
Fegin是和Ribbon以及Eureka紧密协作的
- 首先Ribbon会从Eureka Client里获取到对应的服务注册表,也就知道了所有的服务都部署在了哪些机器上,在监听哪些端口
- 然后Ribbon就可以使用默认的Round Robin算法,从中选择一台机器
- Fegin就会针对这台机器,构造并发起请求。
有关Feigin的总结及其实例链接如下:
5.Zuul
Spring Cloud Zuul通过与Spring Cloud Eureka进行整合,将自身注册为Eureka服务治理下的应用,同时从Eureka中获得了所有其他微服务的实例信息。
对于路由规则的维护,Zuul默认会将通过以服务名作为ContextPath的方式来创建路由映射。
Zuul提供了一套过滤器机制,可以支持在API网关无附上进行统一调用来对微服务接口做前置过滤,已实现对微服务接口的拦截和校验。
有关Zuul的总结及其实例链接如下:
总结
- Eureka:各个服务启动时,Eureka Client都会将服务注册到Eureka Server,并且Eureka Client还可以反过来从Eureka Server拉取注册表,从而知道其他服务在哪里
- Ribbon:服务间发起请求的时候,基于Ribbon做负载均衡,从一个服务的多台机器中选择一台
- Feign:基于Feign的动态代理机制,根据注解和选择的机器,拼接请求URL地址,发起请求
- Hystrix:发起请求是通过Hystrix的线程池来走的,不同的服务走不同的线程池,实现了不同服务调用的隔离,避免了服务雪崩的问题
- Zuul:如果前端、移动端要调用后端系统,统一从Zuul网关进入,由Zuul网关转发请求给对应的服务
参考博客:https://blog.csdn.net/xunjiushi9717/article/details/91988479