详细剖析Spring Cloud 和Spring Cloud Alibaba的前世今生
我们知道spring cloud可以用来开发微服务,但是应该很少有人真正知道Spring Cloud是什么。
官方的解释是:spring cloud提供了一些可以让开发者快速构建分布式应用的工具,这些服务可以很好的工作在任何分布式环境下。
既然提供的是一些快速构建微服务应用的工具,那么我们需要了解微服务开发过程中需要解决哪些问题?
- 服务注册发现 
- 远程服务调用 
- 负载均衡 
- 断路器 
- 分布式消息 
- 配置中心 
- 链路监控 
所以,spring cloud提供了一些解决这类问题的工具,比如服务注册提供了Eureka/Consoul/zookeeper;远程调用基于RestTemplate针对http协议调用的封装;负载均衡采用Ribbon、断路器采用hystrix;分布式消息基于kafka、rabbitMQ;配置中心基于config;链路监控基于sleuth.
但是,从这些组件中,我们发现了一些问题,这些组件并不是spring提供的啊,比如eureka、ribbon、hystrix是netflix开源的。而kafka、zookeeper是一些独立的组件,和spring似乎没有关系。没错,这就是spring团队的强大之处,他们很少重复早轮子,而是他们利用别人造好的轮子来进行封装使得用户在使用的时候更加方便。
举个简单例子,比如最早spring只提供了IOC和AOP的核心功能,而像ORM框架、缓存、MVC框架,spring只是提供了一种兼容以及支持,所以当时大家说spring是万能胶,可以把各种各样的框架整合进来。
当然,spring也会对一些市面上做得不好的技术进行替代,比如struts2.,我记得当时公司使struts2经常出现各种漏洞,所以spring mvc才被创造出来并且很快代替了struts。成为现在的主流框架。
所以,对于spring cloud来说也是如此,spring cloud并不是一个框架,因为Spring Cloud的核心并没有实现服务注册、熔断、配置中心等功能,它提供了一个标准规范。而Spring Cloud Netflix才是spring Cloud规范的一种实现。
常见的服务组件
Ø 融合在每个微服务中、依赖其它组件并为其提供服务。
Ribbon,客户端负载均衡,特性有区域亲和、重试机制。
Hystrix,客户端容错保护,特性有服务降级、服务熔断、请求缓存、请求合并、依赖隔离。
Feign,声明式服务调用,本质上就是Ribbon+Hystrix
Stream,消息驱动,有Sink、Source、Processor三种通道,特性有订阅发布、消费组、消息分区。
Bus,消息总线,配合Config仓库修改的一种Stream实现,
Sleuth,分布式服务追踪,需要搞清楚TraceID和SpanID以及抽样,如何与ELK整合。
Ø 独自启动不需要依赖其它组件,单枪匹马都能干。
Eureka,服务注册中心,特性有失效剔除、服务保护。
Dashboard,Hystrix仪表盘,监控集群模式和单点模式,其中集群模式需要收集器Turbine配合。
Zuul,API服务网关,功能有路由分发和过滤。
Config,分布式配置中心,支持本地仓库、SVN、Git、Jar包内配置等模式
Spring Cloud生态的构建
Spring Cloud的生态是基于spring boot这个微框架来构建的,所以spring cloud可以说是基于spring boot来对其他框架进行整合,那么什么是spring boot或者为什么要基于spring boot来整合呢?
首先,spring boot并不是一个新的技术,它是基于spring框架下对于“约定由于配置(Convention Over Configuration)”理念下的产物,主要是帮助开发人员更容易更快速的创建独立运行和产品级别的基于spring框架的应用。为什么说springboot是微框架呢?如果大家玩过springboot,那应该很有体会,我们只需要非常少的配置就可以快速构建一个web项目。
而spring boot中并没有新的技术,如果大家对spring框架比较熟悉,那么在学习springboot的时候会更加容易。
围绕springboot构建的spring cloud生态下,目前有两类的比较或的实现,一个是基于netflix、另一个是基于alibaba。
Spring Cloud Alibaba的相关资料
前面一个阶段,我们讲完了Spring Cloud Alibaba生态中的Dubbo组件,当然,我们没有基于spring cloud project的形式来讲解,而是基于组件的形式形式来讲,原因是spring cloud本质上就是对各个组件的集成。
目前Spring Cloud Alibaba这个生态中,已经有相对成熟的体系
- Dubbo 用于实现高性能Java RPC 通信 
- Nacos 服务注册发现、配置管理、服务管理 
- Sentinel 流量控制、熔断降级、系统负载保护 
- RocketMQ 分布式消息系统,提供低延时的、高可靠的消息发布与订阅服务 
- Seata 高性能微服务分布式事务解决方案 
- Alibaba Cloud OSS 阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。 
- Alibaba Cloud SchedulerX 阿里中间件团队开发的一款分布式任务调度产品,支持周期性的任务与固定时间点触发任务。 
- Alibaba Cloud SMS 覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道。 
在2019年8月1号,spring-cloud-alibaba发布了第一个毕业版本(从孵化器仓库毕业),发布了V2.1.0.RELEASE版本, 目前最新的的版本是2.2.1.RELEASE,2.2.x 版本适用于 Spring Boot 2.2.x
另外,相比于Spring Cloud Netflix 生态,到2020年,archaus/hystrix/ribbon/zuul/turbine等starter都会进入维护模式,进入维护模式意味着spring cloud团队不会再向这些模块中添加新的功能,但是仍然会修复安全问题和一些block级别的bug。只是没有新的功能迭代了,spring cloud netflix仍然可以继续使用。
文章链接->spring-cloud-netflix-projects-entering-maintenance-mode
进入维护模式的最根本原因还是Netflix对于zuul、ribbon等项目维护投入比较少、所以spring cloud 会在greenwich中把这些项目都进入到维护模式。
当然,这些组件会有相应功能的其他组件代理,有些还在孵化中。有些已经毕业了,比如alibaba这套标准
微服务的整体架构

