一、Spring Cloud简介

       尽管Spring Cloud带有“Cloud”的字样,但它并不是云计算解决方案,而是在Spring Boot基础上构建的,用于快速构建分布式系统的通用模式的工具集

       使用Spring Cloud开发的应用程序非常适合在Docker或者PaaS(例如Cloud Foundry)上部署,所以又叫做云原生应用(Cloud Native Application)。云原生(Cloud Native)可简单理解为面向云环境的软件架构。

二、核心功能

  • Distributed/versioned configuration 分布式/版本化的配置管理
  • Service registration and discovery 服务注册与服务发现
  • Routing 路由
  • Service-to-service calls 端到端的调用
  • Load balancing 负载均衡
  • Circuit Breakers 断路器
  • Global locks 全局锁
  • Leadership election and cluster state 选举与集群状态管理
  • Distributed messaging 分布式消息

三、核心组件

  • Spring Cloud Config

       Spring Cloud Config为分布式系统中的外部配置提供服务器和客户端支持。方便部署与运维。分客户端、服务端。
       服务端也称分布式配置中心,是一个独立的微服务应用,用来连接配置服务器并为客户端提供获取配置信息,加密/解密信息等访问接口。
       客户端则是通过指定配置中心来管理应用资源,以及与业务相关的配置内容,并在启动的时候从配置中心获取和加载配置信息。默认采用 git,并且可以通过 git 客户端工具来方便管理和访问配置内容。

优点:

  1. 集中管理配置文件
  2. 不同环境不同配置,动态化的配置更新
  3. 运行期间,不需要去服务器修改配置文件,服务会想配置中心拉取自己的信息
  4. 配置信息改变时,不需要重启即可更新配置信息到服务
  5. 配置信息以 rest 接口暴露

 

  • Spring Cloud Netflix

       Spring Cloud Netflix框架刚好就满足了上面的核心功能,而且最重要的是,使用起来非常的简单。Spring Cloud Netflix包含的组件及其主要功能大致如下:

       Eureka,服务注册和发现,它提供了一个服务注册中心、服务发现的客户端,还有一个方便的查看所有注册的服务的界面。 所有的服务使用Eureka的服务发现客户端来将自己注册到Eureka的服务器上。

       Zuul,网关,所有的客户端请求通过这个网关访问后台的服务。他可以使用一定的路由配置来判断某一个URL由哪个服务来处理。并从Eureka获取注册的服务来转发请求。

       Ribbon,即负载均衡,Zuul网关将一个请求发送给某一个服务的应用的时候,如果一个服务启动了多个实例,就会通过Ribbon来通过一定的负载均衡策略来发送给某一个服务实例。

       Feign,服务客户端,服务之间如果需要相互访问,可以使用RestTemplate,也可以使用Feign客户端访问。它默认会使用Ribbon来实现负载均衡。

       Hystrix,监控和熔断器。我们只需要在服务接口上添加Hystrix标签,就可以实现对这个接口的监控和断路器功能。

       Hystrix Dashboard,监控面板,他提供了一个界面,可以监控各个服务上的服务调用所消耗的时间等。

       Turbine,监控聚合,使用Hystrix监控,我们需要打开每一个服务实例的监控信息来查看。而Turbine可以帮助我们把所有的服务实例的监控信息聚合到一个地方统一查看。这样就不需要挨个打开一个个的页面一个个查看。

 

  • Spring Cloud Bus

       Spring Cloud Bus将分布式系统的节点与轻量级消息代理链接。这可以用于广播状态更改(例如配置更改)或其他管理指令。一个关键的想法是,Bus就像一个扩展的Spring Boot应用程序的分布式执行器,但也可以用作应用程序之间的通信渠道。当前唯一的实现是使用AMQP代理作为传输,但是相同的基本功能集(还有一些取决于传输)在其他传输的路线图上。

 

  • Spring Cloud Cloudfoundry

       Spring Cloud for Cloudfoundry可以轻松地在Cloud Foundry(平台即服务)中运行Spring Cloud应用程序。 Cloud Foundry具有“服务”的概念,即“绑定”到应用程序的中间件,实质上为其提供包含凭据的环境变量(例如,用于服务的位置和用户名)。

