SpringCloud学习之路(一)- 走进SpringCloud

1 背景

2008年之后,国内互联网行业飞速发展,咱们对软件系统的需求已经再也不是过去”能用就行”这种很low的档次了,像抢红包、双十一这样的活动不断逼迫咱们去突破软件系统的性能上限,传统的IT企业”能用就行”的开发思想已经不能知足互联网高并发、大流量的性能要求。系统架构走向分布式已是服务器开发领域解决该问题惟一的出路,然而分布式系统因为天生的复杂度,并不像开发单体应用同样把框架一堆就能搞定,所以各大互联网公司都在投入技术力量研发本身的基础设施。这里面比较有名的如阿里的开源项目dubbo, Netflix开发的一系列服务框架。在这种“百花齐放”、重复造轮子的情况下,必然要出现一种统一的标准来简化分布式系统的开发,Spring Cloud应运而生。java

2 Spring Cloud是什么

img

SpringCloud架构git

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的开发者能够快速的启动服务或构建应用、同时可以快速和云平台资源进行对接。算法

3 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

Spring Cloud Netflix 这但是个大boss,地位仅次于老大,老大各项服务依赖与它,与各类Netflix OSS组件集成,组成微服务的核心,它的小弟主要有Eureka, Hystrix, Zuul, Archaius... 太多了数据库

3.1 Spring Cloud Eureka 服务发现

img

netflix-eureka编程

img

Spring Cloud Eureka服务发现后端

img

Eureka安全

服务中心,云端服务发现,一个基于 REST 的服务,用于定位服务,以实现云端中间层服务发现和故障转移。这个但是SpringCloud最牛鼻的小弟,服务中心,任何小弟须要其它小弟支持什么都须要从这里来拿,一样的你有什么独门武功的都赶忙过报道,方便之后其它小弟来调用;它的好处是你不须要直接找各类什么小弟支持,只须要到服务中心来领取,也不须要知道提供支持的其它小弟在哪里,仍是几个小弟来支持的,反正拿来用就行,服务中心来保证稳定性和质量。 Spring Cloud Eureka提供在分布式环境下的服务发现,服务注册的功能。 一个RESTful服务,用来定位运行在AWS地区(Region)中的中间层服务。由两个组件组成:Eureka服务器和Eureka客户端。Eureka服务器用做服务注册服务器。Eureka客户端是一个java客户端,用来简化与服务器的交互、做为轮询负载均衡器,并提供服务的故障切换支持。Netflix在其生产环境中使用的是另外的客户端,它提供基于流量、资源利用率以及出错状态的加权负载均衡。服务器

3.2 Spring Cloud Ribbon 客户端负载均衡

img

netflix-ribbonsession

img

Spring Cloud Ribbon

Ribbon,主要提供客户侧的软件负载均衡算法。 Ribbon客户端组件提供一系列完善的配置选项,好比链接超时、重试、重试算法等。Ribbon内置可插拔、可定制的负载均衡组件。下面是用到的一些负载均衡策略

  • 简单轮询负载均衡
  • 加权响应时间负载均衡
  • 区域感知轮询负载均衡
  • 随机负载均衡

Ribbon中还包括如下功能:

  • 易于与服务发现组件(好比Netflix的Eureka)集成
  • 使用Archaius完成运行时配置
  • 使用JMX暴露运维指标,使用Servo发布
  • 多种可插拔的序列化选择
  • 异步和批处理操做(即将推出)
  • 自动SLA框架(即将推出)
  • 系统管理/指标控制台(即将推出)

3.3 Spring Cloud Config

img

spring-cloud-config

俗称的配置中心,配置管理工具包,让你能够把配置放到远程服务器,集中化管理集群配置,目前支持本地存储、Git以及Subversion。就是之后你们武器、枪火什么的东西都集中放到一块儿,别随便本身带,方便之后统一管理、升级装备。

img

Spring Cloud Config配置中心

将配置信息中央化保存, 配置Spring Cloud Bus能够实现动态修改配置文件。这个仍是静态的,得配合Spring Cloud Bus实现动态的配置更新。

img

Spring Cloud Config

