阅读 91

Spring Cloud简单介绍

摘要

本文主要从是什么?为什么?怎么做?三个方面来来介绍SpringCloud,部分参考官方文档和技术博客,详细链接在文章最下方给出

是什么? SpringCloud是什么?用来干什么的?
为什么?为什么选用SpringCloud?他有哪些优势?
怎么做? 如何使用SpringCloud?以及SpringCloud的各个组件的作用?复制代码

是什么?

1. Spring Cloud简单介绍

Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Spring并没有重复制造轮子,它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。
微服务是可以独立部署、水平扩展、独立访问(或者有独立的数据库)的服务单元,springcloud就是这些微服务的大管家,采用了微服务这种架构之后,项目的数量会非常多,springcloud需要管理好这些微服务。

2. 官方介绍

Spring Cloud provides tools for developers to quickly build some of the common patterns in distributed systems (e.g. configuration management, service discovery, circuit breakers, intelligent routing, micro-proxy, control bus, one-time tokens, global locks, leadership election, distributed sessions, cluster state). Coordination of distributed systems leads to boiler plate patterns, and using Spring Cloud developers can quickly stand up services and applications that implement those patterns. They will work well in any distributed environment, including the developer’s own laptop, bare metal data centres, and managed platforms such as Cloud Foundry.
Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智能路由,微代理,控制总线,一次性令牌,全局锁定,领导选举,分布式会话,集群状态)。分布式系统的协调导致锅炉板模式,使用Spring Cloud开发人员可以快速站起来实现这些模式的服务和应用程序。它们适用于任何分布式环境,包括开发人员自己的笔记本电脑,裸机数据中心和Cloud Foundry等托管平台。

3. 核心成员概览

服务注册中心
Spring Cloud Netflix Eureka
服务调用方式
REST API
服务监控
Spring Boot Admin
断路器
Spring Cloud Netflix Hystrix
服务网关
Spring Cloud Netflix Zuul
分布式配置
Spring Cloud Config
服务跟踪
Spring Cloud Sleuth
消息总线
Spring Cloud Bus
数据流
Spring Cloud Stream
批量任务
Spring Cloud Task

4. 和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 这样的关系。复制代码

为什么?

1. Spring Cloud的优势?

Spring Cloud focuses on providing good out of box experience for typical use cases and extensibility mechanism to cover others.
Spring Cloud专注于为典型用例提供良好的开箱即用体验,并为其他用户提供可扩展性机制。

另外,Spring Cloud 诞生于微服务架构时代,考虑的是微服务治理的方方面面,另外由于依托了 Spring、Spring Boot 的优势之上,Spring Cloud 是一个生态。

2. 为什么选用SpringCloud?

微服务的框架那么多比如:dubbo、Kubernetes,为什么就要使用Spring Cloud的呢?
  • 产出于spring大家族,spring在企业级开发框架中无人能敌,来头很大,可以保证后续的更新、完善。比如dubbo现在就差不多死了
  • 有Spring Boot 这个独立干将可以省很多事,大大小小的活Spring Boot都搞的挺不错。
  • 作为一个微服务治理的大家伙,考虑的很全面,几乎服务治理的方方面面都考虑到了,方便开发开箱即用。
  • Spring Cloud 活跃度很高,教程很丰富,遇到问题很容易找到解决方案
  • 轻轻松松几行代码就完成了熔断、均衡负载、服务中心的各种平台功能
Spring Cloud对于中小型互联网公司来说是一种福音,因为这类公司往往没有实力或者没有足够的资金投入去开发自己的分布式系统基础设施,使用Spring Cloud一站式解决方案能在从容应对业务发展的同时大大减少开发成本。同时,随着近几年微服务架构和Docker容器概念的火爆,也会让Spring Cloud在未来越来越“云”化的软件开发风格中立有一席之地,尤其是在目前五花八门的分布式解决方案中提供了标准化的、全站式的技术方案,意义可能会堪比当前Servlet规范的诞生,有效推进服务端软件系统技术水平的进步。

Spring Cloud 架构体系有有趣很酷的技术。如果公司选择微服务架构去重构整个技术体系,那么 Spring Cloud 是当仁不让之选,它可以说是目前最好的微服务框架没有之一。


怎么用?

1. 核心模块介绍

