浅谈Spring、Spring Framework、Spring Boot、Spring Cloud

一、Spring

Spring makes programming Java quicker, easier, and safer for everybody. Spring’s focus on speed, simplicity, and productivity has made it the world’s most popular Java framework.

Spring使每个人都可以更快,更轻松和更安全地进行Java编程。 Spring对速度,简单性和生产率的关注使其成为[世界上最受欢迎的]Java框架。

image-20210120151206272.png

特性

  • Microservices:Quickly deliver production‑grade features with independently evolvable microservices.
  • Reactive:Spring’s asynchronous, nonblocking architecture means you can get more from your computing resources.
  • Cloud:Your code, any cloud—we’ve got you covered. Connect and scale your services, whatever your platform.
  • Web apps:Frameworks for fast, secure, and responsive web applications connected to any data store.
  • Serverless:The ultimate flexibility. Scale up on demand and scale to zero when there’s no demand.
  • Event Driven:Integrate with your enterprise. React to business events. Act on your streaming data in realtime.
  • Batch:Automated tasks. Offline processing of data at a time to suit you.

Projects Overview

image-20210120152533338.png

Spring是一个生态体系,或者说是技术体系、是很多技术的集合,下面包括了很多子项目,如Spring Framework、Spring Boot、Spring Cloud等,我们常说的Spring仅仅是狭义上的Spring,实际指的是Spring Framework。

二、Spring Framework

The Spring Framework provides a comprehensive programming and configuration model for modern Java-based enterprise applications – on any kind of deployment platform.

Spring Framework为任何类型的部署平台上的基于Java的现代企业应用程序提供了全面的编程和配置模型。

A key element of Spring is infrastructural support at the application level: Spring focuses on the “plumbing” of enterprise applications so that teams can focus on application-level business logic, without unnecessary ties to specific deployment environments.

Spring的一个关键要素是在应用程序级别的基础架构支持:Spring专注于企业应用程序的“管道”,以便团队可以专注于应用程序级别的业务逻辑,而不必与特定的部署环境建立联系。

img

特性

  • Core technologies: dependency injection, events, resources, i18n, validation, data binding, type conversion, SpEL, AOP.
  • Testing: mock objects, TestContext framework, Spring MVC Test, .WebTestClient
  • Data Access: transactions, DAO support, JDBC, ORM, Marshalling XML.
  • Spring MVC and Spring WebFlux web frameworks.
  • Integration: remoting, JMS, JCA, JMX, email, tasks, scheduling, cache.
  • Languages: Kotlin, Groovy, dynamic languages.

优点

  • 解耦代码,简化开发。通过Spring Framework提供的IOC容器,用户可以将对象之间的依赖关系交由Spring Framework管理,避免硬编码造成的过度程序耦合。
  • AOP编程的支持。通过Spring Framework提供的AOP功能,方便进行面向切面的编程。
  • 声明式事务的支持。在Spring Framework中,可以避免编程式事务硬编码的缺点,通过声明的方式灵活地进行事务管理,提高开发效率和质量。
  • 降低Java EE API的使用难度。

缺点

  • 使用门槛高,入门Spring需要比较长的时间。
  • 对过时技术兼容,导致使用复杂度提升。
  • 配置过多,XML配置已经不是流行的系统配置方式。
  • 集成第三方工具时候,程序员还要考虑工具之间的兼容性。
  • 系统启动慢,不具备热部署功能,完全依赖虚拟机或者Web服务器的热部署。

Spring Framework是整个Spring生态的基石,它有两个很重要的设计核心,IOC( 控制反转)和AOP(面向切面编程),是Spring所依赖的根本。它可是硬生生的消灭了Java官方主推的企业级开发标准EJB,从而实现一统天下。Spring官方对Spring Framework简短描述:为依赖注入、事务管理、WEB应用、数据访问等提供了核心的支持。
但是,无论Spring Framework接口如何简化,设计如何优美,始终无法摆脱被动的境况:由于它自身并非容器,所以基本上不得不随JavaEE容器启动而装载,例如Tomcat、Jetty、JBoss等。然而Spring Boot的出现,改变了Spring Framework甚至整个Spring技术体系的现状。

三、Spring Boot:Build Anything

Spring Boot makes it easy to create stand-alone, production-grade Spring based Applications that you can “just run”.

通过Spring Boot,可以轻松地创建独立的,生产级的,基于Spring的应用程序,您可以“运行”它们。

We take an opinionated view of the Spring platform and third-party libraries so you can get started with minimum fuss. Most Spring Boot applications need minimal Spring configuration.

