Spring Cloud教程(史上最全图文详解)

Spring Cloud教程(史上最全图文详解)-mikechen

Spring Cloud体系

Spring Cloud 是一套完整的微服务解决方案,基于 Spring Boot 框架,准确的说它不是一个框架,而是一个大的容器,它将市面上较好的微服务框架集成进来,从而简化了开发者的代码量。

Spring Cloud体系包含如下:

Spring Cloud教程(史上最全图文详解)-mikechen

下面我一一详解Spring Cloud全体系@mikechen

 

Spring Cloud Eureka

Eureka 作为 Spring Cloud 框架的注册中心,与之对应的是 Dubbo 框架的Zookeeper。

Eureka的主要作用:就是解决服务注册,以及服务发现这两大核心功能。

Eureka基本架构

Spring Cloud教程(史上最全图文详解)-mikechen

上图简要描述了Eureka的基本架构,由3个角色组成:

1.Service Provider: 暴露服务的服务提供方。

2)Service Consumer:调用远程服务的服务消费方。

3)EureKa Server: 服务注册中心和服务发现中心。

 

Eureka工作原理

 

Spring Cloud教程(史上最全图文详解)-mikechen

Eureka的完整工作流程,大致分为如下10步:

1、Eureka Server 启动成功,等待服务端注册,在启动过程中如果配置了集群,集群之间定时通过 Replicate 同步注册表;

2、Eureka Client 启动时根据配置的 Eureka Server 地址去注册中心注册服务;

3、Eureka Client 会每 30s 向 Eureka Server 发送一次心跳请求,证明客户端服务正常;

4、当 Eureka Server 90s 内没有收到 Eureka Client 的心跳,注册中心则认为该节点失效,会注销该实例;

5、单位时间内 Eureka Server 统计到有大量的 Eureka Client 没有上送心跳(15秒内85%服务器出现心跳异常),则认为可能为网络异常,进入自我保护机制;

6、当 Eureka Client 心跳请求恢复正常之后,Eureka Server 自动退出自我保护模式;

7、Eureka Client 定时全量或者增量从注册中心获取服务注册表,并且将获取到的信息缓存到本地;

8、服务调用时,Eureka Client 会先从本地缓存找寻调取的服务,如果获取不到,先从注册中心刷新注册表,再同步到本地缓存;

9、Eureka Client 获取到目标服务器信息,发起服务调用;

10、Eureka Client 程序关闭时向 Eureka Server 发送取消请求,Eureka Server 将实例从注册表中删除。

 

Spring Cloud Zuul

Zuul 是Netflix开源的一个API Gateway 服务器, 是 Spring Cloud Netflix 子项目的核心组件之一,可以作为微服务架构中的 API 网关使用,支持动态路由与过滤功能。

Zuul 本质上是一个Web servlet应用,为微服务架构中的服务提供了统一的访问入口,客户端通过 API 网关访问相关服务。

Spring Cloud教程(史上最全图文详解)-mikechen

 

Zuul的作用

Zuul就是微服务网关的一种实现,Zuul作用:类似我们小区的保安,用于保护基本的安全等的作用。

Zuul它实现了请求路由、负载均衡、校验过滤、服务容错、服务聚合等功能。

 

Zuul工作原理

Zuul 本质上就是一个Web Servlet,本质上就是一系列的filter过滤器。

所以Zuul工作原理:就是基于ZuulFilter的链式调用请求机制。

Zuul组件的核心就是是一系列的过滤器,这些过滤器可以完成如下的功能,如下图所示,这是Zuul的整体架构图。

Spring Cloud教程(史上最全图文详解)-mikechen

  • 身份认证和安全: 识别每一个资源的验证要求,并拒绝那些不符的请求;
  • 动态路由:动态将请求路由到不同后端集群;
  • 压力测试:逐渐增加指向集群的流量,以了解性能
  • 负载分配:为每一种负载类型分配对应容量,并弃用超出限定值的请求;
  • 静态响应处理:边缘位置进行响应,避免转发到内部集群;

 

Spring Cloud Hystrix

Hystrix是Netflix开源的服务熔断器。

 

Hystrix作用

Hystrix的主要作用就是:提供服务隔离、熔断、降级机制。

 

Hystrix工作原理

Spring Cloud教程(史上最全图文详解)-mikechen

发起请求是通过Hystrix的线程池来走的,不同的服务走不同的线程池,实现了不同服务调用的隔离,防止服务出现雪崩。

 

Spring Cloud Ribbon

Ribbon是Spring Cloud Netiflix组件中一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现。

 

Ribbon作用

Ribbon主要作用是提供客户端的软件负载均衡算法,将Netflix的中间层服务连接在一起。

当多个服务提供者时,Ribbon 可以根据负载均衡的算法,比如:如简单轮询、随机连接等,自动地选择需要调用的服务地址。

 

Ribbon原理

首先我们要明确负载均衡分为:集中式负载均衡和进程内负载均衡。

 

1.服务端的负载均衡

例如,硬件的有:F5,软件的有典型代表:Nginx,都是先发送请求,然后在服务器端再进行负载均衡算法分配。

 

2.客户端的负载均衡

负载均衡逻辑集成到消费方客户端,消费方从服务注册中心获知那些地址可用,然后自己再从这些地址中选择一个合适的服务器。

例如spring cloud中的Ribbon,客户端会有一个服务器地址列表,在发送请求前通过负载均衡算法选择一个服务器,然后进行访问,在客户端就进行负载均衡算法分配。

如下图所示:

Spring Cloud教程(史上最全图文详解)-mikechen