特性

        spring-cloud-cloudfoundry-web项目为Cloud Foundry中的一些增强的Web应用功能提供基本支持:自动绑定到单点登录服务,并可选择为发现启用粘性路由。
        spring-cloud-cloudfoundry-discovery项目提供Spring Cloud Commons DiscoveryClient的实现,因此您可以@EnableDiscoveryClient并提供您的凭据spring.cloud.cloudfoundry.discovery。[email,password]然后您可以直接使用DiscoveryClient或通过一个LoadBalancerClient(如果你没有连接到Pivotal Web Services,也是* .url)。

 

  • Spring Cloud Open Service Broker

       Spring Cloud Open Service Broker是一个用于构建实现Open Service Broker API的Spring Boot应用程序的框架。
       Open Service Broker API项目允许开发人员为云本地平台(如Cloud Foundry,Kubernetes和OpenShift)中运行的应用程序提供服务。 Spring Cloud Open Service Broker提供了一个基于Spring Boot的框架,使您能够在支持Open Service Broker API的平台上为您自己的托管服务快速创建服务代理。

 

  • Spring Cloud Cluster

       提供Leadership选举,如:Zookeeper, Redis, Hazelcast, Consul等常见状态模式的抽象和实现。

       此项目现在已被Spring Integration中的代码取代。 这里的所有接口都有主Spring库中的对应部分,并且实现大部分是并行的(etcd是一个例外,因为第三方库中缺乏对v3的支持)。 1.0.1版本弃用了所有有利于Spring Integration的东西。

注: 对于Hazelcast,支持是在扩展项目中。
       Spring Cloud Cluster提供了一组用于在分布式系统中构建“集群”功能的原语。 例如领导选举,集群状态的一致存储,全局锁和一次性令牌。

  • Spring Cloud Consul

        Spring Cloud Consul 项目是针对 Consul 的服务治理实现。Consul 是一个分布式高可用的系统,它包含多个组件,但是作为一个整体,在微服务架构中为我们的基础设施提供服务发现和服务配置的工具。

Eureka 和 Consul 的对比:

       Eureka 是一个服务发现工具。该体系结构主要是客户端/服务器,每个数据中心有一组 Eureka 服务器,通常每个可用区域一个。通常 Eureka 的客户使用嵌入式 SDK 来注册和发现服务。对于非本地集成的客户,官方提供的 Eureka 一些 REST 操作 API,其它语言可以使用这些 API 来实现对 Eureka Server 的操作从而实现一个非 jvm 语言的 Eureka Client。

       Eureka 提供了一个弱一致的服务视图,尽可能的提供服务可用性。当客户端向服务器注册时,该服务器将尝试复制到其它服务器,但不提供保证复制完成。服务注册的生存时间(TTL)较短,要求客户端对服务器心跳检测。不健康的服务或节点停止心跳,导致它们超时并从注册表中删除。服务发现可以路由到注册的任何服务,由于心跳检测机制有时间间隔,可能会导致部分服务不可用。这个简化的模型允许简单的群集管理和高可扩展性。

       Eureka 提供了一些列特性,包括更丰富的健康检查,键值对存储以及多数据中心。Consul 需要每个数据中心都有一套服务,以及每个客户端的 agent,类似于使用像 Ribbon 这样的服务。Consul agent 允许大多数应用程序成为 Consul 不知情者,通过配置文件执行服务注册并通过 DNS 或负载平衡器 sidecars 发现。

       Consul 提供强大的一致性保证,因为服务器使用 Raft 协议复制状态 。Consul 支持丰富的健康检查,包括 TCP,HTTP,Nagios / Sensu 兼容脚本或基于 Eureka 的 TTL。客户端节点参与基于 Gossip 协议的健康检查,该检查分发健康检查工作,而不像集中式心跳检测那样成为可扩展性挑战。发现请求被路由到选举出来的 leader,这使他们默认情况下强一致性。允许客户端过时读取取使任何服务器处理他们的请求,从而实现像 Eureka 这样的线性可伸缩性。

       Consul 强烈的一致性意味着它可以作为领导选举和集群协调的锁定服务。Eureka 不提供类似的保证,并且通常需要为需要执行协调或具有更强一致性需求的服务运行 ZooKeeper。

       Consul 提供了支持面向服务的体系结构所需的一系列功能。这包括服务发现,还包括丰富的运行状况检查,锁定,密钥/值,多数据中心联合,事件系统和 ACL。Consul 和 consul-template 和 envconsul 等工具生态系统都试图尽量减少集成所需的应用程序更改,以避免需要通过 SDK 进行本地集成。Eureka 是一个更大的 Netflix OSS 套件的一部分,该套件预计应用程序相对均匀且紧密集成。因此 Eureka 只解决了一小部分问题,可以和 ZooKeeper 等其它工具可以一起使用。

