这里是修真院后端小课堂,每篇分享文从算法
【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】spring
八个方面深度解析后端知识/技能,本篇分享的是:后端
【什么是Spring Zuul?】缓存
1.背景介绍
spring cloud简介服务器
Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,均可以用Spring Boot的开发风格作到一键启动和部署。网络
Spring并无重复制造轮子,它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,经过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。架构
2.知识剖析
(1)Spring Cloud Netflix 简介app
首先Netflix是一家成功实践微服务架构的互联网公司,Netflix把它的整个微服务框架栈开源贡献给了社区。后来,Spring Cloud对Netflix开源组件进一步封装,方便Spring开发人员构建微服务基础框架。负载均衡
Spring Cloud Netflix的功能十分强大,包括Eureka,Ribbon,hystrix,Feign,Zuul等组件,结合到一块儿,让服务的调用、路由也变得异常容易。Spring Cloud Netflix做为Spring的重量级整合框架,使用它也意味着咱们能从Spring获取到巨大的便利。Spring Cloud的其余子项目,好比Spring Cloud Stream、Spring Cloud Config等等,都为微服务的各类需求提供了一站式的解决方案。框架
(2)Spring Cloud Netflix主要组件介绍
其核心组件是用于服务注册与发现的Eureka:Eureka由多个instance(服务实例)组成,这些服务实例能够分为两种:Eureka Server和Eureka Client。为了便于理解,咱们将Eureka client再分为Service Provider和Service Consumer。以下图所示:
1)Eureka Server:服务的注册中心,负责维护注册的服务列表。
2)Service Provider:服务提供方,做为一个Eureka Client,向Eureka Server作服务注册、续约和下线等操做,注册的主要数据包括服务名、机器ip、端口号、域名等等。
3)Service Consumer:服务消费方,做为一个Eureka Client,向Eureka Server获取Service Provider的注册信息,并经过远程调用与Service Provider进行通讯。
Service Provider和Service Consumer不是严格的概念,Service Consumer也能够随时向Eureka Server注册,来让本身变成一个Service Provider。Spring Cloud针对服务注册与发现,进行了一层抽象,并提供了三种实现:Eureka、Consul、Zookeeper。目前支持得最好的就是Eureka,其次是Consul,最后是Zookeeper。
(3)服务注册:Service Provider本质上是一个Eureka Client。
它启动时,会调用服务注册方法,向Eureka Server注册本身的信息。Eureka Server会维护一个已注册服务的列表,这个列表为一个嵌套的hash map:第一层,application name和对应的服务实例。 第二层,服务实例及其对应的注册信息,包括IP,端口号等。
当实例状态发生变化时(如自身检测认为Down的时候),也会向Eureka Server更新本身的服务状态。续约的方式与服务注册基本一致,会周期性地向Eureka Server发送心跳以续约本身的信息,避免本身的注册信息被剔除。
(4)Service Consumer本质上也是一个Eureka Client(它也会向Eureka Server注册,只是这个注册信息可有可无罢了)。
它启动后,会从Eureka Server上获取全部实例的注册信息,包括IP地址、端口等,并缓存到本地。这些信息默认每30秒更新一次。
基于Service Consumer获取到的服务实例信息,咱们就能够进行服务调用了。而Spring Cloud也为Service Consumer提供了丰富的服务调用工具:
1)Ribbon,实现客户端的负载均衡。
2)Hystrix,断路器。
3)Feign,RESTful Web Service客户端,整合了Ribbon和Hystrix。
(5)服务调用端熔断——Hystrix
Netflix建立了一个名为Hystrix的库,实现了断路器的模式。“断路器”自己是一种开关装置,当某个服务单元发生故障以后,经过断路器的故障监控(相似熔断保险丝),向调用方返回一个符合预期的、可处理的备选响应(FallBack),而不是长时间的等待或者抛出调用方没法处理的异常,这样就保证了服务调用方的线程不会被长时间、没必要要地占用,从而避免了故障在分布式系统中的蔓延,甚至雪崩。
(6)服务调用端代码抽象和封装——Feign
Feign是一个声明式的Web Service客户端,它的目的就是让Web Service调用更加简单。它整合了Ribbon和Hystrix,从而让咱们再也不须要显式地使用这两个组件。Feign还提供了HTTP请求的模板,经过编写简单的接口和插入注解,咱们就能够定义好HTTP请求的参数、格式、地址等信息。接下来,Feign会彻底代理HTTP的请求,咱们只须要像调用方法同样调用它就能够完成服务请求。
3.常见问题
(1)Spring Cloud Netflix的优点?
对于微服务的治理而言,核心就是服务的注册和发现。所以选择哪一个组件,很大程度上要看它对于服务注册与发现的解决方案。在这个领域,开源架构不少,最多见的是Zookeeper,但这并非惟一选择。
在分布式系统领域有个著名的CAP定理:C—数据一致性,A—服务可用性,P—服务对网络分区故障的容错性。这三个特性在任何分布式系统中不能同时知足,最多同时知足两个。
Zookeeper保证的是CP,即它不能保证每次服务请求的可用性。对于大多数涉及到数据存储的分布式环境,数据一致性应该是首先被保证的。可是对于服务发现而言,可用性比数据一致性更加剧要,即AP赛过CP。而Spring Cloud Netflix在设计Eureka时遵照的就是AP原则。
(2)实际开发Eureka的过程当中,有时会碰见Service Consumer获取到Server Provider的信息有延迟?
Eureka官网提到服务端的更改可能须要2分钟才能传播到全部客户端。这是由于Eureka有三处缓存和一处延迟形成的。
1)Eureka Server对注册列表进行缓存,默认时间为30s。
2)Eureka Client对获取到的注册信息进行缓存,默认时间为30s。
3)Ribbon会从上面提到的Eureka Client获取服务列表,将负载均衡后的结果缓存30s。
4)若是不是在Spring Cloud环境下使用这些组件(Eureka, Ribbon),服务启动后并不会立刻向Eureka注册,而是须要等到第一次发送心跳请求时才会注册。心跳请求的发送间隔默认是30s。Spring Cloud对此作了修改,服务启动后会立刻注册。
(3)Feign具备以下特性:
可插拔的注解支持,包括Feign注解和JAX-RS注解
支持可插拔的HTTP编码器和解码器
支持Hystrix和它的Fallback
支持Ribbon的负载均衡
支持HTTP请求和响应的压缩
(4)服务器端负载均衡和客户端负载均衡的区别?
1)服务器端负载均衡:例如Nginx,经过Nginx进行负载均衡,先发送请求,而后经过负载均衡算法,在多个服务器之间选择一个进行访问;即在服务器端再进行负载均衡算法分配。
2)客户端负载均衡:例如spring cloud中的ribbon,客户端会有一个服务器地址列表,在发送请求前经过负载均衡算法选择一个服务器,而后进行访问,这是客户端负载均衡;即在客户端就进行负载均衡算法分配。