其實廣義上的Spring是一個生態體系,是不少技術的集合。而咱們常說的Spring僅僅是狹義上的Spring,實際指的是Spring Framework。下面咱們會針對Spring(Spring Framework)、Spring Boot和Spring Cloud 進行詳細的介紹java
Spring Framework最核心的兩個特性是提供了IOC容器管理咱們的對象和提供了AOP面向切面編程減小重複編碼。此外還提供了數據存儲、Wbe模塊開發、資源管理、數據校驗和綁定、類型轉換和國際化等功能。git
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
優勢實在太多,這裏只列舉了部分,你們用了都知道。算法
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 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 -> Spring Boot -> Spring Cloud