Consul 强一致性(C)带来的是:

       服务注册相比 Eureka 会稍慢一些。因为 Consul 的 raft 协议要求必须过半数的节点都写入成功才认为注册成功 Leader 挂掉时,重新选举期间整个 Consul 不可用。保证了强一致性但牺牲了可用性。

Eureka 保证高可用(A)和最终一致性:

       服务注册相对要快,因为不需要等注册信息 replicate 到其它节点,也不保证注册信息是否 replicate 成功 当数据出现不一致时,虽然 A, B 上的注册信息不完全相同,但每个 Eureka 节点依然能够正常对外提供服务,这会出现查询服务信息时如果请求 A 查不到,但请求 B 就能查到。如此保证了可用性但牺牲了一致性。

       其它方面,eureka 就是个 servlet 程序,跑在 servlet 容器中; Consul 则是 go 编写而成。

  • Spring Cloud Security
Spring Cloud Security 为构建安全的SpringBoot应用提供了一系列解决方案,结合Oauth2可以实现单点登录、令牌中继、令牌交换等功能,本文将对其结合Oauth2入门使用进行详细介绍。

关于OAuth2.0在维基百科中描述如下:

       开放授权(OAuth)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用。

       OAuth允许用户提供一个令牌,而不是用户名和密码来访问他们存放在特定服务提供者的数据。每一个令牌授权一个特定的网站(例如,视频编辑网站)在特定的时段(例如,接下来的2小时内)内访问特定的资源(例如仅仅是某一相册中的视频)。这样,OAuth让用户可以授权第三方网站访问他们存储在另外服务提供者的某些特定信息,而非所有内容。

      OAuth 2.0是OAuth协议的下一版本,但不向下兼容OAuth 1.0。OAuth 2.0关注客户端开发者的简易性,同时为Web应用,桌面应用和手机,和起居室设备提供专门的认证流程。

  1. Resource Owner: 资源所有者,我们可以直接理解为:用户(User);
  2. User Agent: 用户代理,对于Web应用可以直接理解为浏览器;
  3. Authorization server: 认证服务器,即提供用户认证和授权的服务器,可以是独立服务器;
  4. Resource server: 资源服务器,这里我们可以理解为需要保护的微服务。

授权模式:

  1. 授权码模式(authorization code): 该种模式是功能最完整、流程最严密的授权模式;
  2. 简化模式(implicit): 该模式不需要通过第三方应用程序的服务器,跳过了"授权码"这个步骤,直接在浏览器中向认证服务器申请令牌,因此称为简化模式;
  3. 密码模式(password): 用户向客户端提供自己的用户名和密码,客户端通过这些信息直接向认证服务器获取授权;
  4. 客户端模式(client credentials): 指客户端以自己的名义,而不是以用户的名义向认证服务器获取认证,这种方式下认证服务器会将客户端作为一个用户来对待。

 

  • Spring Cloud Sleuth

        Spring Cloud Sleuth[sluːθ]是Spring Cloud提供的分布式系统服务链追踪组件,它大量借用了Google的Dapper,Twitter的Zipkin。

        Spring Cloud Sleuth是一个在应用中实现日志跟踪的强有力的工具。使用Sleuth库可以应用于计划任务 、多线程服务或复杂的Web请求,尤其是在一个由多个服务组成的系统中。当我们在这些应用中来诊断问题时,即使有日志记录也很难判断出一个请求需要将哪些操作关联在一起。
  如果想要诊断复杂操作,通常的解决方案是在请求中传递唯一的ID到每个方法来识别日志。 而Sleuth可以与日志框架Logback、SLF4J轻松地集成,通过添加独特的标识符来使用日志跟踪和诊断问题。
  微服务跟踪(sleuth)其实是一个工具,它在整个分布式系统中能跟踪一个用户请求的过程(包括数据采集,数据传输,数据存储,数据分析,数据可视化),捕获这些跟踪数据,就能构建微服务的整个调用链的视图,这是调试和监控微服务的关键工具。