Spring Cloud Config就是咱们一般意义上的配置中心。Spring Cloud Config-把应用本来放在本地文件的配置抽取出来放在中心服务器,本质是配置信息从本地迁移到云端。从而可以提供更好的管理、发布能力。 Spring Cloud Config分服务端和客户端,服务端负责将git(svn)中存储的配置文件发布成REST接口,客户端能够从服务端REST接口获取配置。但客户端并不能主动感知到配置的变化,从而主动去获取新的配置,这须要每一个客户端经过POST方法触发各自的/refresh。

3.4 Spring cloud Hystrix 熔断器

img

netflix-hystrix

熔断器,容错管理工具,旨在经过熔断机制控制服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力。好比忽然某个小弟生病了,可是你还须要它的支持,而后调用以后它半天没有响应,你殊不知道,一直在等等这个响应;有可能别的小弟也正在调用你的武功绝技,那么当请求多以后,就会发生严重的阻塞影响老大的总体计划。这个时候Hystrix就派上用场了,当Hystrix发现某个小弟不在状态不稳定立马立刻让它下线,让其它小弟来顶上来,或者给你说不用等了这个小弟今天确定不行,该干吗赶忙干吗去别在这排队了。

img

Spring cloud Hystrix 熔断器

断路器(Cricuit Breaker)是一种可以在远程服务不可用时自动熔断(打开开关),并在远程服务恢复时自动恢复(闭合开关)的设施,Spring Cloud经过Netflix的Hystrix组件提供断路器、资源隔离与自我修复功能。

断路器能够防止一个应用程序屡次试图执行一个操做,即极可能失败,容许它继续而不等待故障恢复或者浪费 CPU 周期,而它肯定该故障是持久的。断路器模式也使应用程序可以检测故障是否已经解决。若是问题彷佛已经获得纠正,应用程序能够尝试调用操做。

img

Hystrix01

断路器增长了稳定性和灵活性,以一个系统,提供稳定性,而系统从故障中恢复,并尽可能减小此故障的对性能的影响。它能够帮助快速地拒绝对一个操做,即极可能失败,而不是等待操做超时(或者不返回)的请求,以保持系统的响应时间。若是断路器提升每次改变状态的时间的事件,该信息能够被用来监测由断路器保护系统的部件的健康情况,或以提醒管理员当断路器跳闸,以在打开状态。

img

Hystrix02

img

Hystrix流程图

3.5 Spring Cloud Zuul 服务网关,智能路由

img

netflix-zuul

Zuul 是在云平台上提供动态路由,监控,弹性,安全等边缘服务的框架。Zuul 至关因而设备和 Netflix 流应用的 Web 网站后端全部请求的前门。当其它门派来找大哥办事的时候必定要先通过zuul,看下有没有带刀子什么的给拦截回去,或者是须要找那个小弟的直接给带过去。

img

Spring Cloud Zuul 服务网关

img

Zuul

相似Nginx,反向代理的功能,不过netflix本身增长了一些配合其余组件的特性。

3.6 Spring Netflix Archaius

img

netflix-archaius

配置管理API,包含一系列配置管理API,提供动态类型化属性、线程安全配置操做、轮询框架、回调机制等功能。能够实现动态获取配置, 原理是每隔60s(默认,可配置)从配置源读取一次内容,这样修改了配置文件后不须要重启服务就可使修改后的内容生效,前提使用archaius的API来读取。

3.7 Spring Cloud Bus

img

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在配置中心使用的机制。

img

Spring Cloud Bus

根据此图咱们能够看出利用Spring Cloud Bus作配置更新的步骤:

  1. 提交代码触发post给客户端A发送bus/refresh
  2. 客户端A接收到请求从Server端更新配置而且发送给Spring Cloud Bus
  3. Spring Cloud bus接到消息并通知给其它客户端
  4. 其它客户端接收到通知,请求Server端获取最新配置
  5. 所有客户端均获取到最新的配置

3.8 Spring Cloud Security

img

spring-cloud-security

对Spring Security的封装,并能配合Netflix使用,安全工具包,为你的应用程序添加安全控制,主要是指OAuth2。 基于spring security的安全工具包,为你的应用程序添加安全控制。这个小弟很牛鼻专门负责整个帮派的安全问题,设置不一样的门派访问特定的资源,不能把秘籍葵花宝典泄漏了。

3.9 Spring Cloud Zookeeper

