一、千篇一律的介绍
官网:https://spring.io/projects/spring-cloud
原话: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开发人员可以快速建立实现这些模式的服务和应用程序。它们在任何分布式环境中都能很好地工作,包括开发者自己的笔记本电脑、数据中心、云计算和管理平台。
虽然翻译的不是很贴切但我们以然可以从中得知,SpringCloud不是一个技术,而是一个技术的集合体,是一系列集合框架的组合。
在这里我不得不提一下SpringBoot,因为SpringCloud是基于SpringBoot实现的。SprinBoot 秉持约定优于配置的思想,因此可以利用这些组件基本的默认行为来快速入 门,并在需要的时候可以配置或扩展,以创建自定义解决方案。
SpringCloud利用SpringBoot的开发便利性,巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以基于SpringBoot 组件进行开发,做到一键启动和部署SpringCloud并没有重复制造轮子,它只是将目前比较成熟、经得起实际考验、优秀的开源服务框架组合起来,通过SpringBoot进行封装,屏蔽掉复杂的配置和实现原理,最终给我们留出了一套简单易懂、易署和易维护的分布式系统开发工具包。
二、唠一下版本
SpringCloud 不同于其他独立项目,它是拥有众多子项目的项目集合,其所有版本由版本名和版本号组成。
而且它的版本名字是以伦敦地铁站命名并且遵循字母顺序的;版本号通常有M和SR两种,M表示里程碑版本,SR表示稳定版。
例如:Finchley.M9;Finchley.SR3,Finchley表示版本名,M9表示第九个里程碑版,SR3表示第三个稳定版。
以Finchley RELEASE版本为例,其对应的组件和版本如下。
三、再说一下组成
SpringCloud包含的组件众多,各个组件都有各自不同的特色和优点其技术架构如图:
组件介绍:
服务注册与发现组件:
Eurek、Zookeeper和Consul等,其中Eureka是一个REST风格的服务注册与发现的基础服务组件。
服务调用组件:
Hystrix、Ribbon和OpenFeign;其中Hystrix能够使系统在出现依赖服务失效的情况下,通过隔离系统依赖服务的方式,防止服务级联失败,同时提供失败回滚机制,使系统能够更快速地从异常中恢复;Ribbon用于提供客户端的软件负载均衡算法,还提供了一系列完善的配置项如连接超时、重试等;OpenFigen是一个声明式RESTful网络请求客户端,它使编写Web服务客户端变得更加方便快捷。
路由和过滤组件:
包括 Zuul、SpringCloud Gateway;SpringCloud Gateway 提供了一个构建在Spring生态之上的API网关,其旨在提供一种简单而有效的途径来发送 API, 为他们提供横切关注点 ,如: 安全性、监控指标和弹性。
配置中心组件:
SpringCloud Config实现了配置集中管理、动态刷新等配置中心的功能 。通过Git或者简单文件来存储,支持加解密。
消息组件:
SpringCloud Stream、SpringCloud Bus。SpringCloud Stream对于分布式消息的各种需求进行了抽象,包括发布订阅、分组消费和消息分区等功能 ,实现了微服务之间的异步通信。SpringCloud Bus主要提供了服务间的事件通信(如刷新配置)。
安全控制组件:
SpringCloud Security基于OAuth2开放网络的安全标,提供了微服务环境下的单点登录、资源授权和令牌管理等功能。
链路监控组件:
SpringCloud Sleuth 提供了全自动、可配置的数据埋点,以收集微服务调用链路上的性能数据,可以结合 Zipkin 进行数据存储、统计和展示。
除了这些组件之外, SpringCloud还提供了以命令行工具SpringCloud Cli和集群工具SpringCloud Cluster。SpringCloud Cli提供了以命令行和脚本的方式来管理微服务及SpringCloud组件的方式, SpringCloud Cluster提供了集群选主、分布式锁和一次性令牌等分布式集群需要的技术组件。
四、最后说说特性
由于SpringCloud的组件大部分都是由SpringBoot提供的,所以SpringCloud在此基础上添加了分布式系统相关的特性。
SpringCloud的特性依赖于SpringCloud Context和SpringCloud Commons两个公共库:
SpringCloud Context为SpringCloud应用程序上下文(ApplicationContext )提供了大量的实用工具和特性服务。
SpringCloud Common 针对不同的SpringCloud的实现(如SpringCloud Netflix Eureka和SpringCloud Consul 两种不同的服务注册与发现实现)提供上层抽象和公共类。
4.1 SpringCloud Context应用上下文
SpringCloud区别于SpringBoot最大的一个配置就是添加了Bootstrap上下文配置。
它引入了一个更高级别的上下文类BootStrapContext,它是ApplicationContext的父级上下文。
官网对它介绍:
A Spring Cloud application operates by creating a “bootstrap” context, which is a parent context for the main application. It is responsible for loading configuration properties from the external sources and for decrypting properties in the local external configuration files. The two contexts share an Environment, which is the source of external properties for any Spring application. By default, bootstrap properties (not bootstrap.properties but properties that are loaded during the bootstrap phase) are added with high precedence, so they cannot be overridden by local configuration.
翻译下意思:
Spring云应用程序bootstrap context进行操作(bootstrap context是主应用程序的父上下文)。bootstrap context负责从外部源加载配置属性,并解密本地外部配置文件中的属性。这两个上下文共享一个环境,该环境是任何Spring应用程序外部属性的来源。默认情况下,bootstrap属性(不是bootstrap.properties而是引导阶段加载的属性)具有较高的优先级,因此不能被本地配置覆盖。
注意一下:
在bootstrap.yml(bootstrap.properties)与application.yml(application.properties)配置文件中它的加载顺序是:
bootstrap.yml > application.yml > application-dev(prod).yml
所以子级上下文(application)的属性可以覆盖父级(bootstrap)中的具有相同名称和属性源名称的属性。
4.2 SpringCloud Commons公共抽象
SpringCloud 将服务发现、负载均衡和断路器等通用模型封装在一个公共抽像中,可以被所有的SpringCloud客户端使用,不依赖于具体的实现(例如服务发现就有Eureka和Consul等不同的实现),这些公共抽象位于SpringCloud Commons项目中。
几个基本抽象有:
- 服务发现:DiscoveryClient,从注册中心发现微服务。
- 服务注册:ServiceRegistry,注册微服务到注册中心。
- 负载均衡:LoadBalancerClient,客户端调用负载均衡。其中,重试策略从spring-cloud-commons-2.2.6加入了负载均衡的抽象中。
- 断路器:CircuitBreaker,负责什么情况下将服务断路并降级
- 调用 http 客户端:内部 RPC 调用都是 http 调用
- 这个公共组件中涉及的知识是非常多的,这里主要就是提一下,以后有时间我们在深入进去。
好了,今天的内容到这里就结束了,关注我,我们下期见