springcloud引入redsion springcloud in action_spring

  • Spring Cloud Data Flow

       Spring Cloud Data Flow是用于构建数据集成和实时数据处理管道的工具包。

       管道由Spring Boot应用程序组成,使用Spring Cloud Stream或Spring Cloud Task微服务框架构建。 这使得Spring Cloud Data Flow适用于各种数据处理用例,从导入/导出到事件流和预测分析。

 

  • Spring Cloud Stream

       Spring Cloud Stream 是消息中间件组件,它集成了 kafka 和 rabbitmq 。

       Spring Cloud Stream 中的几个重要概念:

       Destination Binders:目标绑定器,目标指的是 kafka 还是 RabbitMQ,绑定器就是封装了目标中间件的包。如果操作的是 kafka 就使用 kafka binder ,如果操作的是 RabbitMQ 就使用 rabbitmq binder。

       Destination Bindings:外部消息传递系统和应用程序之间的桥梁,提供消息的“生产者”和“消费者”(由目标绑定器创建)

       Message:一种规范化的数据结构,生产者和消费者基于这个数据结构通过外部消息系统与目标绑定器和其他应用程序通信。

springcloud引入redsion springcloud in action_kafka_02

 

  • Spring Cloud Stream App Starters

       Spring Cloud Stream Application Starters是基于Spring BootSpring Integration应用程序,可提供与外部系统的集成。 Spring Cloud Stream应用程序可与Spring Cloud Data Flow一起使用,以创建,部署和编排消息驱动的微服务应用程序。

       Spring Cloud Stream Application Starters是独立的可执行应用程序,可通过Apache Kafka和RabbitMQ等消息传递中间件进行通信。 这些应用程序可以在各种运行时平台上独立运行,包括:Cloud Foundry,Apache Yarn,Apache Mesos,Kubernetes,Docker,甚至可以在您的笔记本电脑上运行。

特性

  1. 独立运行作为Spring Boot应用程序
  2. 将微服务组合为Spring Cloud Data Flow中的流管道
  3. 将微服务应用程序用作maven或docker工件
  4. 通过命令行,环境变量或YAML文件覆盖配置参数
  5. 提供基础架构以单独测试应用程序
  6. 从此版本的Spring Initializr下载为初学者

 

  • Spring Cloud Task

       Spring Cloud Task的目标是为Spring Boot应用程序提供创建短运行期微服务的功能。在Spring Cloud Task中,我们可以灵活地动态运行任何任务,按需分配资源并在任务完成后检索结果。Tasks是Spring Cloud Data Flow中的一个基础项目,允许用户将几乎任何Spring Boot应用程序作为一个短期任务执行。
 

  • Spring Cloud Task App Starters

       Spring Cloud Task Application Starters是Spring Boot应用程序,可能是任何进程,包括不能永久运行的Spring Batch作业,并且它们在某些时候结束/停止。 Spring Cloud Task Applications可与Spring Cloud Data Flow一起使用,以创建,部署和编排短期数据微服务。

        Spring Cloud Task Application Starters是独立的可执行应用程序,可用于按需用例,例如数据库迁移,机器学习和计划操作。 这些应用程序可以在各种运行时平台上独立运行,包括:Cloud Foundry,Apache Yarn,Apache Mesos,Kubernetes,Docker,甚至可以在您的笔记本电脑上运行。

