面試官問我:spring、springboot、springcloud的區別,我笑了

17673209395發表於2019-05-10

原創: 阿飛的部落格 好吧,可能某些專案還在使用dubbo,但是你也一定聽過Spring Cloud。至於Spring和Spring Boot,對於現在的Java開發,它們的地位簡直可以說是不可或缺了。如果你的新專案在使用Tomcat+WAR的開發模式(歷史遺留專案暫且不談),不好意思,真的要吐槽一下。

首先,筆者認為要完善一下這個題目,應該是:Spring、Spring Framework、Spring Boot、Spring Cloud的區別。

Spring

Spring是一個生態體系(也可以說是技術體系),是集大成者,它包含了Spring Framework、Spring Boot、Spring Cloud等(還包括Spring Cloud data flow、spring data、spring integration、spring batch、spring security、spring hateoas),可以參考連結:spring.io/projects,如下…

About spring About spring

Spring Framework

Spring Framework是整個spring生態的基石,它可是硬生生的消滅了Java官方主推的企業級開發標準EJB,從而實現一統天下。Spring官方對Spring Framework簡短描述:為依賴注入、事務管理、WEB應用、資料訪問等提供了核心的支援。Spring Framework專注於企業級應用程式的“管道”,以便開發團隊可以專注於應用程式的業務邏輯。

筆者要提醒的是,千萬不要把Spring和Spring Framework搞混淆了,很多文章都錯誤的定義了spring:spring是一個一站式的輕量級的java開發框架,核心是控制反轉(IoC)和麵向切面(AOP),針對於開發的WEB層(springMVC)、業務層(IoC)、持久層(jdbcTemplate)等都提供了多種配置解決方案。這是Spring Framework的定義,至於Spring,是整個生態。

但是,無論Spring Framework介面如何簡化,設計如何優美,始終無法擺脫被動的境況:由於它自身並非容器,所以基本上不得不隨JavaEE容器啟動而裝載,例如Tomcat、Jetty、JBoss等。然而Spring Boot的出現,改變了Spring Framework甚至整個Spring技術體系的現狀(摘自小馬哥的《SpringBoot程式設計思想》)。

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的應用。然後,"just run"即可。Spring Boot預設整合了很多第三方包,以便你能以最小的代價開始一個專案。

我們看看官方對Spring Boot的定義:

Spring Boot is designed to get you up and running as quickly as possible, with minimal upfront configuration of Spring. Spring Boot takes an opinionated view of building production-ready applications.

即Spring Boot為快速啟動且最小化配置的spring應用而設計,並且它具有用於構建生產級別應用的一套固化的檢視(摘自小馬哥的《SpringBoot程式設計思想》)。這裡的固化的檢視,筆者認為可以理解成Spring Boot的約定,因為Spring Boot的設計是約定大於實現的。

Spring Cloud

最後就是大名鼎鼎的Spring Cloud了,Spring Cloud事實上是一整套基於Spring Boot的微服務解決方案。它為開發者提供了很多工具,用於快速構建分散式系統的一些通用模式,例如:配置管理、註冊中心、服務發現、限流、閘道器、鏈路追蹤等。

如下圖所示,很好的說明了Spring Boot和Spring Cloud的關係,Spring Boot是build anything,而Spring Cloud是coordinate anything,Spring Cloud的每一個微服務解決方案都是基於Spring Boot構建的:

spring.io spring.io 如下圖所示,是spring主頁介紹Spring Cloud的配圖,我們可以看到,分散式微服務每一個環節,Spring Cloud都提供了對應的元件支援:

Spring Cloud Spring Cloud 說明:Spring Cloud的元件非常多,完整的元件可以參考連結:spring.io/projects/sp…

總結

筆者參與的專案也是基於Spring Cloud體系搭建的微服務。筆者認為Spring Cloud的名氣要大於它的作用,可能這句話會帶來不少爭議。Spring Cloud本身沒有問題,有問題的是它的適配方案。你俯瞰一下Spring Cloud的整個微服務生態,你會發現真的不可替代的元件又有幾個?甚至它的一些元件,筆者壓根不會考慮將它引入專案中,比如:

Spring Cloud Sleuth:它是鏈路追蹤解決方案,很明顯,我只會考慮Skywalking、Pinpoint、CAT。

Spring Cloud Config:它是一個配置中心解決方案,無論是攜程的apollo、還是百度的disconf,都遠比它強大好用的多。

另外,Spring Cloud netflix的核心元件hystrix已經停更,你可否還記得dubbo當年停更被噴成什麼樣?

閘道器也並不是非Spring Cloud netflix下的zuul不可。非Spring Cloud生態下還有優秀的kong、Traefik、soul都是非常不錯的選擇。

最後就是Spring Cloud生態元件的穩定性和效能。用Spring Cloud微服務生態元件或多或少會碰到這樣那樣的問題。你甚至會懷疑,這個東西居然是和Spring Framework以及Spring Boot一起屬於spring生態的。畢竟,後兩者使用過程中你是幾乎碰不到問題的。Spring Cloud的一些方案給我的感覺更像一個半成品,如果你的公司使用Spring Cloud來搭建微服務,那麼肯定需要一個團隊來維護用到的Spring Cloud元件。至於效能嘛,各服務之間預設通過HTTP呼叫,所以效能你懂的。另外,Spring Cloud netflix這一套元件雖然由netflix貢獻,但是我敢肯定絕對是閹割版,以它的hystrix來說,相當多的缺陷,我可不認為hystrix在高併發下能工作的很好。

Spring Cloud還有一個尷尬的處境就是,大公司基本上不會引入這一套架構,比如阿里,有自己一套完整的微服務解決方案,美團也全部都是自研,還有很多公司的閘道器也是自研。綜上,筆者得出的結論是:Spring Boot是大勢所趨,而且它就像當年Spring Framework幹掉EJB一樣,幹掉WEB容器+WAR的開發模式,統一現在的Java企業級應用開發標準。至於Spring Cloud?請謹慎選擇每一個引入專案的元件,畢竟它的每一個微服務元件都面對很多優秀的開源可替代方案。

所以,我們學習的時候不要避重就輕,應該以Spring Framework和Spring Boot為主,而不是Spring Cloud。既然Spring Boot這麼重要,那麼要怎麼學習Spring Boot呢?筆者推薦小馬哥的最新著作《Spring Boot程式設計思想》,完全良心推薦,絕非廣告(如果說真有一點私心,那就是小馬哥贈送了一本,讓我能在感受了它的品質的前提下,才推薦給正在讀這篇文章的您,嘿嘿。豆瓣讀書上小馬哥這本書的評分還沒開啟,筆者保守估計8分以上):

相關文章