我们对Spring平台和第三方库持固执己见的观点,因此您可以以最小的麻烦开始使用。大多数Spring Boot应用程序需要最少的Spring配置。

If you’re looking for information about a specific version, or instructions about how to upgrade from an earlier release, check out the project release notes section on our wiki.

如果您要查找有关特定版本的信息,或有关如何从早期版本升级的说明,请查看我们Wiki上的项目发行说明部分。

img

特性

  • Create stand-alone Spring applications
  • Embed Tomcat, Jetty or Undertow directly (no need to deploy WAR files)
  • Provide opinionated ‘starter’ dependencies to simplify your build configuration
  • Automatically configure Spring and 3rd party libraries whenever possible
  • Provide production-ready features such as metrics, health checks, and externalized configuration
  • Absolutely no code generation and no requirement for XML configuration

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配置。并提供了一系列非功能性的通用配置。
  • 减少了大量的开发时间并提高了生产力。
  • ……

缺点

  • 自动化配置,导致出现问题时比较难定位。
  • 版本迭代速度过快,一些模块改动太大。
  • 集成度过高,想了解底层成本较大。

Spring Boot能够让你非常容易的创建一个单机版本、生产级别的基于Spring Framework的应用。然后,”just run”即可。Spring Boot默认集成了很多第三方包,以便你能以最小的代价开始一个项目。可以说Spring Boot是对Java企业级应用开发进行了一场浩浩荡荡的革命。如果稍微有几年工作经验的,应该都记得以前的Java Web开发模式:Tomcat + WAR包。WEB项目基于Spring Framework,项目目录一定要是标准的WEB-INF + classes + lib,而且大量的xml配置。如果说,以前搭建一个SSH架构的Web项目需要1个小时,那么现在应该10分钟就可以了。

Spring Boot是通过Spring Framework的@Enable注解模块驱动实现的全新自动化配置解决方案。为快速启动且最小化配置的Spring应用而设计,并且它具有用于构建生产级别应用的一套固化的视图。

四、SpringCloud:Coordinate Anything

Spring Cloud provides tools for developers to quickly build some of the common patterns in distributed systems (e.g. configuration management, service discovery, circuit breakers, intelligent routing, micro-proxy, control bus, one-time tokens, global locks, leadership election, distributed sessions, cluster state). Coordination of distributed systems leads to boiler plate patterns, and using Spring Cloud developers can quickly stand up services and applications that implement those patterns. They will work well in any distributed environment, including the developer’s own laptop, bare metal data centres, and managed platforms such as Cloud Foundry.

Spring Cloud为开发人员提供了工具,以快速构建分布式系统中的某些常见模式(例如,配置管理,服务发现,断路器,智能路由,微代理,控制总线,一次性令牌,全局锁,领导选举,分布式会话,群集状态)。分布式系统的协调导致了样板式样,并且使用Spring Cloud开发人员可以快速站起来实现这些样板的服务和应用程序。它们可以在任何分布式环境中很好地工作,包括开发人员自己的笔记本电脑,裸机数据中心以及Cloud Foundry等托管平台。

Microservices diagram

特性

Spring Cloud focuses on providing good out of box experience for typical use cases and extensibility mechanism to cover others.

  • Distributed/versioned configuration
  • Service registration and discovery
  • Routing
  • Service-to-service calls
  • Load balancing
  • Circuit Breakers
  • Global locks
  • Leadership election and cluster state
  • Distributed messaging
微服务核心要素 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

服务注册与发现

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 Cloud是一系列框架的有序集合,是一整套基于Spring Boot的微服务解决方案,它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,提供了很多开发工具包以提供服务发现注册、配置中心、限流、网关、链路追踪、智能路由、消息总线、断路器、负载均衡和数据监控等功能。

最后

  • Spring是一个生态体系,或者说是技术体系、是很多技术的集合。
  • Spring Framework是整个Spring生态的基石,设计核心:IOCAOP,是Spring所依赖的根本,Spring的其他所有模块都离不开它。
  • Spring Boot是通过Spring Framework的@Enable注解模块驱动实现的全新自动化配置解决方案。为快速启动且最小化配置的Spring应用而设计,它的出现解决了Spring Framework的上手难度大的问题,屏蔽了很多底层细节,采用JavaConfig,解决了众多XML配置的烦恼。
  • Sring Cloud是基于Spring Boot实现的一套微服务开发工具集,利用Spring Boot的自动配置化特性,简化了分布式项目的开发复杂度。
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享