转载

Spring、SpringBoot、SpringCloud的关系

Spring、SpringBoot、SpringCloud的关系
上图是来自Spring官网。可以看到,Spring其实是一个生态体系,它下面包括了很多子项目,如Spring Framework、Spring Boot、Spring Cloud(还有Spring Data、Spring Security、Spring Batch、Spring Session、Spring AMQP等等),详情请前往链接: spring.io/projects

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

介绍

Spring Framework

Spring、SpringBoot、SpringCloud的关系
Spring Framework是整个Spring生态的基石,它有两个很重要的设计核心, IOC( 控制反转)和AOP(面向切面编程),是Spring所依赖的根本。

特性

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、SpringBoot、SpringCloud的关系

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、SpringBoot、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,使自己的项目也能够自动配置化。

原文  https://juejin.im/post/5ec0e2c55188256d92437def
正文到此结束
Loading...