网上介绍Spring Cloud的文章已经是汗牛充栋了,从入门到精通,各种教程应有尽有。所以这个系列大概率也不会写出什么新的东西,只是作为我在深入学习微服务以及Spring Cloud的过程中的一些理解和感悟吧。
Spring Cloud到底是一个什么东西了?估计很多人的印象都是Spring Cloud就是应用于微服务场景下的一个的应用框架(framework),类似于Spring。这个印象不能算错,如果只是简单应用的话,把它当成一个框架也未尝不可,照着文档加上对应的配置和注解,它就能很好的工作了,和Spring Boot的那些starter也没什么不同嘛。但如果要深入理解,我们还需要更进一步。
按照官网上对它的定义,Spring Cloud包括了一系列构建一个良好的分布式系统所应该遵循的一些最佳实践和模式,这些模式包括统一配置管理,服务发现,熔断 / 限流,智能路由等等。所以它并不是某一个具体的框架,只是一些规范或模式集合。同时,Spring Cloud也提供了用于实现上述模式的各种开箱即用的工具,便于用户直接进行集成,这些工具才更加类似于我们通常意义上的应用框架。Spring Cloud就像一个大的工具箱,定义了每个工具的大小,形状和位置,同时还贴心的预置了一套已经打磨好的工具在里面,适用于大部分的工作场景。但是如果用户觉得其中哪个工具不好用,也完全可以根据这个工具的特征,自己再搞一个新的工具来替换。
那么Spring Cloud提供了哪些工具呢?我们打开Spring Cloud的官网可以看到一个长长的列表,多到一页都还不能显示完:
我一开始看到这的时候是有些崩溃的,这么多东西光看文档就要看到天荒地老啊。好在大致浏览一遍之后,我发现这么多工具里面,很多的作用都是类似的,只是提供了在不同环境下的不同选择而已。比如一个工具箱里面的螺丝刀肯定不止一种吧,不同尺寸的螺丝得用到不同的螺丝刀。但螺丝刀的用法我们只需要学一次就行了,尺寸大小什么的并不会改变螺丝刀的作用原理。
Spring Cloud提供的这些工具里面大致可以分成三类:
Spring和云服务提供商合作的产物:既然叫Spring Cloud,那天然就和云服务脱不了干系。Spring Cloud算是现在构建微服务应用的主流标准,加上Spring社区在Java领域的影响力,这些都吸引了不少云服务提供商抛出合作的橄榄枝,Spring也乐见于此,开源组织也是要恰饭的。这些类型的项目很容易辨认,命名基本都是Spring Cloud XXXX,XXXX是某个提供商或者平台名称,比如:Spring Cloud Azure,Spring Cloud GCP(Google Cloud Platform),Spring Cloud Alibaba等等。这类的项目就是一个大杂烩,把云服务商提供的各类服务(存储,缓存,消息等等)统统都打包组合到一起,提供符合Spring Cloud规范的开箱即用的接口。所以,这一类的项目如果你的项目碰巧需要运行到对应的云服务提供商的平台上,才有深入了解下去的必要,否则大可跳过不管。Spring Cloud Alibaba比较例外,阿里除了塞进去一些自己的商业服务以外(OSS等等),也试图通过这个项目扩大自己阵营的一些开源项目的影响力,包括Nacos,Sentinel,Dubbo(讽刺的是Dubbo曾经算是Spring Cloud最大的对手),因此替换了很多Spring Cloud默认的实现,姑且不论孰优孰劣,开发者多一个选择总不是坏事。
应用套件:工具太多,Spring也知道大家用起来麻烦呀,所以预先把一些最常用的工具进行了组合和集成,形成一些开箱即用的应用套件。大多数应用场景下只需要简单的参数配置,加上必要的注解就可以良好工作了。比如:Spring Cloud Netflix,Spring Cloud Consul,Spring Cloud Zookeeper等(Spring Cloud Alibaba其实也可以算在这一类里面)。目前网络上针对Spring Cloud的教程或者说明大多都是指的Spring Cloud Netflix,它是Spring Cloud最初的实现(另一种意义上来说也是最正统的实现吧), 用到了一系列Netflix主导的开源库和框架(Netflix OSS)。后面随着Netflix OSS中的一些框架不再维护了,Spring通过对其中的部分组件进行替换才又形成了其它的一些套件。
可选特性:分布式系统有大有小,复杂程度也各不相同,怎么才能快速构建出适合自身应用场景的系统框架呢?Spring Cloud给出的答案还是组合。前面所说的应用套件可以说是系统的核心骨架,覆盖了绝大部分分布式系统都需要解决或者应该解决的问题。而没有覆盖到的差异化场景就可以通过组合不同的可选特性来实现。比如Spring Cloud Stream提供了消息中间件的服务,可以简化大量异步场景的处理。Spring Cloud Sleuth可以提供链路跟踪的特性,从而满足在复杂的微服务架构下的错误定位和性能监控的需求。
其实Spring Cloud的这一系列组件正好体现了分而治之这一简单的原则,这也是微服务架构的核心思想。通过对组件的搭配和组合,可以适应各种规模的应用系统以及一些特殊的差异化场景。而提供默认的,开箱即用的组合套件可以快速应用于大多数的普通应用场景,这样大大降低了学习曲线,最大程度保持了灵活性和易用性的平衡。