Spring Cloud Alibaba
提起微服务,不得不提 Spring Cloud 全家桶系列,SpringCloud 是若干个框架的集合,包括 spring-cloud-config、spring-cloud-bus 等近 20 个子项目,提供了服务治理、服务网关、智能路由、负载均衡、断路器、监控跟踪、分布式消息队列、配置管理等领域的解决方案。
Spring Cloud 通过 Spring Boot 风格的封装,屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、容易部署的分布式系统开发工具包。
Spring Cloud 一样,Spring Cloud Alibaba 也是一套微服务解决方案,包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。
依托 Spring Cloud Alibaba,您只需要添加一些注解和少量配置,就可以将 Spring Cloud 应用接入阿里微服务解决方案,通过阿里中间件来迅速搭建分布式应用系统。
Spring Cloud Alibaba中包含的组件
阿里开源组件
Nacos:一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
Sentinel:把流量作为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。
RocketMQ:开源的分布式消息系统,基于高可用分布式集群技术,提供低延时的、高可靠的消息发布与订阅服务。
Dubbo:这个就不用多说了,在国内应用非常广泛的一款高性能 Java RPC 框架。
Seata:阿里巴巴开源产品,一个易于使用的高性能微服务分布式事务解决方案。
Arthas:开源的Java动态追踪工具,基于字节码增强技术,功能非常强大。
阿里商业化组件
作为一家商业公司,阿里巴巴推出 Spring Cloud Alibaba,很大程度上市希望通过抢占开发者生态,来帮助推广自家的云产品。所以在开源社区,夹带了不少私货,这部分组件我在阿里工作时都曾经使用过,整体易用性和稳定性还是很高的。
Alibaba Cloud ACM:一款在分布式架构环境中对应用配置进行集中管理和推送的应用配置中心产品。
Alibaba Cloud OSS:阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的云存储服务。
Alibaba Cloud SchedulerX:阿里中间件团队开发的一款分布式任务调度产品,提供秒级、精准的定时(基于 Cron 表达式)任务调度服务。
Nacos服务注册中心
Nacos提供了统一配置管理、服务发现与注册。 其中服务注册和发现的功能,相当于dubbo里面使用到的zookeeper、 或者spring cloud里面应用到的consoul以及eureka。
服务发现和服务健康监测
Nacos提供了基于RPC的服务发现,服务提供者可以将自身的服务通过原生API或者openApi来实现服务的注册,服务消费者可以使用API或者Http来查找和发现服务
同时,Nacos提供了对服务的实时监控检查,当发现服务不可用时,可以实现对服务的动态下线从而阻止服务消费者向不健康的服务发送请求。
配置管理
传统的配置管理,是基于项目中的配置文件来实现,当出现配置文件变更时需要重新部署,而动态配置中心可以将配置进行统一的管理,是的配置变得更加灵活以及高效。
动态配置中心可以实现路由规则的动态配置、限流规则的动态配置、动态数据源、开关、动态UI等场景
国内比较有名的开源配置中心: Aollo / diamond / disconf
Nacos的整体架构
Nacos的整体架构还是比较清晰的,我们可以从下面这个官方提供的架构图进行简单分析。

