Spring Boot 让我们从繁琐的配置文件中解脱了出来,而 Spring Cloud,它利用 Spring Boot 的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用 Spring Boot 的开发风格做到一键启动和部署。Spring 并没有重复制造轮子,它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过 Spring Boot 风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。
微服务是可以独立部署、水平扩展、独立访问(或者有独立的数据库)的服务单元,springcloud 就是这些微服务的大管家,采用了微服务这种架构之后,项目的数量会非常多,springcloud 需要管理好这些微服务需要很多框架支持。
下图是 Spring Cloud 所包含的框架图:
服务治理
服务注册与发现是 Spring Cloud 中最核心的组件之一,整个系统中所有的服务都可以注册到注册中心,然后由注册中心进行统一调度,方便后续的水平扩展以及故障转移等。目前 Spring Cloud 主要通过整合 Netflix 的相关产品来实现这方面的功能(Spring Cloud Netflix),包括用于服务注册和发现的 Eureka,调用断路器 Hystrix,调用端负载均衡 Ribbon,Rest 客户端 Feign,智能服务路由 Zuul,用于监控数据收集和展示的 Spectator、Servo、Atlas,用于配置读取的 Archaius 和提供 Controller 层 Reactive 封装的 RxJava。除此之外,针对于服务的注册和发现,除了 Eureka,Spring Cloud 也整合了 Consul 和 Zookeeper 作为备选,但是因为这两个方案在 CAP 理论上都遵循 CP 而不是 AP,所以官方并没有推荐使用。
分布式链路监控
Spring Cloud Sleuth 提供了全自动、可配置的数据埋点,以收集微服务调用链路上的性能数据,并发送给 Zipkin 进行存储、统计和展示。
消息组件
既然是微服务架构,那服务间的调用肯定是无法避免的。Spring Cloud Stream 对于分布式消息的各种需求进行了抽象,包括发布订阅、分组消费、消息分片等功能,实现了微服务之间的异步通信。Spring Cloud Stream 也集成了第三方的 RabbitMQ 和 Apache Kafka 作为消息队列的实现。而 Spring Cloud Bus 基于 Spring Cloud Stream,主要提供了服务间的事件通信(比如刷新配置)。
配置中心
随着服务的不断增多,同时每个服务也会有多个环境(开发环境、测试环境、生产环境等),每个环境的配置文件又会有所不同,但是其中又有许多配置是可以共用的,如果每个服务自己去管理这些配置,会给维护带来很大的麻烦,这时候,我们就需要引入配置中心去统一管理这些配置。基于 Spring Cloud Netflix 和 Spring Cloud Bus,Spring 又提供了 Spring Cloud Config,实现了配置集中管理、动态刷新的配置中心概念。配置通过 Git 或者简单文件来存储,支持加解密。
安全控制
Spring Cloud Security 基于 OAuth2 这个开放网络的安全标准,提供了微服务环境下的单点登录、资源授权、令牌管理等功能。
命令行工具
Spring Cloud Cli 提供了以命令行和脚本的方式来管理微服务及 Spring Cloud 组件的方式。
集群工具
Spring Cloud Cluster 提供了集群选主、分布式锁(暂未实现)、一次性令牌(暂未实现)等分布式集群需要的技术组件。
如上图:Spring Cloud 各个组件相互配合,合作支持了一套完整的微服务架构。
其中:
1.Eureka 负责服务的注册与发现,很好将各服务连接起来
2.Hystrix 负责监控服务之间的调用情况,连续多次失败进行熔断保护
3.Hystrix dashboard,Turbine 负责监控 Hystrix 的熔断情况,并给予图形化的展示
4.Spring Cloud Config 提供了统一的配置中心服务
5.当配置文件发生变化的时候,Spring Cloud Bus 负责通知各服务去获取最新的配置信息
6.所有对外的请求和服务,都通过 Zuul 来进行转发,起到 API 网关的作用
7.最后使用 Sleuth+Zipkin 将所有的请求数据记录下来,方便进行后续分析
SpringCloud 和 Dubbo 都是现在主流的微服务架构
SpringCloud 是 Apache 旗下的 Spring 体系下的微服务解决方案
Dubbo 是阿里系的分布式服务治理框架
对比图如下:
最大区别:SpringCloud 抛弃了 Dubbo 的 RPC 通信,采用的是基于 HTTP 的 REST 方式。 从技术维度上,其实 SpringCloud 远远的超过 Dubbo,Dubbo 本身只是实现了服务治理,而 SpringCloud 现在以及有 21 个子项目以后还会更多。
所以其实很多人都会说 Dubbo 和 SpringCloud 是不公平的,但是由于 RPC 以及注册中心元数据等原因,在技术选型的时候我们只能二者选其一,所以我们常常用他俩来对比。
Dubbo 和 Spring Cloud 并不是完全的竞争关系,两者所解决的问题域不一样:Dubbo 的定位始终是一款 RPC 框架,而 Spring Cloud 的目的是微服务架构下的一站式解决方案