为了轻松实现微服务架构,业界已经确定了一些常见的模式来帮助实现这一点。一些众所周知的模式是集中配置管理,服务发现,异步消息驱动和分布式跟踪。Spring Cloud将这些模式作为可用的模块提供,并帮助我们遵循云原生最佳实践。除此之外,Spring Cloud的独特价值可以体现在以下几个方面:
  1. 为常用模块定义通用抽象。这是Spring的解耦理念的完美应用。每种模式都没有与具体实施紧密结合。以配置服务器为例; 您可以自由地更改后端存储而不会影响其他服务。
  2. 模块化组件。Spring Cloud不是一个全有或全无的解决方案,所有的模块都是可选的。
a. 通过Spring Cloud Config进行集中配置管理
为了满足Store config in environment 微服务架构的要求 ,我们需要将所有服务的配置放在一个集中的位置。为此,需要以下功能:
  1. 支持多种环境,如dev,test和prod。然后我们可以为所有环境构建一个包。
  2. 透明配置提取。 应该自动获取这些集中式配置,无需任何用户编码。
  3. 属性更改时自动刷新属性。应通过此类更改通知服务并重新加载新属性。
  4. 保持更改历史记录并轻松恢复到旧版本。 这是一个非常有用的功能,可以恢复生产环境中的错误更改。
Spring Cloud Config通过在配置服务中使用一个简单的注释@EnableConfigServer来支持所有这些功能,并在其他服务中包含启动器以启用客户端。有关更多详细信息,请参阅 Spring Cloud Config文档

b. 通过Spring Cloud Discovery发现服务
服务发现在大多数分布式系统和面向服务的体系结构中起着重要作用。这个问题起初看起来很简单:客户如何知道多个主机上可能存在的服务的IP和端口?当您开始在多功能云环境中部署更多服务时,事情变得更加复杂。
实际上,这通常分两步完成:
  • 服务注册 - 服务在中央注册表中注册其位置的过程。它通常注册其主机和端口,有时还会注册身份验证凭据,协议,版本和环境详细信息。
  • 服务发现 - 客户端应用程序查询中央注册表以了解服务位置的过程。
在选择服务发现解决方案时,应考虑以下几个方面:
  • 容错 - 注册服务失败后会发生什么?有时它会在正常关闭时立即取消注册,但大多数情况下我们需要一个超时机制。服务不断发送心跳以确保活力。除此之外,客户还需要能够通过自动重试另一个服务来处理失败的服务。
  • 负载均衡 - 如果在服务下注册了多个主机,我们如何平衡主机之间的负载?是否会在注册表端或客户端进行负载均衡?我们可以提供自定义负载均衡策略吗?
  • 整合工作 - 整合过程有多复杂?它是否只涉及一些新的依赖和/或配置更改?还是侵入式发现代码?当您的语言不受支持时,有时候单独的sidekick过程是一个不错的选择。
  • 可用性问题 - 注册表本身是否具有高可用性?可以在没有停机的情况下升级吗?注册表不应该是单点故障。
Spring Cloud为注册和发现提供了一个通用的抽象,这意味着您只需要使用@EnableDiscoveryClient来使其工作。发现实现的示例包括 Spring Cloud Discovery EurekaSpring Cloud Discovery Zookeeper。您应该根据您的用户案例选择具体的实现。有关更多详细信息,请参阅 Spring Cloud Discovery文档

c. 通过Spring Cloud Stream实现消息驱动的架构
假设我们有一些微服务,然后必须相互通信。显然,传统的同步方式是阻塞且难以扩展,这在复杂的分布式环境中无法生存,因此异步消息驱动是正确的方法。在现代世界中,每个请求云都被视为一条消息。因此,各种消息传递中间件都可以使用自己的消息格式和API。让所有这些中间件相互通信是一场灾难。实际上,解决这个问题很容易; 只需定义一个统一的消息接口,然后每个中间件提供一个适配器,它知道如何在它们的消息格式和标准格式之间进行转换。现在您已经掌握了Spring Integration的核心设计原则。Spring Integration受以下目标的驱动:
  1. 提供实现复杂企业集成解决方案的简单模型。
  2. 促进基于Spring的应用程序中的异步,消息驱动行为。
  3. 促进现有Spring用户的直观,渐进式采用。