云原生
云原生从字面意思上来看可以分成云和原生两个部分。
云是和本地相对的,传统的应用必须跑在本地服务器上,现在流行的应用都跑在云端,云包含了IaaS,、PaaS和SaaS。
原生就是土生土长的意思,我们在开始设计应用的时候就考虑到应用将来是运行云环境里面的,要充分利用云资源的优点,比如️云服务的弹性和分布式优势。

> 版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 `Mic带你学架构`!
> 如果本篇文章对您有帮助,还请帮忙点个关注和赞,您的坚持是我不断创作的动力。欢迎关注「跟着Mic学架构」公众号公众号获取更多技术干货!

详细剖析Spring Cloud 和Spring Cloud Alibaba的前世今生的更多相关文章
- 【Spring Cloud & Alibaba 实战 | 总结篇】Spring Cloud Gateway + Spring Security OAuth2 + JWT 实现微服务统一认证授权和鉴权
		一. 前言 hi,大家好~ 好久没更文了,期间主要致力于项目的功能升级和问题修复中,经过一年时间的打磨,[有来]终于迎来v2.0版本,相较于v1.x版本主要完善了OAuth2认证授权.鉴权的逻辑,结合 ... 
- Spring Boot,Spring Cloud,Spring Cloud Alibaba 版本选择说明以及整理归纳
		前言 本文的核心目的: 1.方便自己以后的查找,预览,参考 2.帮助那些不知道如何选择版本的朋友进行指引,而不是一味的跟风网上的版本,照抄. Spring Boot 版本 版本查询: https:// ... 
- Spring Cloud Alibaba与Spring Boot、Spring Cloud之间不得不说的版本关系
		这篇博文是临时增加出来的内容,主要是由于最近连载<Spring Cloud Alibaba基础教程>系列的时候,碰到读者咨询的大量问题中存在一个比较普遍的问题:版本的选择.其实这类问题,在 ... 
- 【Spring Boot】Spring Boot之使用Alibaba Cloud Toolkit(Idea插件)本地一键部署Spring Boot项目到远程服务器
		一.Alibaba Cloud Toolkit(Idea插件)的安装 1)Alibaba Cloud Toolkit 介绍 Cloud Toolkit 是本地 IDE 插件,帮助开发者更高效地开发.测 ... 
- Spring Cloud Alibaba 教程 | 前世今生
		Spring Cloud Alibaba是什么 先来看一下官方是怎么定义Spring Cloud Alibaba的: Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案.此 ... 
