Spring、Spring Boot、Spring Cloud的关系
关系初探

其实广义上的Spring是一个生态体系,是很多技术的集合。而我们常说的Spring仅仅是狭义上的Spring,实际指的是Spring Framework。下面我们会针对Spring(Spring Framework)、Spring Boot和Spring Cloud 进行详细的介绍
介绍
Spring Framework

特性
Spring Framework最核心的两个特性是提供了IOC容器管理我们的对象和提供了AOP面向切面编程减少重复编码。此外还提供了数据存储、Wbe模块开发、资源管理、数据校验和绑定、类型转换和国际化等功能。
优点
- 解耦代码,简化开发。通过Spring Framework提供的IOC容器,用户可以将对象之间的依赖关系交由Spring Framework管理,避免硬编码造成的过度程序耦合。
- AOP编程的支持。通过Spring Framework提供的AOP功能,方便进行面向切面的编程。
- 声明式事务的支持。在Spring Framework中,可以避免编程式事务硬编码的缺点,通过声明的方式灵活地进行事务管理,提高开发效率和质量。
- 降低Java EE API的使用难度。
缺点
- 使用门槛高,入门Spring需要比较长的时间。
- 对过时技术兼容,导致使用复杂度提升。
- 配置过多,XML配置已经不是流行的系统配置方式。
- 集成第三方工具时候,程序员还要考虑工具之间的兼容性。
- 系统启动慢,不具备热部署功能,完全依赖虚拟机或者Web服务器的热部署。
Spring Boot

Spring Boot是一个全新的自动化配置解决方案。使用SpringBoot可以快速创建基于Spring生产级的独立应用程序,而无需过多的关注XML配置。
特性
Spring Boot充分利用了JavaConfig的配置模式以及使用“约定优先于配置”(COC,Convension Over Configuration)的设计理念。它提供了针对企业应用开发各种场景的很多spring-boot-starter自动配置依赖模块供我们开箱即用。(官方starter使用spring-boot-starter-xxx命名,而非官方starter使用xxx-spring-boot-starter命名)。
拓展介绍:约定优先于配置COC,Convension Over Configuration)也称为按约定编程,是一种软件设计范式,旨在减少开发人员需做决定的数量,获得简单的好处,而又不是去灵活性。
优点
- 对主流框架进行无配置集成,自动整合第三方框架。
- 可独立运行Spring项目,Spring Boot可以jar包形式独立运行。使用java -jar命令或者在项目的主函数中执行main函数就可以成功运行项目。
- 嵌入式服务器,能够快速部署。集成了Tomcat(默认)、Jetty和Undertow容器。
- 提供了很多插件让我们开箱即用,能够快速的搭建一个Spring项目,很少配置就能运行一个JavaEE项目。
- 纯Java配置,没有代码生成,也不需要XML配置。并提供了一系列非功能性的通用配置。
- 减少了大量的开发时间并提高了生产力。
优点实在太多,这里只列举了部分,大家用了都知道。
缺点
- 自动化配置,导致出现问题时比较难定位。
- 版本迭代速度过快,一些模块改动太大。
- 集成度过高,想了解底层成本较大。
SpringCloud