并遵循以下原则:
  1. 组件应松散耦合,以实现模块化和可测试性。
  2. 该框架应该强制分离业务逻辑和集成逻辑之间的关注点。
  3. 扩展点本质上应该是抽象的,但是在明确定义的边界内,以促进重用和可移植性。
有关更多详细信息,请参阅 Spring Integration文档
但是,Spring Integration仍然处于较低级别,并且包含非直观的混淆术语。编程模型不像其他Spring技术那样易于使用。因此发明了Spring Cloud Stream。它基于Spring集成提供的标准消息格式和各种适配器,在高级绑定器抽象中工作,以更容易的方式生成,处理和使用消息。它看起来像一个unix管道; 你只需要担心如何处理消息。消息将按预期进出。Spring Cloud Stream提供如下高级功能:
  1. 消费者集团。这是由Apache Kafka首先介绍和推广的。它可以在一个编程模型中支持发布 - 订阅和竞争队列。
  2. 分区。基于用户提供的分区密钥,在一个物理段中保证生成的具有相同分区密钥的消息。这在有状态处理中至关重要,因为出于性能或一致性的原因,需要一起处理相关数据。
  3. 自动内容协商。根据用户接受的消息类型自动进行消息类型转换。
有关更多详细信息,请参阅 Spring Cloud Stream文档

d. 通过Spring Cloud Sleuth和Zipkin进行分布式跟踪
在微服务架构下,一个外部请求可能涉及多个内部服务调用,并且这些服务可能分布在许多机器上。尽管大多数解决方案都实现了集中式日志记录存储和搜索,但仍然难以跟踪跨多个服务的端到端事务。弄清楚请求如何通过应用程序也意味着多次手动搜索日志关键字以找到线索。这非常耗时且容易出错,尤其是当您对微服务拓扑结构不够了解时。实际上,我们需要的是在一个地方关联和聚合这些日志。
Spring Cloud Sleuth通过引入Span和Trace的概念来实现这种相关性。Span表示一个基本工作单元,例如调用服务,由span ID标识。一组跨度形成一个名为Trace的树状结构。跟踪ID将保持与一个微服务调用下一个的相同。两者都将包含在每个日志条目中。此外,它自动设置常见的通信渠道:
  • 我们之前讨论过对Spring Cloud Stream Binder的请求
  • Spring MVC控制器收到的HTTP头
  • 请求 RestTemplate
  • ......以及Spring-ecology中的大多数其他类型的请求和回复
有了这些原始数据,仍然很难理解诸如微服务调用消耗最多时间之类的事情。Zipkin提供了一个漂亮的UI,以帮助我们可视化和理解。您可以使用简单的注释准备好Zipkin服务器 @EnableZipkinServer。有关更多详细信息,请参阅 Spring Cloud Sleuth文档

2. Netflix介绍

Netflix(/nɛtflɪks/,官方中文名:网飞,民间翻译:奈飞)是一间在世界多国提供网络视频点播的OTT服务公司[7],并同时在美国经营单一费率邮寄DVD出租服务。该服务是使用回邮信封寄送DVD和Blu-ray出租光盘至消费者指定的收件地址。公司由里德·哈斯廷斯和马尔克·兰多夫在1997年8月29日成立,总部位于加利福尼亚州洛斯盖图,1999年开始推出订阅制的服务。到了2009年,Netflix已可提供超过10万部电影DVD,订阅者数超过1000万人[8]。2007年2月25日,Netflix宣布已寄出第10亿份DVD。[9]2011年4月,Netflix在美国有超过2300万名订阅者,在世界其他国家共有超过2600万名订阅者。[10]在2011年,Netflix的数字总营收超过了150亿美元。[11]然而在2012年10月23日,Netflix宣布当年度第三季的营收下滑了88%[12]。2013年1月,Netflix宣布在2012年第四季期间在美国增加了200万名订阅者,美国的流服务总订阅者数达到2710万,世界其他国家则共有2940万名流服务订阅者。此外,在同一期间,Netflix的营收提升了8%,达到9.45亿美元。[13]2013年3月中旬,Netflix共有3300万名订阅者[14]。订阅者数在2013年4月达到3630万人(其中美国订阅者数为2920万人)[15]。其后Netflix的订户数与营收持续增长。截至2015年10月,Netflix在全世界共有6917万名订阅者,其中美国的订阅者超过4300万人。[16]