img

spring-cloud-zookeeper

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

3.10 Spring Cloud Stream

img

spring-cloud-stream

数据流;数据流操做开发包,封装了与Redis,Rabbit、Kafka等发送接收消息。 Spring Cloud Stream是建立消息驱动微服务应用的框架。Spring Cloud Stream是基于spring boot建立,用来创建单独的/工业级spring应用,使用spring integration提供与消息代理之间的链接。数据流操做开发包,封装了与Redis,Rabbit、Kafka等发送接收消息。 一个业务会牵扯到多个任务,任务之间是经过事件触发的,这就是Spring Cloud stream要干的事了。

3.11 Spring Cloud Sleuth

img

spring-cloud-sleuth

服务跟踪;日志收集工具包,封装了Dapper,Zipkin和HTrace操做。 日志收集工具包,封装了Dapper和log-based追踪以及Zipkin和HTrace操做,为SpringCloud应用实现了一种分布式追踪解决方案。

3.12 Spring Cloud Feign 使用HTTP请求远程服务

img

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无疑是最佳选择。

3.13 Spring Cloud for Cloud Foundry

img

pivotal-cloud-foundry

Cloud Foundry是VMware推出的业界第一个开源PaaS云平台,它支持多种框架、语言、运行时环境、云平台及应用服务,使开发人员可以在几秒钟内进行应用程序的部署和扩展,无需担忧任何基础架构的问题 其实就是与CloudFoundry进行集成的一套解决方案,抱了Cloud Foundry的大腿。

3.14 Spring Cloud Cluster

img

spring-cloud-cluster

Spring Cloud Cluster将取代Spring Integration。提供在分布式系统中的集群所须要的基础功能支持,如:选举、集群的状态一致性、全局锁、tokens等常见状态模式的抽象和实现。 若是把不一样的帮派组织成统一的总体,Spring Cloud Cluster已经帮你提供了不少方便组织成统一的工具。

3.15 Spring Cloud Consul

img

hashicorp-consul

Consul 是一个支持多数据中心分布式高可用的服务发现和配置共享的服务软件,由 HashiCorp 公司用 Go 语言开发, 基于 Mozilla Public License 2.0 的协议进行开源. Consul 支持健康检查,并容许 HTTP 和 DNS 协议调用 API 存储键值对. Spring Cloud Consul 封装了Consul操做,consul是一个服务发现与配置工具,与Docker容器能够无缝集成。

3.16 Spring Cloud Data Flow

img

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

3.17 Spring Cloud Task

img

spring-cloud-task

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

3.18 Spring Cloud Connectors

img

spring-cloud-connectors

Spring Cloud Connectors 简化了链接到服务的过程和从云平台获取操做的过程,有很强的扩展性,能够利用Spring Cloud Connectors来构建你本身的云平台。 便于云端应用程序在各类PaaS平台链接到后端,如:数据库和消息代理服务。

3.19 Spring Cloud Starters

img

spring-cloud-starters

Spring Boot式的启动项目,为Spring Cloud提供开箱即用的依赖管理。

3.20 Spring Cloud CLI

img

spring-cloud-cli

基于 Spring Boot CLI,可让你以命令行方式快速创建云组件。

3.21 Netflix Turbine

img

netflix-turbine

Turbine是聚合服务器发送事件流数据的一个工具,用来监控集群下hystrix的metrics状况。

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 这样的关系。

5 Spring Cloud的优点

微服务的框架那么多好比:dubbo、Kubernetes,为何就要使用Spring Cloud的呢?

  • 产出于Spring你们族,Spring在企业级开发框架中无人能敌,来头很大,能够保证后续的更新、完善。好比dubbo如今就差很少死了
  • 有Spring Boot 这个独立干将能够省不少事,大大小小的活spring boot都搞的挺不错。 做为一个微服务治理的你们伙,考虑的很全面,几乎服务治理的方方面面都考虑到了,方便开发开箱即用。
  • Spring Cloud 活跃度很高,教程很丰富,遇到问题很容易找到解决方案
  • 轻轻松松几行代码就完成了熔断、均衡负责、服务中心的各类平台功能
  • Spring Cloud 也有一个缺点,只能使用Java开发,不适合小型独立的项目。
相关文章
相关标签/搜索