Spring Cloud是一系列框架的有序集合,它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,提供了很开发工具包以提供服务发现注册、配置中心、智能路由、消息总线、断路器、负载均衡和数据监控等功能。
特性
微服务核心要素 | Spring Cloud技术栈实现 |
---|---|
服务注册与发现 | Spring Cloud Netflix Eureka、 Spring Cloud Alibaba Nacos、 Spring Cloud Consul、 Spring Cloud Zookeeper |
服务配置与管理 | Spring Cloud Config、 Spring Cloud Alibaba Nacos |
服务熔断器 | Spring Cloud Netflix Hystrix、 Spring Cloud Alibaba Sentinel、 Spring Cloud Circuit Breaker Resilience4J |
服务接口调用(客户端调用服务的简化工具) | Spring Cloud OpenFeign |
客户端负载均衡 | Spring Cloud Netflix Ribbon |
服务路由(API网关) | Spring Cloud Netflix Zuul、Spring Cloud Gateway |
全链路追踪 | Spring Cloud Sleuth |
事件消息总线 | Spring Cloud Bus |
分布式事务 | Spring Cloud Alibaba Seata |
消息驱动 | Spring Cloud Stream |
详情请前往链接:spring.io/projects/sp…
服务注册与发现
注册中心选型对比
Nacos | Eureka | Consul | Zookeeper | Etcd | SOFARegistry | |
---|---|---|---|---|---|---|
语言 | Java | Java | Go | Java | Go | Java |
官网 | nacos.io | github.com/Netflix/eur… | www.consul.io | zookeeper.apache.org | coreos.com/etcd | www.sofastack.tech/projects/so… |
Github | github.com/alibaba/nac… | github.com/Netflix/eur… | github.com/hashicorp/c… | github.com/apache/zook… | github.com/etcd-io/etc… | github.com/alipay/sofa… |
CAP | CP+AP | AP | CP | CP | CP | AP |
服务健康检查 | CP+AP | AP | CP | CP | CP | AP |
kv存储服务 | N/A | N/A | 支持 | 支持 | 支持 | N/A |
使用接口(多语言能力) | gRPC / Dubbo / REST | 客户端 / HTTP | 支持HTTP和DNS | 客户端 | HTTP / gRPC | 客户端(Java) |
Watch支持 | 支持Long Polling/大部分增量 | 支持Long Polling/大部分增量 | 全量/支持Long Polling | 支持 | 支持Long Polling | 支持(服务端推送) |
Spring Cloud集成 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 |
Dubbo集成 | 支持 | 不支持 | 不支持 | 支持 | 支持 | 支持 |
网关
网关选型对比
Kong | Spring Cloud Zuul(基于Zuul 1.x) | Spring Cloud Gateway | |
---|---|---|---|
介绍 | Nginx(OpenResty) + Lua插件,高性能 | Java + Servlet + Groovy(热更新) | Java + Spring 5.0 + Reactor非阻塞 |
官网 | konghq.com | github.com/Netflix/zuu… | spring.io/projects/sp… |
Github | github.com/Kong/kong | github.com/Netflix/zuu… | github.com/spring-clou… |
开发方 | Kong(Mashape)公司 | Netflix | Pivotal |
主要用途 | 企业级API管理 | 微服务网关 | 微服务网关 |
开发容易度 | Lua脚本语言,比较难 | Java + Servlet,容易 | Reactor异步,比较难 |
是否开源 | 开源/企业版 | 开源 | 开源 |
支持协议 | RESTful API | RESTful API | RESTful API |
API 注册/动态路由 | 通过 Admin API 管理 | 动态路由 | 动态路由 |
限流 | 支持 | 需要开发 | 支持 |
熔断 | 支持 | 需要其他组件 | 支持 |
重试 | 支持 | 支持 | 支持 |
健康检查 | 支持 | 支持 | 支持 |
负载均衡算法 | 轮询,哈希 | 轮询、随机、加权轮询、自定义 | 轮询、随机、加权轮询、自定义 |
权限 | 内置多种方式 | 开发实现 | 开发实现 |
Tracing | 支持 | 需要其他组件 | 需要其他组件 |
支持Yaml | 支持 | 支持 | 支持 |
服务配置与管理
配置中心选型对比
Nacos | Apollo | Spring Cloud Config | |
---|---|---|---|
语言 | Java | Java | Java |
官网 | nacos.io | github.com/ctripcorp/a… | spring.io/projects/sp… |
Github | github.com/alibaba/nac… | github.com/ctripcorp/a… | github.com/spring-clou… |
配置实时推送 | 支持(HTTP长轮询1s内) | 支持(HTTP长轮询1s内) | 支持(Spring Cloud Bus) |
版本管理 | 支持 | 支持 | 支持(Git) |
配置回滚 | 支持 | 支持 | 支持(Git) |
灰度发布 | 不支持 | 支持 | 支持 |
权限管理 | 不支持 | 支持 | 支持(依赖Git) |
多集群 | 支持 | 支持 | 支持 |
多环境 | 支持 | 支持 | 支持 |
监听查询 | 支持 | 支持 | 支持 |
多语言 | 主流语言,提供了Open API | 主流语言,提供了Open API | 只支持Java |
配置格式校验 | 支持 | 不支持 | 不支持 |
服务熔断器
断路器选型对比
Sentinel | Hystrix | Resilience4j | |
---|---|---|---|
语言 | Java | Java | Java |
官网 | sentinelguard.io/zh-cn/ | github.com/Netflix/Hys… | N/A |
Github | github.com/alibaba/Sen… | github.com/Netflix/Hys… | github.com/resilience4… |
主要用途 | 信号量隔离(并发线程数限流) | 线程池隔离/信号量隔离 | 信号量隔离 |
熔断降级策略 | 基于响应时间、异常比率、异常数 | 基于异常比率 | 基于异常比率、响应时间 |
实时统计实现 | 滑动窗口(LeapArray) | 滑动窗口(基于 RxJava) | Ring Bit Buffer |
动态规则配置 | 支持多种数据源 | 支持多种数据源 | 有限支持 |
扩展性 | 多个扩展点 | 插件的形式 | 接口的形式 |
基于注解的支持 | 支持 | 支持 | 支持 |
限流 | 基于 QPS,支持基于调用关系的限流 | 有限的支持 | Rate Limiter |
流量整形 | 支持预热模式、匀速器模式、预热排队模式(流量规则处可配置) | 不支持 | 简单的 Rate Limiter 模式 |
系统自适应保护 | 支持 | 不支持 | 不支持 |
控制台 | 提供开箱即用的控制台,可配置规则、查看秒级监控、机器发现等 | 简单的监控查看 | 不提供控制台,可对接其它监控系统 |
全链路追踪
链路跟踪选型对比
CAT | Zipkin | Pinpoint | Skywalking | |
---|---|---|---|---|
语言 | Java | Java | Java | Java |
官网 | konghq.com | zipkin.io/ | github.com/naver/pinpo… | skywalking.apache.org/zh/ |
Github | github.com/dianping/ca… | github.com/openzipkin/… | github.com/naver/pinpo… | github.com/apache/skyw… |
实现方式 | 代码埋点(拦截器,注解,过滤器等) | 拦截请求,发送(HTTP,MQ)数据至Zipkin服务 | Java探针,字节码增强 | Java探针,字节码增强 |
存储选择 | Mysql , HDFS | In-Memory , Mysql , Cassandra , Elasticsearch | HBase + Mysql | Elasticsearch , H2 , Mysql , TiDB |
通信方式 | 基于Netty来实现的NIO的数据传输 | HTTP , MQ | Thrift | gRPC |
入侵度 | 比较大 | 比较小 | 字节码探针技术,代码无侵入 | 字节码探针技术,代码无侵入 |
MQ监控 | 不支持 | 不支持 | 不支持 | 支持(RocketMQ,Kafka) |
全局调用统计 | 支持 | 支持 | 不支持 | 支持 |
Trace查询 | 不支持 | 支持 | 不支持 | 支持 |
报警 | 支持 | 不支持 | 支持 | 支持 |
JVM监控 | 不支持 | 不支持 | 支持 | 支持 |
优点 | 功能完善。 | Spring-Cloud-Sleuth可以很好的集成Zipkin , 代码无侵入,集成非常简单 , 社区更加活跃。 | 完全无侵入, 仅需修改启动方式,界面完善,功能细致。 | 完全无侵入,界面完善,支持应用拓扑图及单个调用链查询。功能比较完善(Zipkin + Pinpoint) |
缺点 | 1. 代码侵入性较强,需要埋点。 2. 文档比较混乱,文档与发布版本的符合性较低,需要依赖点评私服 (或者需要把他私服上的jar手动下载下来,然后上传到我们的私服上去)。 | 1. 默认使用的是Http请求向Zipkin上报信息,耗性能。2.跟Sleuth结合可以使用RabbitMQ的方式异步来做,增加了复杂度,需引入RabbitMQ 。3.数据分析比较简单。 | 1.不支持查询单个调用链, 对外表现的是整个应用的调用生态。2.二次开发难度较高 | 1. 3.2版本之前BUG较多 ,网上反映兼容性较差 . 3.2新版本的反映情况较少2.依赖较多。 |
文档 | 网上资料较少,仅官网提供的文档,比较乱 | 文档完善 | 文档完善 | 文档完善 |
优点
- Spring Cloud提供了一整套微服务功能组件,很多组件基本上是“开箱即用”,并且组件之间能很好地兼容,从而简化了开发。
- Spring Cloud整合的组件基本都是轻量级的,并且都是各自领域的佼佼者。
- 组件之间都是解耦,开发人员可以灵活选择搭配不同的组件。
- 基于Spring Boot开发,约定优于配置,基于注解,没有配置文件。
缺点
- 从与其他RPC框架对比的角度来说,Spring Cloud里并没有限制服务之间的通信协议,主流的一些客户端比如RestTemple、Feign等都是直接支持使用 Ribbon来做服务注册发现和智能路由的,其底层通信的协议都是HTTP,可能相对RPC框架如Dubbo会牺牲一定服务调用的性能。
- 从微服务开发的角度来说,微服务过多,治理成本高,不利于维护系统。分布式系统开发的成本高(容错,分布式事务等)对团队挑战大。
关系再探
Spring Boot的自动化配置实现其实是得益于Spring Framework的@Enable模块驱动。
框架实现 | 注解 | 激活模块 |
---|---|---|
Spring Framework | @EnableTransactionManagement | 事务管理模块 |
@EnableWebMvc | Web Mvc模块 | |
@EnableAspectJAutoProxy | AspectJ模块 | |
@EnableCaching | 缓存模块 | |
@EnableEnableScheduling | 定时任务模块 | |
@EnableAsync | 异步处理模块 | |
@EnableMBeanExport | JMX模块 | |
Spring Boot | @EnableAutoConfiguration | 自动装配模块 |
@EnableConfigurationProperties | 配置属性绑定模块 | |
@EnableOAuth2Sso | OAuth2 单点登陆模块 | |
@EnableManagementContext | Actuator模块 | |
Spring Cloud | @EnableDiscoveryClient | 服务发现模块 |
@EnableFeignCliens | Feign客户端模块 | |
@EnableCircuitBreaker | 服务熔断模块 | |
@EnableEurekaServer | Eureka服务端模块 | |
@EnableEurekaClient | Eureka客户端模块 |
上表是部分Spring Framework、Spring Boot和Spring Cloud的@Enable注解模块,还有很多其他大家可以自行查阅,其实我们也可以使用@Enable注解模块实现自定义的Starter,使自己的项目也能够自动配置化。
总结
- Spring Framework是Spring生态体系的基石,Spring的其他所有模块都离不开它。
- Spring Boot是通过Spring Framework的@Enable注解模块驱动实现的全新自动化配置解决方案。它的出现解决了Spring Framework的上手难度大的问题,屏蔽了很多底层细节,采用JavaConfig,解决了众多XML配置的烦恼。
- Sring Cloud是基于Spring Boot实现的一套微服务开发工具集,利用Spring Boot的自动配置化特性,简化了分布式项目的开发复杂度。
Spring -> Spring Boot -> Spring Cloud
转载自:https://juejin.cn/post/6844904162275098632