Netflix公司提供光盘出租和视频订阅服务,13年视频订阅者为六千万名,如此大的体量造就了Netflix在分布式应用方面的成就。

Spring Cloud Netflix与各种Netflix OSS组件集成,组成微服务的核心,它组件主要有Eureka, Hystrix, Zuul, Archaius…

3. 核心组件介绍

  • Spring Cloud Netflix Eureka
服务中心(类似于管家的概念,需要什么直接从这里取,就可以了),一个基于 REST 的服务,用于定位服务,以实现云端中间层服务发现和故障转移。
服务中心,云端服务发现,一个基于 REST 的服务,用于定位服务,以实现云端中间层服务发现和故障转移。这个可是springcloud最牛鼻的小弟,服务中心,任何小弟需要其它小弟支持什么都需要从这里来拿,同样的你有什么独门武功的都赶紧过报道,方便以后其它小弟来调用;它的好处是你不需要直接找各种什么小弟支持,只需要到服务中心来领取,也不需要知道提供支持的其它小弟在哪里,还是几个小弟来支持的,反正拿来用就行,服务中心来保证稳定性和质量。
  • Spring Cloud Netflix Hystrix
熔断器,容错管理工具,旨在通过熔断机制控制服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力。
熔断器,容错管理工具,旨在通过熔断机制控制服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力。比如突然某个小弟生病了,但是你还需要它的支持,然后调用之后它半天没有响应,你却不知道,一直在等等这个响应;有可能别的小弟也正在调用你的武功绝技,那么当请求多之后,就会发生严重的阻塞影响老大的整体计划。这个时候Hystrix就派上用场了,当Hystrix发现某个小弟不在状态不稳定立马马上让它下线,让其它小弟来顶上来,或者给你说不用等了这个小弟今天肯定不行,该干嘛赶紧干嘛去别在这排队了。
  • Spring Cloud Netflix Zuul
网关,是在云平台上提供动态路由,监控,弹性,安全等边缘服务的框架。Web 网站后端所有请求的前门。
Zuul 是在云平台上提供动态路由,监控,弹性,安全等边缘服务的框架。Zuul 相当于是设备和 Netflix 流应用的 Web 网站后端所有请求的前门。当其它门派来找大哥办事的时候一定要先经过zuul,看下有没有带刀子什么的给拦截回去,或者是需要找那个小弟的直接给带过去。
  • Spring Cloud Netflix Archaius 

配置管理 API,包含一系列配置管理API,提供动态类型化属性、线程安全配置操作、轮询框架、回调机制等功能。

配置管理API,包含一系列配置管理API,提供动态类型化属性、线程安全配置操作、轮询框架、回调机制等功能。可以实现动态获取配置, 原理是每隔60s(默认,可配置)从配置源读取一次内容,这样修改了配置文件后不需要重启服务就可以使修改后的内容生效,前提使用archaius的API来读取。
  • Spring Cloud Netflix Ribbon 负载均衡。
  • Spring Cloud Netflix Fegin REST客户端。
  • Spring Cloud Bus

 消息总线,利用分布式消息将服务和服务实例连接在一起,用于在一个集群中传播状态的变化。

事件、消息总线,用于在集群(例如,配置变化事件)中传播状态变化,可与Spring Cloud Config联合实现热部署。相当于水浒传中日行八百里的神行太保戴宗,确保各个小弟之间消息保持畅通。
  • Spring Cloud Cluster 

集群工具,基于 Zookeeper, Redis, Hazelcast, Consul 实现的领导选举和平民状态模式的抽象和实现。

  • Spring Cloud Consul 

基于 Hashicorp Consul 实现的服务发现和配置管理。

  • Spring Cloud Cluster

将取代Spring Integration。提供在分布式系统中的集群所需要的基础功能支持,如:选举、集群的状态一致性、全局锁、tokens等常见状态模式的抽象和实现。

如果把不同的帮派组织成统一的整体,Spring Cloud Cluster已经帮你提供了很多方便组织成统一的工具。
  • Spring Cloud Consul