总共有七种负载均衡策略可供选择,可以根据自己的业务场景进行选择:

  1. 轮询RoundRobinRule:这也是Ribbon默认的策略
  2. 随机RandomRule;
  3. 响应时间权重ResponseTimeWeightedRule:为每个服务设置权重,响应时间越短,权重越大;
  4. 最少并发数策略BestAvailableRule;
  5. 重试策略RetryRule;
  6. 可用性敏感策略AvailabilityFilteringRule;
  7. 区域性敏感策略ZoneAvoidanceRule;

 

Spring Cloud Feign

Feign是Spring Cloud Netiflix组件中的一个轻量级Restful的HTTP服务客户端,通过 接口 + 注解的方式发起 HTTP 请求调用。

 

Feign作用

Feign 主要是帮助我们方便进行Rest API服务间的调用,Feign最大的作用就是减少 HTTP 远程调用的复杂性。

Feign实现了像调用本地方法一样调用远程方法,无感知远程HTTP 请求,类似于Dubbo Consumer直接调用Provider的接口方法。

 

Feign原理

Feign大致工作流程图如下:

Spring Cloud教程(史上最全图文详解)-mikechen

总的来说Feign 的源码实现过程如下:

1.首先通过@EnableFeignClients注解开启FeignClient 的功能,只有这个注解存在,才会在程序启动时开启对@FeignClient注解的包扫描;

2.根据Feign的规则实现接口,并在接口上面加上@FeignClient注解;

3.程序启动后会进行包扫描,扫描所有的@ FeignClient 的注解的类,并将这些信息注入IOC容器中;

4.当接口的方法被调用时,通过JDK的代理来生成具体的RequestTemplate模板对象;

5.根据RequestTemplate再生成Http请求的Request对象;

6.Request 对象交给Client去处理,其中Client的网络请求框架可以是HtpURLConnection、HttpClient等;

7.最后Client被封装到LoadBalanceClient类,这个类结合类Ribbon做到了负载均衡。

 

Spring Cloud Gateway

Gateway是Spring Cloud的一个全新的API网关项目,是Spring官方基于Spring 5.0、Spring Boot 2.0、Project Reactor等技术开发的网关。

 

Gateway网关作用

传统的单体架构中只需要开放一个服务给客户端调用,但是微服务架构中是将一个系统拆分成多个微服务。

每一个微服务都会部署到内网服务器中,或者禁止外部访问这些端口,这是对应用的一种安全保护机制。

因此,我们如果想通过互联网来访问这些服务,需要一个统一的入口:这就Gateway服务网关。

 

Gateway网关原理

Gateway网关流程执行流程,如下图所示:

Spring Cloud教程(史上最全图文详解)-mikechen

Gateway网关流程执行流程,大致分为如下6步:

  1. Gateway Client向Gateway Server发送请求;
  2. 请求首先会被HttpWebHandlerAdapter进行提取组装成网关上下文;
  3. 然后网关的上下文会传递到DispatcherHandler,它负责将请求分发给 RoutePredicateHandlerMapping;
  4. RoutePredicateHandlerMapping负责路由查找,并根据路由断言判断路由是否可用;
  5. 如果过断言成功,由FilteringWebHandler创建过滤器链并调用;
  6. 请求会一次经过PreFilter–微服务–PostFilter的方法,最终返回响应。

 

Spring  Cloud Sleuth

Spring Cloud Sleuth 是 Spring Cloud的链路追踪组件,实现了分布式跟踪解决方案。

 

Sleuth作用

随着微服务架构的流行,服务按照不同的维度进行拆分,在复杂的微服务架构系统中,会形成一个复杂的分布式服务调用链路,如下图所示:

Spring Cloud教程(史上最全图文详解)-mikechen

这样调用链路就会非常复制,如果某一个服务出了故障,难以跟踪,这样Sleuth就来解决调用链路的问题。

Sleuth 作用就是将一次分布式请求,还原成调用链路,进行:日志记录、性能监控、并将一次分布式请求的调用情况集中展示。

 

Sleuth原理

Spring Cloud Sleuth采用的是Google的开源项目Dapper的专业术语,span、Trace、Annotations。

Spring Cloud教程(史上最全图文详解)-mikechen

Spring Clpud Sleuth 实现分布式系统中的服务跟踪功能,主要在于下面三个关键点:

 

1.Span基本工作单元

例如:每次发送一个远程调用服务就会产生一个 Span,Span通过一个64位ID唯一标识,span还有其他数据信息,比 如摘要、时间戳事件、关键值注释(tags)、span的ID、以及进度ID(通常是IP地址) span在不断的启动和停止,同时记录了时间信息,当你创建了一个span,你必须在未来的某个时 刻停止它。

通过计算 Span 的开始和结束时间,就可以统计每个服务调用所花费的时间。。

 

2.Trace

一系列spans组成的一个树状结构,例如:如果你正在跑一个分布式大数据工程,你可能 需要创建一个Trace。

一个 Trace 认为是一次完整的链路,内部包含 n 多个 Span,Trace 和 Span 存在一对多的关系,Span 与 Span 之间存在父子关系。

 

3.Annotations

用来及时记录一个事件的存在,一些核心 annotations 用来定义一个请求的开始和结束。

 

作者简介

陈睿|mikechen,10年+大厂架构经验,大厂资深面试官,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

👇阅读更多mikechen架构文章👇

阿里架构 |双11秒杀 |分布式架构 |负载均衡 |单点登录 |微服务 |云原生 |高并发 |架构师

以上

关注作者「mikechen」公众号,获取更多技术干货!

后台回复架构,即可获取《阿里架构师进阶专题全部合集》,后台回复面试即可获取《史上最全阿里Java面试题总结

评论交流
    说说你的看法