特性

  1.      独立运行作为Spring Boot应用程序
  2.      编排为短暂的数据微服务
  3.      将数据微服务应用程序用作maven或docker工件
  4.      通过命令行,环境变量或YAML文件覆盖配置参数
  5.      提供基础架构以单独测试应用程序
  6.      从此版本的Spring Initializr下载为初学者
  • Spring Cloud Zookeeper

        通过Spring Cloud Zookeeper为应用程序提供一种Spring Boot集成,将Zookeeper通过自动配置和绑定 的方式集成到Spring环境中。

        Spring Cloud Eureka实现的服务治理机制强调了CAP原理中的AP,即可用性与可靠性,而Zookeeper这类强调CP(一致性、可靠性)。Eureka为了实现更高的服务可用性,牺牲了一定的一致性,在极端情况下它宁愿接受故障实例也不要丢掉“健康”实例,比如,当服务注册中心的网络发生故障断开时,由于所有的服务实例无法维持续约心跳,在强调CP的服务治理中将会把所有服务实例都剔除掉,而Eureka则会触发保护机制,保留此时的所有节点,以实现服务间依然可以进行互相调用的场景。

 

  • Spring Cloud Connectors

       Spring Cloud Connectors简化了云平台(如Cloud Foundry和Heroku)中连接服务和获取操作环境感知的过程,尤其适用于Spring应用程序。 它是为可扩展性而设计的:您可以使用提供的云连接器之一或为您的云平台编写一个,并且您可以使用内置支持常用服务(关系数据库,MongoDB,Redis,RabbitMQ)或扩展Spring 云连接器可与您自己的服务配合使用。

  • Spring Cloud Starters

       Spring Boot风格的starter项目可以简化Spring Cloud用户的依赖管理。(作为项目中止,并在Angel.SR2.)

  • Spring Cloud CLI

       Spring Boot Cloud CLI(或简称Cloud CLI)。该工具为Spring Boot CLI提供了一组命令行增强功能,有助于进一步抽象和简化Spring Cloud部署。

       CLI于2016年底推出,允许使用命令行、.yml配置文件和Groovy脚本快速自动配置和部署标准Spring Cloud服务。

 

  • Spring Cloud Contract

       Spring Cloud Contract 为通过CDC(Customer Driven Contracts)开发基于JVM的应用提供了支持。它为TDD(测试驱动开发)提供了一种新的测试方式 - 基于接口。

 

  • Spring Cloud Gateway

       Spring Cloud Gateway 是 Spring Cloud 的一个全新项目,该项目是基于 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等技术开发的网关,它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式。

       Spring Cloud Gateway 作为 Spring Cloud 生态系统中的网关,目标是替代 Netflix Zuul,其不仅提供统一的路由方式,并且基于 Filter 链的方式提供了网关基本的功能,例如:安全,监控/指标,和限流。

特征:

  1. 基于 Spring Framework 5,Project Reactor 和 Spring Boot 2.0
  2. 动态路由
  3. Predicates 和 Filters 作用于特定路由
  4. 集成 Hystrix 断路器
  5. 集成 Spring Cloud DiscoveryClient
  6. 易于编写的 Predicates 和 Filters
  7. 限流
  8. 路径重写

与Zuul的区别:

  1. Zuul是Netflix开源的一个项目,Spring只是将Zuul集成在了Spring Cloud中。而Spring Cloud Gateway是Spring Cloud的一个子项目。
  2. 网上很多地方都说Zuul是阻塞的,Gateway是非阻塞的,这么说是不严谨的,准确的讲Zuul1.x是阻塞的,而在2.x的版本中,Zuul也是基于Netty,也是非阻塞的,如果一定要说性能,其实这个真没多大差距。
  • Spring Cloud OpenFeign
OpenFeign:是一个声明式的WebService客户端,内部封装了restTemplate,用于实现微服务系统之间的远程调用。
  • Spring Cloud Pipelines

       该项目已弃用。它被迁移到:Cloud Pipelines。你可以在这里读更多关于它的内容。
       Spring,Spring Boot和Spring Cloud是允许开发人员加快创建新业务功能的工具。然而,众所周知,该功能只有在生产中才有价值。这就是为什么公司花费大量时间和资源来构建自己的部署管道。

该项目试图解决以下问题:

  1.     创建公共部署管道
  2.     传播良好的测试和部署实践
  3.     加快将功能部署到生产所需的时间
  • Spring Cloud Function

Spring Cloud Function是一个具有以下高级目标的项目:

  1.      通过功能促进业务逻辑的实现。
  2.      将业务逻辑的开发生命周期与任何特定的运行时目标分离,以便相同的代码可以作为Web端点,流处理器或任务运行。
  3.      支持无服务器提供商之间的统一编程模型,以及独立运行(本地或PaaS)的能力。
  4.      在无服务器提供商上启用Spring Boot功能(自动配置,依赖注入,指标)。

它抽象出所有传输细节和基础架构,允许开发人员保留所有熟悉的工具和流程,并专注于业务逻辑。

特性:

Spring Cloud功能特性:

  1.      函数-Function,消费者-Consumer和供应商-Supplier类型的@Beans的包装器,使用RabbitMQ,Kafka等将它们作为HTTP端点和/或消息流监听器/发布者公开给外部世界。
  2.      将作为Java函数体的字符串编译为字节码,然后将它们转换为可以如上所述进行包装的@Beans。
  3.      使用隔离的类加载器部署包含此类应用程序上下文的JAR文件,以便您可以将它们打包在一个JVM中。
  4.      AWS Lambda,Microsoft Azure,Apache OpenWhisk以及可能的其他“无服务器”服务提供商的适配器。