Spring、Spring Boot、Spring Cloud的關係

關係初探

上圖是來自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 進行詳細的介紹java

介紹

Spring Framework

Spring Framework是整個Spring生態的基石,它有兩個很重要的設計核心, IOC( 控制反轉)和AOP(面向切面編程),是Spring所依賴的根本。

特性

Spring Framework最核心的兩個特性是提供了IOC容器管理咱們的對象和提供了AOP面向切面編程減小重複編碼。此外還提供了數據存儲、Wbe模塊開發、資源管理、數據校驗和綁定、類型轉換和國際化等功能。git

優勢

  • 解耦代碼,簡化開發。經過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命名)。github

拓展介紹:約定優先於配置COC,Convension Over Configuration)也稱爲按約定編程,是一種軟件設計範式,旨在減小開發人員需作決定的數量,得到簡單的好處,而又不是去靈活性。

優勢

  • 對主流框架進行無配置集成,自動整合第三方框架。
  • 可獨立運行Spring項目,Spring Boot能夠jar包形式獨立運行。使用java -jar命令或者在項目的主函數中執行main函數就能夠成功運行項目。
  • 嵌入式服務器,可以快速部署。集成了Tomcat(默認)、Jetty和Undertow容器。
  • 提供了不少插件讓咱們開箱即用,可以快速的搭建一個Spring項目,不多配置就能運行一個JavaEE項目。
  • 純Java配置,沒有代碼生成,也不須要XML配置。並提供了一系列非功能性的通用配置。
  • 減小了大量的開發時間並提升了生產力。

優勢實在太多,這裏只列舉了部分,你們用了都知道。算法

缺點

  • 自動化配置,致使出現問題時比較難定位。
  • 版本迭代速度過快,一些模塊改動太大。
  • 集成度太高,想了解底層成本較大。

SpringCloud

Spring Cloud是一系列框架的有序集合,它利用Spring Boot的開發便利性巧妙地簡化了分佈式系統基礎設施的開發,提供了很開發工具包以提供服務發現註冊、配置中心、智能路由、消息總線、斷路器、負載均衡和數據監控等功能。spring

特性

微服務核心要素 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…sql

服務註冊與發現

註冊中心選型對比
apache

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

相關文章
相關標籤/搜索