近十年国内互联网行业飞速发展, 我们对软件系统的需求已经不再是过去 "能用就行" 这种很 low 的档次了, 像 618, 双十一这样的活动 不断逼迫我们去突破软件系统的性能上限, 传统的 IT 企业 "能用就行" 的开发思想已经不能满足互联网 高并发, 大流量的性能要求 . 系统架构 走向分布式 已经是服务器开发领域解决该问题唯一的出路, 然而分布式系统由于天生的复杂度, 并不像开发单体应用一样把框架一堆就能搞定, 因此各大互联网公司都在投入技术力量研发自己的基础设施. 这里面比较有名的如 阿里的开源项目 dubbo, Netflix 开发的一系列服务框架 . 在这种 "百花齐放", 重复造轮子的状况下, 必然要出现一种统一的标准来简化分布式系统的开发, Spring Cloud 应运而生.
一, Spring Cloud 是什么
Spring Cloud 是一个微服务框架, 相比 Dubbo 等 RPC 框架, Spring Cloud 提供的全套的分布式系统解决方案.
Spring Cloud 对微服务基础框架 Netflix 的多个开源组件进行了封装, 同时又实现了和云端平台以及和 Spring Boot 开发框架的集成.
Spring Cloud 为微服务架构开发涉及的配置管理, 服务治理, 熔断机制, 智能路由, 微代理, 控制总线, 一次性 token, 全局一致性锁, leader 选举, 分布式 session, 集群状态管理等操作提供了一种简单的开发方式.
Spring Cloud 为开发者提供了快速构建分布式系统的工具, 开发者可以快速的启动服务或构建应用, 同时能够快速和云平台资源进行对接.
二, SpringCloud 架构
Spring Cloud 是一系列框架的有序集合. 它利用 Spring Boot 的开发便利性巧妙地简化了分布式系统基础设施的开发, 如 服务发现注册, 配置中心, 消息总线, 负载均衡, 断路器, 数据监控 等, 都可以用 Spring Boot 的开发风格做到一键启动和部署. Spring 并没有重复制造轮子, 它只是将目前各家公司开发的比较成熟, 经得起实际考验的服务框架组合起来, 通过 Spring Boot 风格进行再封装屏蔽掉了复杂的配置和实现原理, 最终给开发者留出了一套简单易懂, 易部署和易维护的分布式系统开发工具包. Spring Cloud 正是对 Netflix 的多个开源组件进一步的封装而成 , 同时又实现了和云端平台, 和 Spring Boot 开发框架很好的集成. Spring Cloud 是一个相对比较新的微服务框架, 2016 年才推出 1.0 的 release 版本 . 虽然 Spring Cloud 时间最短, 但是相比 Dubbo 等 RPC 框架, Spring Cloud 提供的全套的分布式系统解决方案 . Spring Cloud 为开发者提供了在分布式系统 ( 配置管理, 服务发现, 熔断, 路由, 微代理, 控制总线, 一次性 token, 全居琐, leader 选举, 分布式 session, 集群状态 ) 中快速构建的工具, 使用 Spring Cloud 的开发者可以快速的启动服务或构建应用, 同时能够快速和云平台资源进行对接.
三, Spring Cloud 组成
Spring Cloud 的子项目, 大致可分成两类, 一类是对现有成熟框架 "Spring Boot 化" 的封装和抽象, 也是数量最多的项目; 第二类是开发了一部分分布式系统的基础设施的实现, 如 Spring Cloud Stream 扮演的就是 kafka, ActiveMQ 这样的角色 . 对于我们想快速实践微服务的开发者来说, 第一类子项目就已经足够使用, 如: Spring Cloud Netflix , 是对 Netflix 开发的一套分布式服务框架的封装, 包括服务的发现和注册, 负载均衡, 断路器, REST 客户端, 请求路由等. 该项目是 Spring Cloud 的子项目之一, 主要内容是对 Netflix 公司一系列开源产品的包装, 它为 Spring Boot 应用提供了自配置的 Netflix OSS 整合. 通过一些简单的注解, 开发者就可以快速的在应用中配置一下常用模块并构建庞大的分布式系统. 它主要提供的模块包括: 服务发现 (Eureka), 断路器 (Hystrix), 智能路由 (Zuul), 客户端负载均衡 (Ribbon) 等.
Spring Cloud Netflix 这可是个大 boss, 地位仅次于老大, 老大各项服务依赖与它, 与各种 Netflix OSS 组件集成, 组成微服务的核心, 它的小弟主要有 Eureka, Hystrix, Zuul, Archaius... 太多了
(一), Spring Cloud Eureka 服务发现
1 , netflix-eureka
2, Spring Cloud Eureka 服务发现
3,Eureka
服务中心, 云端服务发现, 一个基于 REST 的服务, 用于定位服务 , 以实现云端中间层服务发现和故障转移. 这个可是 SpringCloud 最牛鼻的小弟, 服务中心 , 任何小弟需要其它小弟支持什么都需要从这里来拿, 同样的你有什么独门武功的都赶紧过报道, 方便以后其它小弟来调用; 它的好处是你不需要直接找各种什么小弟支持, 只需要到服务中心来领取, 也不需要知道提供支持的其它小弟在哪里, 还是几个小弟来支持的, 反正拿来用就行, 服务中心来保证稳定性和质量. Spring Cloud Eureka 提供在分布式环境下的服务发现, 服务注册的功能. 一个 RESTful 服务, 用来定位运行在 AWS 地区 (Region) 中的中间层服务. 由两个组件组成: Eureka 服务器和 Eureka 客户端 .Eureka 服务器用作服务注册服务器. Eureka 客户端是一个 java 客户端, 用来简化与服务器的交互, 作为轮询负载均衡器, 并提供服务的故障切换支持. Netflix 在其生产环境中使用的是另外的客户端, 它提供基于流量, 资源利用率以及出错状态的加权负载均衡.
(二), Spring Cloud Ribbon 客户端负载均衡
- ,netflix-ribbon
- ,Spring Cloud Ribbon
Ribbon, 主要提供客户侧的软件负载均衡算法. Ribbon 客户端组件提供一系列完善的配置选项, 比如连接超时, 重试, 重试算法等. Ribbon 内置可插拔, 可定制的负载均衡组件. 下面是用到的一些 负载均衡策略 :
简单轮询负载均衡
加权响应时间负载均衡
区域感知轮询负载均衡
随机负载均衡
Ribbon 中还包括以下功能:
易于与服务发现组件 (比如 Netflix 的 Eureka) 集成
使用 Archaius 完成运行时配置
使用 JMX 暴露运维指标, 使用 Servo 发布
多种可插拔的序列化选择
异步和批处理操作 (即将推出)
自动 SLA 框架 (即将推出)
系统管理 / 指标控制台 (即将推出)
- (三),Spring Cloud Config
- 1,spring-cloud-config
俗称的配置中心, 配置管理工具包, 让你可以把配置放到远程服务器, 集中化管理集群配置, 目前支持本地存储, Git 以及 Subversion . 就是以后大家武器, 枪火什么的东西都集中放到一起, 别随便自己带, 方便以后统一管理, 升级装备.
2,Spring Cloud Config 配置中心
将配置信息中央化保存, 配置 Spring Cloud Bus 可以实现动态修改配置文件. 这个还是静态的, 得配合 Spring Cloud Bus 实现动态的配置更新.
3,Spring Cloud Config
Spring Cloud Config 就是我们通常意义上的配置中心. Spring Cloud Config - 把应用原本放在本地文件的配置抽取出来放在 中心服务器 , 本质是配置信息从本地迁移到云端. 从而能够提供更好的管理, 发布能力. Spring Cloud Config 分服务端和客户端, 服务端负责将 Git(SVN) 中存储的配置文件发布成 REST 接口, 客户端可以从服务端 REST 接口获取配置. 但客户端并不能主动感知到配置的变化, 从而主动去获取新的配置, 这需要每个客户端通过 POST 方法触发各自的 / refresh.
(四), Spring cloud Hystrix 熔断器
1,netflix-hystrix
熔断器, 容错管理工具, 旨在通过熔断机制控制服务和第三方库的节点, 从而对延迟和故障提供更强大的容错能力. 比如突然某个小弟生病了, 但是你还需要它的支持, 然后调用之后它半天没有响应, 你却不知道, 一直在等等这个响应; 有可能别的小弟也正在调用你的武功绝技, 那么当请求多之后, 就会发生严重的阻塞影响老大的整体计划. 这个时候 Hystrix 就派上用场了, 当 Hystrix 发现某个小弟不在状态不稳定立马马上让它下线, 让其它小弟来顶上来 , 或者给你说不用等了这个小弟今天肯定不行, 该干嘛赶紧干嘛去别在这排队了.
2,Spring cloud Hystrix 熔断器
断路器 (Cricuit Breaker) 是一种能够在远程服务不可用时自动熔断 (打开开关), 并在远程服务恢复时自动恢复 (闭合开关) 的设施, Spring Cloud 通过 Netflix 的 Hystrix 组件 提供断路器, 资源隔离与自我修复功能.
断路器可以防止一个应用程序多次试图执行一个操作, 即很可能失败, 允许它继续而不等待故障恢复或者浪费 CPU 周期, 而它确定该故障是持久的. 断路器模式也使应用程序能够检测故障是否已经解决. 如果问题似乎已经得到纠正, 应用程序可以尝试调用操作.
3,Hystrix01
断路器增加了稳定性和灵活性, 以一个系统, 提供稳定性, 而系统从故障中恢复, 并尽量减少此故障的对性能的影响. 它可以帮助快速地拒绝对一个操作, 即很可能失败, 而不是等待操作超时 (或者不返回) 的请求, 以保持系统的响应时间. 如果断路器提高每次改变状态的时间的事件, 该信息可以被用来监测由断路器保护系统的部件的健康状况, 或以提醒管理员当断路器跳闸, 以在打开状态.
4,Hystrix02
5,Hystrix 流程图
(五), Spring Cloud Zuul 服务网关, 智能路由
1,netflix-zuul
Zuul 是在云平台上提供动态路由, 监控, 弹性, 安全等边缘服务的框架. Zuul 相当于是设备和 Netflix 流应用的 web 网站后端所有请求的前门. 当其它门派来找大哥办事的时候一定要先经过 zuul, 看下有没有带刀子什么的给拦截回去, 或者是需要找那个小弟的直接给带过去.
2,Spring Cloud Zuul 服务网关
3,Zuul
类似 Nginx, 反向代理的功能, 不过 netflix 自己增加了一些配合其他组件的特性.
- (六), Spring Netflix Archaius
- 1,netflix-archaius
配置管理 API, 包含一系列配置管理 API, 提供动态类型化属性, 线程安全配置操作, 轮询框架, 回调机制等功能. 可以实现动态获取配置, 原理是 每隔 60s(默认, 可配置) 从配置源读取一次内容 , 这样修改了配置文件后不需要重启服务就可以使修改后的内容生效, 前提使用 archaius 的 API 来读取.
- (七), Spring Cloud Bus
- 1,spring-cloud-bus
事件, 消息总线, 用于在集群 (例如, 配置变化事件) 中传播状态变化, 可与 Spring Cloud Config 联合实现热部署 . 相当于水浒传中日行八百里的神行太保戴宗, 确保各个小弟之间消息保持畅通.
分布式消息队列, 是对 Kafka, MQ 的封装; 事件, 消息总线, 用于在集群 (例如, 配置变化事件) 中传播状态变化, 可与 Spring Cloud Config 联合实现 热部署 . Spring cloud bus 通过轻量消息代理连接各个分布的节点. 这会用在广播状态的变化 (例如配置变化) 或者其他的消息指令. Spring bus 的一个核心思想是通过分布式的启动器对 spring boot 应用进行扩展, 也可以用来建立一个多个应用之间的通信频道. 目前唯一实现的方式是用 AMQP 消息代理作为通道, 同样特性的设置 (有些取决于通道的设置) 在更多通道的文档中. Spring cloud bus 被国内很多都翻译为消息总线, 也挺形象的. 大家可以将它理解为管理和传播所有分布式项目中的消息既可, 其实本质是利用了 MQ 的广播机制在分布式的系统中传播消息, 目前常用的有 Kafka 和 RabbitMQ. 利用 bus 的机制可以做很多的事情, 其中配置中心客户端刷新就是典型的应用场景之一, 我们用一张图来描述 bus 在配置中心使用的机制.
2,Spring Cloud Bus
根据此图我们可以看出利用 Spring Cloud Bus 做配置更新的步骤:
提交代码触发 post 给客户端 A 发送 bus/refresh
客户端 A 接收到请求从 Server 端更新配置并且发送给 Spring Cloud Bus
Spring Cloud bus 接到消息并通知给其它客户端
其它客户端接收到通知, 请求 Server 端获取最新配置
全部客户端均获取到最新的配置
- (八),Spring Cloud Security
- 1,spring-cloud-security
对 Spring Security 的封装, 并能配合 Netflix 使用, 安全工具包, 为你的应用程序添加安全控制, 主要是指 OAuth2 . 基于 spring security 的安全工具包, 为你的应用程序添加安全控制. 这个小弟很牛鼻专门负责整个帮派的 安全问题 , 设置不同的门派访问特定的资源, 不能把秘籍葵花宝典泄漏了.
- (九), Spring Cloud Zookeeper
- 1,spring-cloud-zookeeper
对 Zookeeper 的封装, 使之能配置其它 Spring Cloud 的子项目使用; 操作 Zookeeper 的工具包, 用于使用 zookeeper 方式的服务注册和发现 . ZooKeeper 是一个分布式的, 开放源码的分布式应用程序协调服务, 是 Google 的 Chubby 一个开源的实现, 是 Hadoop 和 Hbase 的重要组件. 它是一个为分布式应用提供一致性服务的软件, 提供的功能包括: 配置维护, 域名服务, 分布式同步, 组服务等. ZooKeeper 的目标就是封装好复杂易出错的关键服务, 将简单易用的接口和性能高效, 功能稳定的系统提供给用户. 操作 Zookeeper 的工具包, 用于使用 zookeeper 方式的服务发现和配置管理, 抱了 Zookeeper 的大腿.
- (十), Spring Cloud Stream
- spring-cloud-stream
数据流; 数据流操作开发包, 封装了与 Redis,Rabbit,Kafka 等发送接收消息. Spring Cloud Stream 是创建消息驱动微服务应用的框架. Spring Cloud Stream 是基于 spring boot 创建, 用来建立单独的 / 工业级 spring 应用, 使用 spring integration 提供与消息代理之间的连接. 数据流操作开发包, 封装了与 Redis,Rabbit,Kafka 等发送接收消息. 一个业务会牵扯到多个任务, 任务之间是通过事件触发的, 这就是 Spring Cloud stream 要干的事了.
- (十一), Spring Cloud Sleuth
- spring-cloud-sleuth
服务跟踪; 日志收集工具包, 封装了 Dapper,Zipkin 和 HTrace 操作. 日志收集工具包, 封装了 Dapper 和 log-based 追踪以及 Zipkin 和 HTrace 操作, 为 SpringCloud 应用实现了一种分布式追踪解决方案.
(十二),Spring Cloud Feign 使用 HTTP 请求远程服务
netflix-feign
在 Spring Cloud Netflix 栈中, 各个微服务都是以 HTTP 接口的形式暴露自身服务的, 因此在调用远程服务时就必须使用 HTTP 客户端. 我们可以使用 JDK 原生的 URLConnection,Apache 的 Http Client,Netty 的异步 HTTP Client, Spring 的 RestTemplate. 但是, 用起来最方便, 最优雅的还是要属 Feign 了. Feign 是一种声明式, 模板化的 HTTP 客户端 . 在 Spring Cloud 中使用 Feign, 我们可以做到使用 HTTP 请求远程服务时能与调用本地方法一样的编码体验, 开发者完全感知不到这是远程方法, 更感知不到这是个 HTTP 请求. 通过 Feign, 我们能把 HTTP 远程调用对开发者完全透明, 得到与调用本地方法一致的编码体验. 这一点与阿里 Dubbo 中暴露远程服务的方式类似, 区别在于 Dubbo 是基于私有二进制协议, 而 Feign 本质上还是个 HTTP 客户端 . 如果是在用 Spring Cloud Netflix 搭建微服务, 那么 Feign 无疑是最佳选择.
- (十三) Spring Cloud for Cloud Foundry
- pivotal-cloud-foundry
Cloud Foundry 是 VMware 推出的业界第一个开源 PaaS 云平台, 它支持多种框架, 语言, 运行时环境, 云平台及应用服务, 使开发人员能够在几秒钟内进行应用程序的部署和扩展, 无需担心任何基础架构的问题 其实就是与 CloudFoundry 进行集成的一套解决方案, 抱了 Cloud Foundry 的大腿.
- (十四), Spring Cloud Cluster
- spring-cloud-cluster
Spring Cloud Cluster 将取代 Spring Integration. 提供在分布式系统中的集群所需要的基础功能支持, 如: 选举, 集群的状态一致性, 全局锁, tokens 等 常见状态模式的抽象和实现. 如果把不同的帮派组织成统一的整体, Spring Cloud Cluster 已经帮你提供了很多方便组织成统一的工具.
- (十五),Spring Cloud Consul
- hashicorp-consul
Consul 是一个支持多数据中心分布式高可用的服务发现和配置共享的服务软件, 由 HashiCorp 公司用 Go 语言开发 , 基于 Mozilla Public License 2.0 的协议进行开源. Consul 支持健康检查, 并允许 HTTP 和 DNS 协议调用 API 存储键值对. Spring Cloud Consul 封装了 Consul 操作, consul 是一个服务发现与配置工具, 与 Docker 容器可以无缝集成.
- (十六), Spring Cloud Data Flow
- spring-cloud-data-flow
Data flow 是一个用于开发和执行大范围数据处理其模式包括 ETL, 批量运算和持续运算的统一编程模型和托管服务. 对于在现代运行环境中可组合的微服务程序来说, Spring Cloud data flow 是一个原生云可编配的服务. 使用 Spring Cloud data flow, 开发者可以为像数据抽取, 实时分析, 和数据导入 / 导出这种常见用例创建和编配数据通道 (data pipelines). Spring Cloud data flow 是基于原生云对 spring XD 的重新设计, 该项目目标是简化大数据应用的开发. Spring XD 的流处理和批处理模块的重构分别是基于 spring boot 的 stream 和 task/batch 的微服务程序. 这些程序现在都是自动部署单元而且他们原生的支持像 Cloud Foundry,Apache YARN,Apache Mesos 和 Kubernetes 等现代运行环境. Spring Cloud data flow 为基于微服务的分布式流处理和批处理数据通道提供了一系列模型和最佳实践.
- (十七),Spring Cloud Task
- spring-cloud-task
Spring Cloud Task 主要解决短命微服务的任务管理, 任务调度的工作, 比如说某些定时任务晚上就跑一次, 或者某项数据分析临时就跑几次.
- (十八), Spring Cloud Connectors
- spring-cloud-connectors
Spring Cloud Connectors 简化了连接到服务的过程和从云平台获取操作的过程, 有很强的扩展性, 可以利用 Spring Cloud Connectors 来构建你自己的云平台. 便于云端应用程序在各种 PaaS 平台连接到后端, 如: 数据库和消息代理服务.
- (十九), Spring Cloud Starters
- spring-cloud-starters
Spring Boot 式的启动项目, 为 Spring Cloud 提供开箱即用的依赖管理.
- (二十), Spring Cloud CLI
- spring-cloud-cli
基于 Spring Boot CLI, 可以让你以命令行方式快速建立云组件.
- (二十一), Netflix Turbine
- netflix-turbine
Turbine 是聚合服务器发送事件流数据的一个工具, 用来监控集群下 hystrix 的 metrics 情况.
四, 和 Spring Boot 是什么关系
Spring boot 是 Spring 的一套 快速配置脚手架 , 可以基于 spring boot 快速开发单个微服务, Spring Cloud 是一个基于 Spring Boot 实现的云应用开发工具; Spring boot 专注于快速, 方便集成的单个个体, Spring Cloud 是关注全局的服务治理框架; spring boot 使用了默认大于配置的理念, 很多集成方案已经帮你选择好了, 能不配置就不配置, Spring Cloud 很大的一部分是基于 Spring boot 来实现, 可以不基于 Spring boot 吗? 不可以. Spring boot 可以离开 Spring Cloud 独立使用开发项目, 但是 Spring Cloud 离不开 Spring boot, 属于依赖的关系
Spring -> Spring Boot> Spring Cloud 这样的关系.
来源: http://www.bubuko.com/infodetail-3099357.html