- 基于Spring Boot、Spring Cloud、Docker的微服务系统架构实践
		由于最近公司业务需要,需要搭建基于Spring Cloud的微服务系统.遍访各大搜索引擎,发现国内资料少之又少,也难怪,国内Dubbo正统治着天下.但是,一个技术总有它的瓶颈,Dubbo也有它捉襟见肘 ... 
- 【SFA官方翻译】Spring WebFlux和Spring Cloud进行响应式微服务开发
		源码,修正一些错误: https://github.com/bigben0123/sample-spring-cloud-webflux 原创 SpringForAll社区 2018-05-18 作者 ... 
- 基于Spring Boot和Spring Cloud实现微服务架构学习
		转载自:http://blog.csdn.net/enweitech/article/details/52582918 看了几周Spring相关框架的书籍和官方demo,是时候开始总结下这中间的学习感 ... 
- 基于Spring Boot和Spring Cloud实现微服务架构学习--转
		原文地址:http://blog.csdn.net/enweitech/article/details/52582918 看了几周spring相关框架的书籍和官方demo,是时候开始总结下这中间的学习 ... 
随机推荐
- Java基础系列(39)- 二维数组
			多维数组 多维数组可以看成是数组的数组,比如二维数组就是一个特殊的一维数组,其每一个元素都是一个一维数组. 二维数组 int a[][]=new int[2][5]; 解析:以上二维数组a可以看成一个 ... 
- vue中data为什么不写成data:{}这样而是写成data(){return {}}类型。
			data:{}:这样会直接挂载在vue实例中,变成全局变量,容易造成污染,再次今日该组件页面,会保留上次的变量值,不会被初始化 data(){return {}} :return包裹后数据中变量只在当 ... 
- 牛客练习赛79E-小G的数学难题【dp,单调队列】
			正题 题目链接:https://ac.nowcoder.com/acm/contest/11169/E 题目大意 给出\(n\)个三元组\((a_i,b_i,c_i)\). 要求选出一个集合\(S\) ... 
- python numpy loadtxt
			用numpy加载csv文件数据 发现python numpy loadtxt 方法和数据的结构有很大关系当我的数据有第一行文字是这样子的时候 我程序的运行结果永远都报错,编码格式也处理了统一utf-8 ... 
- Winform 窗体自适应
			前言 在使用 Winform 开发过程中,经常发些因为显示器分辨率.窗体大小改变,控件却不能自适应变化,几经查找资料,和大佬的代码.经过细小修改,终于可以让窗体在外界影响下,窗体内背景图片.控件都会自 ... 
- Winform 空闲时间(鼠标键盘无操作)
			前言 Winform 在特定情况下,需要判断软件空闲时间(鼠标键盘无操作),然后在做一下一些操作. 实现 做了一个简单的例子,新建一个窗体,然后拖两个控件(Timer控件和label控件) using ... 
- 3-等待线程终止的join方法
			等待线程终止的join方法 在项目实践中经常会遇到一个场景,就是需要等待某几件事完成之后才能继续往下执行,比如线程加载资源等等. package com.heiye.learn1; public cl ... 
- amber模拟kcl水溶液
			最近刚开始学习amber软件,看网上的教程勉强知道怎么操作这个amber了.就暂时跑了个分子动力学,其他的啥也没处理.先把我的操作过程记录下来吧,免得日后忘记. 一.构建kcl.pdb结构 利用Gau ... 
- TWAIN-v2.4-说明文档翻译(1)介绍
			介绍 Introduction 一致性需求(Need for Consistency) 对于扫描仪,数字摄像仪,以及其他图像获取设备,用户渴望发现将图像合并到他们的文档以及其他工作的价值.然而,支持展 ... 
- linux主机互信操作
			一.主机互信原理两个主机之间ssh登录需要提示输入对方的密码,当频繁需要登录操作时,可以通过linux公钥和秘钥,建立双机信任关系.把你源主机的公钥文件内容追加到目的主机对应用户下的authorize ... 