Consul 是一个支持多数据中心分布式高可用的服务发现和配置共享的服务软件,由 HashiCorp 公司用 Go 语言开发, 基于 Mozilla Public License 2.0 的协议进行开源. Consul 支持健康检查,并允许 HTTP 和 DNS 协议调用 API 存储键值对.
Spring Cloud Consul 封装了Consul操作,consul是一个服务发现与配置工具,与Docker容器可以无缝集成。
  • Spring Cloud for Cloud Foundry
Cloud Foundry是VMware推出的业界第一个开源PaaS云平台,它支持多种框架、语言、运行时环境、云平台及应用服务,使开发人员能够在几秒钟内进行应用程序的部署和扩展,无需担心任何基础架构的问题
其实就是与CloudFoundry进行集成的一套解决方案,抱了Cloud Foundry的大腿。
  • Spring Cloud Security 

安全控制,在 Zuul 代理中为 OAuth2 REST 客户端和认证头转发提供负载均衡。

基于spring security的安全工具包,为你的应用程序添加安全控制。这个小弟很牛鼻专门负责整个帮派的安全问题,设置不同的门派访问特定的资源,不能把秘籍葵花宝典泄漏了。
  • Spring Cloud Sleuth 

分布式链路监控,SpringCloud 应用的分布式追踪系统,和 Zipkin,HTrace,ELK 兼容。

日志收集工具包,封装了Dapper和log-based追踪以及Zipkin和HTrace操作,为SpringCloud应用实现了一种分布式追踪解决方案。
  • Spring Cloud Task

 短生命周期的微服务,为 Spring Booot 应用简单声明添加功能和非功能特性。

主要解决短命微服务的任务管理,任务调度的工作,比如说某些定时任务晚上就跑一次,或者某项数据分析临时就跑几次。
  • Spring Cloud Zookeeper 

服务发现和配置管理基于 Apache Zookeeper。

ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。
操作Zookeeper的工具包,用于使用zookeeper方式的服务发现和配置管理,抱了Zookeeper的大腿。
  • Spring Cloud for Amazon Web Services 

快速和亚马逊网络服务集成。

  • Spring Cloud Starters
Spring Boot式的启动项目,为Spring Cloud提供开箱即用的依赖管理。
  • Spring Cloud CLI 
基于 Spring Boot CLI,可以让你以命令行方式快速建立云组件。
  • Spring Cloud Connectors 

简化了连接到服务的过程和从云平台获取操作的过程,有很强的扩展性,可以利用Spring Cloud Connectors来构建你自己的云平台。

便于云端应用程序在各种PaaS平台连接到后端,如:数据库和消息代理服务。

  • Spring Cloud Stream 

创建消息驱动微服务应用的框架, 基于Spring Boot创建,用来建立单独的/工业级spring应用,使用spring integration提供与消息代理之间的连接。数据流操作开发包,封装了与Redis,Rabbit、Kafka等发送接收消息。

一个业务会牵扯到多个任务,任务之间是通过事件触发的,这就是Spring Cloud stream要干的事了

  • 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 为基于微服务的分布式流处理和批处理数据通道提供了一系列模型和最佳实践。

总结

本文主要从三个问题认识了SpringCloud:

1.SpringCloud是什么?

Spring Cloud是一系列框架的有序集合,为开发人员提供了快速构建分布式系统中一些常见模式的工具,解决分布式应用中的服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等问题。

2.为什么选用SpringCloud?

  • 基于http协议,使用RESTful风格,接口简洁方便,高效透明(Dubbo使用RPC协议,性能稍优于Http协议,但强耦合度较高)
  • 依托于spring平台、使用Spring Boot来构建服务,功能全面且开箱即用
  • 社区活跃度高文档丰富

3.如何使用SpringCloud?

a. SpringCloud的组件概览
b. 应用架构
流程
  • 请求统一通过 API 网关(Zuul)来访问内部服务。
  • 网关接收到请求后,从注册中心(Eureka)获取可用服务。
  • 由 Ribbon 进行均衡负载后,分发到后端具体实例。
  • 微服务之间通过 Feign 进行通信处理业务。
  • Hystrix 负责处理服务超时熔断。
  • Turbine 监控服务间的调用和熔断相关指标。

本文仅用于学习交流,如有理解错误请指正

参考:


关注下面的标签,发现更多相似文章
评论