Spring Cloud原理以及各组件详解

版权声明:本文为博主原创文章,欢迎转载,转载请注明作者、原文超链接 https://blog.csdn.net/weixin_43863007/article/details/89049043
Spring Cloud包含了很多组件包括:Eureka,Ribbon,Feign,Hystrix,Zuul
1. SpringCloud核心组件:Eureka
  • Eureka Client这个组件专门负责将服务信息注册到Eureka Server中,说白了就是告诉Eureka Server,自己在哪台机器上,监听着哪个端口,而Eureka Server是一个注册中心,里面有一个注册表,保存了各个服务器所在的机器和端口号
  • Eureka Client:负责将这个服务信息注册到Eureka Server中
  • Eureka Server:注册中心,里面有一个注册表,保存了各个服务所在的机器和端口号
2. SpringCloud核心组件:Feign
  • 问题:一个服务要自己写一大堆代码,跟其他服务建立网络连接,然后构造一个复杂的请求,接着发送请求过去,最后对返回的响应结果再写一大堆代码来处理吗?
  • Feign一个关键机制就是使用了动态代理
  1. 首先,如果你对某个接口定义了@FeignClient注解,Feign就会针对这个接口创建一个动态代理
  2. 接着你要是调用那个接口,本质就是会调用Feign创建的动态代理,这是核心中的核心
  3. Feign的动态代理会根据你在接口上的@RequestMapping等注解,来动态构造出你要请求的服务地址
  4. 最后针对这个地址,发起请求,解析响应
3. SpringCloud核心组件:Ribbon
  • 问题:如果一个服务部署在了5台机器上Feign代理怎么知道请求哪个服务器呢?
  • Ribbon的作用是负载均衡,会帮你在每次请求时选择一台机器,均与的把请求分发到各个机器上
  • Ribbon的负载均衡默认使用的最经典的Round Robin轮询算法,就是如果订单服务对库存服务发起10次请求,那就先让你请求第1台机器、然后是第2台机器、第3台机器、第4台机器、第5台机器,接着再来—个循环,第1台机器、第2台机器。。。以此类推。
  • Ribbon是和Feign以及Eureka紧密协作,完成工作的,具体如下:
  1. 首先Ribbon会从Eureka Client里获取到对应的服务注册表,也就知道了所有的服务都部署在了哪些机器上,在监听哪些端口号
  2. 然后Ribbon就可以使用默认的Round Robin算法,从中选择一台机器
  3. Feign就会针对这台机器,构造并发起请求
4. SpringCloud核心组件:Hystrix
  • 问题:其中一个服务器挂掉,导致所有线程全部卡在这个服务,引起服务雪崩问题,处理方法
  • Hystrix是隔离,熔断以及降级的一个框架,说白了就是Hystrix会搞很多个小小的线程池,每个服务是一个线程池,每个线程池里的线程就仅仅用于请求那个服务,若其中一个服务挂了,其他的服务线程池都是正常工作的,服务之间不会收到影响
  • 熔断:比如某个服务器挂了,每次调用都要卡住一段时间,这是没有意义的,这时候就可以直接熔断,比如在五分钟内请求积分服务直接就返回了,不去走网络请求卡住的时间,这个过程,就是熔断
5. SpringCloud核心组件:Zuul
  • Zuul也就是微服务网关,是负责网络路由的,一般微服务架构中都必然会涉及一个网关在里面,不用去关心后端有几百个服务,就知道有一个网关,所有的请求都往网关走,网关会根据请求中的一些特征,将请求转发给后端的各个服务
  • 有网关之后可以做统一的降级,限流,认证授权,安全等等
6. 总结:
  • Eureka:各个服务启动时,Eureka Client都会将服务注册到Eureka Server,并且Eureka Client还可以反过来从Eureka Server拉取注册表,从而知道其他服务在哪里
  • Ribbon:服务间发起请求的时候,基于Ribbon做负载均衡,从一个服务的多台机器中选择一台
  • Feign:基于Feign的动态代理机制,根据注解和选择的机器,拼接请求URL地址,发起请求
  • Hystrix:发起请求是通过Hystrix的线程池来走的,不同的服务走不同的线程池,实现了不同服务调用的隔离,避免了服务雪崩的问题
  • Zuul:如果前端、移动端要调用后端系统,统一从Zuul网关进入,由Zuul网关转发请求给对应的服务
    在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43863007/article/details/89049043