Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性,巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Spring Cloud并没有重复制造轮子,它只是将目前各家公司开发的、比较成熟的、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装,屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。
Spring Cloud是许多技术组件的集合,常用组件如图2-1所示。
图2-1
服务配置中心(Spring Cloud Config)将所有的服务配置文件放到本地仓库或者远程仓库,配置中心负责读取仓库的配置文件,其他服务向配置中心读取配置。Spring Cloud Config使得服务的配置统一管理,并可以在不手动重启服务的情况下进行配置文件的刷新。
通过包装Netflix公司的微服务组件实现,也是Spring Cloud核心组件,包括Eureka、Hystrix、Zuul、Archaius。
Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的。Spring Cloud将它集成在其子项目spring-cloud-netflix中,以实现Spring Cloud的服务发现功能。
Eureka包含两个组件:Eureka Server和Eureka Client。
Eureka Server提供服务注册服务,各个节点启动后,会在Eureka Server中进行注册,这样Eureka Server中的服务注册表中将会存储所有可用服务节点的信息,而且服务节点的信息可以在界面中直观地看到。
Eureka Client是一个Java客户端,用于简化与Eureka Server的交互,客户端同时也是一个内置的、使用轮询(round-robin)负载算法的负载均衡器。
在应用启动后,将会向Eureka Server发送心跳,默认周期为30秒,如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,那么Eureka Server将会从服务注册表中把这个服务节点移除(默认时间为90秒)。
Eureka Server之间通过复制的方式完成数据的同步,Eureka还提供了客户端缓存机制,即使所有的Eureka Server都挂掉,客户端依然可以利用缓存中的信息消费其他服务的API。因此,Eureka通过心跳检查、客户端缓存等机制,确保了系统的高可用性、灵活性和可伸缩性。
Hystrix是熔断器组件。它通过控制服务的API接口的熔断来转移故障,防止微服务系统发生雪崩效应。另外,Hystrix能够起到服务限流和服务降级的作用。使用Hystrix Dashboard组件监控单个服务的熔断状态,使用Hystrix Turbine组件可以监控多个服务的熔断器的状态。
智能路由网关组件。能够起到智能路由和请求过滤的作用,内部服务API接口通过Zuul网关统一对外暴露,防止内部服务敏感信息对外暴露。也可以实现安全验证、权限控制的功能。
Feign是Netflix开发的、声明式的、模板化的HTTP客户端,Feign可以帮助我们快捷、优雅地调用HTTP API。
在Spring Cloud中,使用Feign非常简单—创建一个接口,并在接口上添加一些注解,代码就完成了。Feign支持多种注解,例如Feign自带的注解或者JAX-RS注解等。
Spring Cloud对Feign进行了增强,使Feign支持Spring MVC注解,并整合Ribbon和Eureka,从而让Feign的使用更加方便。
Spring Cloud Feign基于Netflix Feign实现,整合了Spring Cloud Ribbon和Spring Cloud Hystrix,除了提供这两者的强大功能外,还提供了一种声明式的Web服务客户端定义的方式。
Spring Cloud Feign帮助我们定义和实现依赖服务接口。在Spring Cloud Feign的实现下,只需要创建一个接口并用注解方式配置它,即可完成服务提供方的接口绑定,简化了在使用Spring Cloud Ribbon时自行封装服务调用客户端的开发工作量。
Spring Cloud Feign具备可插拔的注解支持,支持Feign注解、JAX-RS注解和Spring MVC的注解。
Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现。通过Spring Cloud的封装,可以让我们轻松地将面向服务的REST模板请求,自动转换成客户端负载均衡的服务调用。Spring Cloud Ribbon虽然只是一个工具类框架,它不像服务注册中心、配置中心、API网关那样需要独立部署,但是它几乎存在于每一个Spring Cloud构建的微服务和基础设施中。因为微服务间的调用、API网关的请求转发等内容,实际上都是通过Ribbon来实现的,包括后续我们将要介绍的Feign,它也是基于Ribbon实现的工具。所以,对Spring Cloud Ribbon的理解和使用,对于我们使用Spring Cloud来构建微服务非常重要。
Archaius是用于配置管理API的组件,是一个基于Java的配置管理库,主要用于多配置的动态获取。Archaius是Netflix公司开源项目之一,基于Java的配置管理类库,主要用于多配置存储的动态获取。它的主要功能是对Apache Common Configuration类库的扩展。在云平台开发中可以将其用作分布式配置管理依赖构件。同时,它有如下一些特性:
· 动态类型化属性。
· 高效和线程安全的配置操作。
· 配置改变时的回调机制。
· 轮询框架JMX,通过Jconsole检查和调用操作属性。
· 组合配置。
Spring Cloud Bus是消息总线组件,常和Spring Cloud Config配合使用,用于动态刷新服务的配置。Spring Cloud是按照Spring的配置对一系列微服务框架的集成,而Spring Cloud Bus是其中一个微服务框架,用于实现微服务之间的通信。
Spring Cloud Bus整合Java的事件处理机制和消息中间件消息的发送和接收,主要由发送端、接收端和事件组成。针对不同的业务需求,可以设置不同的事件,发送端发送事件,接收端接收相应的事件,并进行相应的处理。
Spring Cloud Sleuth是服务链路追踪组件,封装了Dapper、Zipkin、Kibina等组件,可以实时监控服务链路的调用状况。
在微服务系统中,随着业务的发展,系统会变得越来越大,那么各个服务之间的调用关系也就变得越来越复杂。一个HTTP请求会调用多个不同的微服务来处理,并返回最后的结果,在这个调用过程中,可能会因为某个服务出现网络延迟过高或发送错误导致请求失败,这个时候,对请求调用的监控就显得尤为重要了。Spring Cloud Sleuth提供了分布式服务链路监控的解决方案。下面介绍Spring Cloud Sleuth整合Zipkin的解决方案。
Zipkin是Twitter的一个开源项目,它基于Google Dapper实现。我们可以使用它来收集各个服务器上请求链路的跟踪数据,并通过它提供的REST API接口来辅助查询、跟踪数据,以实现对分布式系统的监控,从而及时发现系统中出现的延迟过高问题。除了面向开发的API接口之外,它还提供了方便的UI组件,可帮助我们直观地搜索跟踪信息和分析请求链路明细,比如可以查询某段时间内各用户请求的处理时间。
Spring Cloud Data Flow是大数据操作组件,它是Spring XD的替代品,也是一个混合计算模型,可以通过命令行的方式操作数据流。
该组件是Spring Cloud对Consul的封装。和Eureka类似,它是一个服务注册和发现组件。
该组件是Spring Cloud对Zookeeper的封装,也用于服务注册和发现。
该组件是数据流操作组件,可以封装Redis、RabbitMQ、Kafka等组件,实现消息的接收和发送。
该组件是对Spring Boot CLI的封装,可以让用户以命令行方式快速搭建和运行容器。
该组件基于Spring Tsak,提供任务调度和任务管理的功能。