Spring Cloud是一系列框架的有序集合,它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。
Spring Cloud 大致可分成两类:
- 对现有成熟框架”Spring Boot化”的封装和抽象,也是数量最多的项目。
- 开发了一部分分布式系统的基础设施的实现,如Spring Cloud Stream扮演的就是kafka, ActiveMQ 这样的角色。
对于我们想快速实践微服务的开发者来说,第一类子项目就已经足够使用,组件架构如下图所示:
Spring Cloud Config
在微服务架构中,为散落在服务器各个角落的微服务组件提供一套在线的配置服务。Spring Cloud Config 将配置信息中央化保存, 配置Spring Cloud Bus可以实现动态修改配置文件。
好处
- 为整个服务提供统一的配置,避免在每个微服务中修改配置带来的不便和易出错的问题;
- 保证了微服务配置能自动化更新到各个组件中,避免在修改配置后重启时出现服务不稳定的情况。
架构图
概念:
- Git/SVN :这里存放整个微服务的所有配置
- Config Server: 读取 Git/SVN 的配置,并提供 web 接口
- Config Client: 和 Config Server 交互的应用实例
- 负载均衡器:可以将 Config Client 请求平均分配到每一个 Config Server 上
Spring Cloud Consul
Spring Cloud Consul 和 Spring Cloud Eureka 一样,Consul也是一个一站式的服务注册与发现框架,内置了服务注册与发现、分布式一致性协议实现、健康检查、Key-Value存储和多数据中心方案,因此不需要依赖第三方工具(例如ZooKeeper)便可完成服务注册与发现,简单易用。
Consul与其他框架的特性对比:
Spring Cloud Netflix
对 Netflix开发的一套分布式服务框架的封装,包括服务的发现和注册,负载均衡、断路器、REST客户端、请求路由等。
Spring Cloud Eureka
Spring Cloud Eureka 是主要负责微服务架构中的服务治理。服务治理必须实现服务注册和服务发现的功能。
服务注册和发现: 每个微服务向注册中心汇报自己的服务地址、服务内容、端口和服务状态等信息。当有服务依赖此服务时,从注册中心获取可用的服务列表并发起请求,服务消费者不用关心服务所处的位置和状态,具体用哪个实例对外提供服务则由注册中心决定。
Service Provider 和 Eureka Server 之间的关系
- 首先 Service Provider 将自己的信息注册到Eureka Server,告诉它有我这么个服务,就像身份证一样,这个过程称为 服务注册
- 然后 Service Provider 平时定期发布朋友圈(心跳),告诉 Eureka Server 刷点存在感,这个过程称为 服务续约
- 有一天 Service Provider 不想干了,想休息下,主动告诉 Eureka Server 我要下线了,注册中心收到信息后,会将该服务实例的状态置为下线,这个过程称为 服务下线
- Eureka Server 迟迟收不到 Service Provider 动态,又收不到它的下线消息,为了让社区保持干净,就认为 Service Provider 不能提供服务了,就清除这个服务的相关信息。这个过程称为 失效剔除
Eureka Server 和 Eureka Server 之间的关系
-
这么多的 Eureka Server ,需要有一个老大来管理他们,由这个老大告诉小的们服务列表,以及每个服务对应的基础信息,这个过程称为 服务同步
-
面对新人,我们主打的就是加入,将服务列表(看家本领)告诉新人,这个过程称为 服务初始化
-
有一天 Leader 不行了,想要休息下,别怕,小的们再次竞争,总有 Eureka Server 可以接手,继续搬砖,这个过程需要 选举
Eureka Server 和 Eureka Client(Service Consumer) 之间的关系
一个服务实例常常既是服务消费者也是服务提供者, 作为一名合格的消费者自然是需要求被服务啦,由于服务五花八门,不能直接定位到具体的服务,所以只能寻找 Eureka Server(中介),告诉它我需要的服务类型。
Eureka Server 将根据 服务类型,提供对应的这个类型的 Service Provider ,这个过程称为 服务发现
Spring Cloud Feign
Feign是一种声明式、模板化的HTTP Client。它的目标是使编写Java HTTP Client变得更简单。在并发要求不高的情况下可以作为RPC方案使用,实现服务之间的解耦。Feign应用分为服务提供者和服务消费者。
Spring Cloud Hystrix
Netflix Hystrix 是熔断器的一种实现,主要应用于微服务架构的高可用,防止出现服务雪崩等问题。
当某个服务不可用时,
-
服务熔断: 切断这个链路的请求。
-
服务降级: 不调用远程服务,返回预先定义的 fallback 方法放回的异常信息。
-
依赖隔离:
- 将请求放在服务对应的线程池中,排队等待
- 计算被依赖服务的信号量 > 最大线程值 => 直接返回错误
-
请求缓存: 按照请求参数缓存对应的请求结果,返回这个请求结果
-
请求合并: 采用异步调用的方式提交请求,然后订阅返回值,当所有请求都返回时,应用程序会得到一个通知,取出返回值合并即可。
- 熔断器判断状态为
开路,则跳转到降级后业务逻辑应答为服务失败。 - 熔断器判断状态为
闭路或者半开路,则检查资源。- 如果资源可用,则执行正常业务逻辑,并且调用成功,则应答为服务成功,如果调用失败或者超时,则跳转到
降级后业务逻辑应答为服务失败 - 如果资源不可用,则跳转到
降级后业务逻辑应答为服务失败。
- 如果资源可用,则执行正常业务逻辑,并且调用成功,则应答为服务成功,如果调用失败或者超时,则跳转到
由上图可以知道有三个状态决定着,走哪条路,那么这三个状态之间又是如何切换的呢?以下就是三个状态的流程切换图:
这三个状态是熔断器的状态:
- 闭路 表示关闭熔断器功能
- 开路 表示打开熔断器功能,将所有请求都返回
- 半开路 是过渡态,给服务器一个改过自新的机会。
- 当请求失败到一定阈值时,
闭路->开路 - 当 处于
开路状态 到一定时间,比如 5s,开路->半开路 半开路状态下,如果请求依旧是失败,则半开路->开路半开路状态下,如果请求成功,则半开路->闭路
Spring Cloud Zuul
微服务网关,和Eureka、Ribbon、Hystrix等组件配合使用完成服务网关的动态路由、负载均衡等功能。其核心特点如下:
安全性:
- 资源审查(访问控制):对每个请求都进行资源验证审查,拒绝非法请求。
- 身份认证:对每个请求的用户都进行身份认证,拒绝非法用户,身份认证一般基于HTTP消息头完成。
- 资源监控:通过对有意义的数据进行追踪和请求统计,为分析生产环境中接口的调用状态和用户的行为提供依据。
可用性:
- 动态路由:对外提供统一的网关服务,动态地将不同类型的请求路由到不同的后端集群,实现对外提供统一的网关服务和对内进行有效的服务拆分。
- 压力测试:通过配置设置不同集群的负载流量,预估集群的性能。
- 负载均衡:为每一种负载类型都分配对应的容量,针对不同的请求做更细粒度的负载均衡,并弃用超出限定值的请求,进行服务保护。
- 多区域弹性:跨越区域进行请求路由,旨在实现ELB(Elastic Load Balance,弹性负载均衡)使用的多样化,并保证边缘位置与使用者尽可能接近。
链路监控工具
- Sleuth+Zipkin
- Pinpoint
Spring Cloud Stream
分布式消息队列,是对Kafka, MQ的封装
Spring Cloud Security
对Spring Security的封装,并能配合Netflix使用
Spring Cloud Zookeeper
对Zookeeper的封装,使之能配置其它Spring Cloud的子项目使用