Spring Cloud体系
Spring Cloud 是一套完整的微服务解决方案,基于 Spring Boot 框架,准确的说它不是一个框架,而是一个大的容器,它将市面上较好的微服务框架集成进来,从而简化了开发者的代码量。
Spring Cloud体系包含如下:
下面我一一详解Spring Cloud全体系@mikechen
Spring Cloud Eureka
Eureka 作为 Spring Cloud 框架的注册中心,与之对应的是 Dubbo 框架的Zookeeper。
Eureka的主要作用:就是解决服务注册,以及服务发现这两大核心功能。
Eureka基本架构
上图简要描述了Eureka的基本架构,由3个角色组成:
1.Service Provider: 暴露服务的服务提供方。
2)Service Consumer:调用远程服务的服务消费方。
3)EureKa Server: 服务注册中心和服务发现中心。
Eureka工作原理
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 网关访问相关服务。
Zuul就是微服务网关的一种实现,Zuul作用:类似我们小区的保安,用于保护基本的安全等的作用。
Zuul它实现了请求路由、负载均衡、校验过滤、服务容错、服务聚合等功能。
Zuul 本质上就是一个Web Servlet,本质上就是一系列的filter过滤器。
所以Zuul工作原理:就是基于ZuulFilter的链式调用请求机制。
Zuul组件的核心就是是一系列的过滤器,这些过滤器可以完成如下的功能,如下图所示,这是Zuul的整体架构图。
- 身份认证和安全: 识别每一个资源的验证要求,并拒绝那些不符的请求;
- 动态路由:动态将请求路由到不同后端集群;
- 压力测试:逐渐增加指向集群的流量,以了解性能
- 负载分配:为每一种负载类型分配对应容量,并弃用超出限定值的请求;
- 静态响应处理:边缘位置进行响应,避免转发到内部集群;
Spring Cloud Hystrix
Hystrix是Netflix开源的服务熔断器。
Hystrix作用
Hystrix的主要作用就是:提供服务隔离、熔断、降级机制。
发起请求是通过Hystrix的线程池来走的,不同的服务走不同的线程池,实现了不同服务调用的隔离,防止服务出现雪崩。
Spring Cloud Ribbon
Ribbon是Spring Cloud Netiflix组件中一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现。
Ribbon作用
Ribbon主要作用是提供客户端的软件负载均衡算法,将Netflix的中间层服务连接在一起。
当多个服务提供者时,Ribbon 可以根据负载均衡的算法,比如:如简单轮询、随机连接等,自动地选择需要调用的服务地址。
Ribbon原理
首先我们要明确负载均衡分为:集中式负载均衡和进程内负载均衡。
1.服务端的负载均衡
例如,硬件的有:F5,软件的有典型代表:Nginx,都是先发送请求,然后在服务器端再进行负载均衡算法分配。
2.客户端的负载均衡
负载均衡逻辑集成到消费方客户端,消费方从服务注册中心获知那些地址可用,然后自己再从这些地址中选择一个合适的服务器。
例如spring cloud中的Ribbon,客户端会有一个服务器地址列表,在发送请求前通过负载均衡算法选择一个服务器,然后进行访问,在客户端就进行负载均衡算法分配。
如下图所示:
总共有七种负载均衡策略可供选择,可以根据自己的业务场景进行选择:
- 轮询RoundRobinRule:这也是Ribbon默认的策略;
- 随机RandomRule;
- 响应时间权重ResponseTimeWeightedRule:为每个服务设置权重,响应时间越短,权重越大;
- 最少并发数策略BestAvailableRule;
- 重试策略RetryRule;
- 可用性敏感策略AvailabilityFilteringRule;
- 区域性敏感策略ZoneAvoidanceRule;
Spring Cloud Feign
Feign是Spring Cloud Netiflix组件中的一个轻量级Restful的HTTP服务客户端,通过 接口 + 注解的方式发起 HTTP 请求调用。
Feign作用
Feign 主要是帮助我们方便进行Rest API服务间的调用,Feign最大的作用就是减少 HTTP 远程调用的复杂性。
Feign实现了像调用本地方法一样调用远程方法,无感知远程HTTP 请求,类似于Dubbo Consumer直接调用Provider的接口方法。
Feign原理
Feign大致工作流程图如下:
总的来说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网关流程执行流程,如下图所示:
Gateway网关流程执行流程,大致分为如下6步:
- Gateway Client向Gateway Server发送请求;
- 请求首先会被HttpWebHandlerAdapter进行提取组装成网关上下文;
- 然后网关的上下文会传递到DispatcherHandler,它负责将请求分发给 RoutePredicateHandlerMapping;
- RoutePredicateHandlerMapping负责路由查找,并根据路由断言判断路由是否可用;
- 如果过断言成功,由FilteringWebHandler创建过滤器链并调用;
- 请求会一次经过PreFilter–微服务–PostFilter的方法,最终返回响应。
Spring Cloud Sleuth
Spring Cloud Sleuth 是 Spring Cloud的链路追踪组件,实现了分布式跟踪解决方案。
Sleuth作用
随着微服务架构的流行,服务按照不同的维度进行拆分,在复杂的微服务架构系统中,会形成一个复杂的分布式服务调用链路,如下图所示:
这样调用链路就会非常复制,如果某一个服务出了故障,难以跟踪,这样Sleuth就来解决调用链路的问题。
Sleuth 作用就是将一次分布式请求,还原成调用链路,进行:日志记录、性能监控、并将一次分布式请求的调用情况集中展示。
Sleuth原理
Spring Cloud Sleuth采用的是Google的开源项目Dapper的专业术语,span、Trace、Annotations。
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」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》