天天看點

為什麼說Java程式員到了必須掌握Spring Boot的時候?

Spring Boot 2.0 的推出又激起了一陣學習 Spring Boot 熱,就單從我個人的部落格的通路量大幅增加就可以感受到大家對學習 Spring Boot 的熱情,那麼在這麼多人熱衷于學習 Spring Boot 之時,我自己也在思考: Spring Boot 誕生的背景是什麼?Spring 企業又是基于什麼樣的考慮建立 Spring Boot? 傳統企業使用 Spring Boot 會給我們帶來什麼樣變革?

帶着這些問題,我們一起來了解下 Spring Boot 到底是什麼?

Spring 曆史

說起 Spring Boot 我們不得不先了解一下 Spring 這個企業,不僅因為 Spring Boot 來源于 Spirng 大家族,而且 Spring Boot 的誕生和 Sping 架構的發展息息相關。

時間回到2002年,當時正是 Java EE 和 EJB 大行其道的時候,很多知名公司都是采用此技術方案進行項目開發。這時候有一個美國的小夥子認為 EJB 太過臃腫,并不是所有的項目都需要使用 EJB 這種大型架構,應該會有一種更好的方案來解決這個問題。

為了證明他的想法是正确的,于2002年10月甚至寫了一本書《 Expert One-on-One J2EE 》,介紹了當時 Java 企業應用程式開發的情況,并指出了 Java EE 和 EJB 元件架構中存在的一些主要缺陷。在這本書中,他提出了一個基于普通 Java 類和依賴注入的更簡單的解決方案。

在書中,他展示了如何在不使用 EJB 的情況下建構高品質,可擴充的線上座位預留系統。為了建構應用程式,他編寫了超過 30,000 行的基礎結構代碼,項目中的根包命名為 com.interface21,是以人們最初稱這套開源架構為 interface21,也就是 Spring 的前身。

他是誰呢,他就是大名鼎鼎的 Rod Johnson (下圖), Rod Johnson 在悉尼大學不僅獲得了計算機學位,同時還獲得了音樂學位,更令人吃驚的是在回到軟體開發領域之前,他還獲得了音樂學的博士學位。現在 Rod Johnson 已經離開了 Spring ,成為了一個天使投資人,同時也是多個公司的董事,早已走上人生巅峰。

在這本書釋出後,一對一的 J2EE 設計和開發一炮而紅。這本書免費提供的大部分基礎架構代碼都是高度可重用的。 2003 年 Rod Johnson 和同伴在此架構的基礎上開發了一個全新的架構命名為 Spring ,據 Rod Johnson 介紹 Spring 是傳統 J2EE 新的開始。随後 Spring 發展進入快車道。

2004 年 03 月,1.0 版釋出。

2006 年 10 月,2.0 版釋出。

2007 年 11 月更名為 SpringSource,同時釋出了 Spring 2.5。

2009 年 12 月,Spring 3.0 釋出。

2013 年 12 月,Pivotal 宣布釋出 Spring 架構 4.0。

2017 年 09 月,Spring 5.0 釋出。

Spring Boot 的誕生

随着使用 Spring 進行開發的個人和企業越來越多,Spring 也慢慢從一個單一簡潔的小架構變成一個大而全的開源軟體,Spring 的邊界不斷的進行擴充,到了後來 Spring 幾乎可以做任何事情了,市面上主流的開源軟體、中間件都有 Spring 對應元件支援,人們在享用 Spring 的這種便利之後,也遇到了一些問題。

Spring 每內建一個開源軟體,就需要增加一些基礎配置,慢慢的随着人們開發的項目越來越龐大,往往需要內建很多開源軟體,是以後期使用 Spirng 開發大型項目需要引入很多配置檔案,太多的配置非常難以了解,并容易配置出錯,到了後來人們甚至稱 Spring 為配置地獄。

Spring 似乎也意識到了這些問題,急需有這麼一套軟體可以解決這些問題,這個時候微服務的概念也慢慢興起,快速開發微小獨立的應用變得更為急迫,Spring 剛好處在這麼一個交叉點上,于 2013 年初開始的 Spring Boot 項目的研發,2014年4月,Spring Boot 1.0.0 釋出。

Spring Boot 誕生之初,就受到開源社群的持續關注,陸續有一些個人和企業嘗試着使用了 Spring Boot,并迅速喜歡上了這款開源軟體。直到2016年,在國内 Spring Boot 才被正真使用了起來,期間很多研究 Spring Boot 的開發者在網上寫了大量關于 Spring Boot 的文章,同時有一些公司在企業内部進行了小規模的使用,并将使用經驗分享了出來。從2016年到2018年,使用 Spring Boot 的企業和個人開發者越來越多,我們從 Spring Boot 關鍵字的百度指數就可以看出。

為什麼說Java程式員到了必須掌握Spring Boot的時候?

上圖為2014年到2018年 Spring Boot 的百度指數,可以看出 Spring Boot 2.0 的推出引發了搜尋高峰。

當然 Spring Boot 不是為了取代 Spring ,Spring Boot 基于 Spring 開發,是為了讓人們更容易的使用 Spring。看到 Spring Boot 的市場反應,Spring 官方也非常重視 Spring Boot 的後續發展,已經将 Spring Boot 作為公司最頂級的項目來推廣,放到了官網上第一的位置,是以後續 Spring Boot 的持續發展也被看好。

為什麼說Java程式員到了必須掌握Spring Boot的時候?

什麼是 Spring Boot

Spring Boot 介紹

Spring Boot 是由 Pivotal 團隊提供的全新架構,其設計目的是用來簡化新 Spring 應用的初始搭建以及開發過程。該架構使用了特定的方式來進行配置,進而使開發人員不再需要定義樣闆化的配置。用我的話來了解,就是 Spring Boot 其實不是什麼新的架構,它預設配置了很多架構的使用方式,就像 maven 整合了所有的 jar 包,Spring Boot 整合了所有的架構(不知道這樣比喻是否合适)。

Spring Boot 簡化了基于 Spring 的應用開發,通過少量的代碼就能建立一個獨立的、産品級别的 Spring 應用。 Spring Boot 為 Spring 平台及第三方庫提供開箱即用的設定,這樣你就可以有條不紊地開始。Spring Boot 的核心思想就是約定大于配置,多數 Spring Boot 應用隻需要很少的 Spring 配置。采用 Spring Boot 可以大大的簡化你的開發模式,所有你想內建的常用架構,它都有對應的元件支援。

Spring Boot 特性

使用 Spring 項目引導頁面可以在幾秒建構一個項目

友善對外輸出各種形式的服務,如 REST API、WebSocket、Web、Streaming、Tasks

非常簡潔的安全政策內建

支援關系資料庫和非關系資料庫

支援運作期内嵌容器,如 Tomcat、Jetty

強大的開發包,支援熱啟動

自動管理依賴

自帶應用監控

支援各種 IED,如 IntelliJ IDEA 、NetBeans

Spring Boot 這些特性會給我們研發帶來非常大的優勢,下面我們可以分開來介紹:

使用 Spring Boot 的優勢

使用 Spring Boot 開發項目,會給我們帶來非常美妙的開發體驗,可以從以下幾個方面展開來說明

Spring Boot 讓開發變得更簡單

Spring Boot 對開發效率的提升是全方位的,我們可以簡單做一下對比:

在沒有使用 Spring Boot 之前我們開發一個 web 項目需要做哪些工作:

1)配置 web.xml,加載 Spring 和 Spring mvc

2)配置資料庫連接配接、配置 Spring 事務

3)配置加載配置檔案的讀取,開啟注解

4)配置日志檔案

n) 配置完成之後部署 tomcat 調試

可能你還需要考慮各個版本的相容性,jar 包沖突的各種可行性。

那麼使用 Spring Boot 之後我們需要開發一個 web 項目需要哪些操作呢?

1)登入網址 http://start.spring.io/ 選擇對應的元件直接下載下傳

2)導入項目,直接開發

上面的 N 步和下面的2步形成巨大的反差,這僅僅隻是在開發環境搭建的這個方面。

Spring Boot 使測試變得更簡單

Spring Boot 對測試的支援不可謂不強大,Spring Boot 内置了7種強大的測試架構:

JUnit: 一個 Java 語言的單元測試架構

Spring Test & Spring Boot Test:為 Spring Boot 應用提供內建測試和工具支援

AssertJ:支援流式斷言的 Java 測試架構

Hamcrest:一個比對器庫

Mockito:一個 java mock 架構

JSONassert:一個針對 JSON 的斷言庫

JsonPath:JSON XPath 庫

我們隻需要在項目中引入spring-boot-start-test依賴包,就可以對資料庫、Mock、 Web 等各種情況進行測試。

Spring Boot Test 中包含了我們需要使用的各種測試場景,滿足我們日常項目的測試需求。

Spring Boot 讓配置變得更簡單

Spring Boot 讓配置變簡單,說到這裡我們就需要了解一下 Spring Boot 的核心思想:約定優于配置。那麼什麼是約定優于配置呢?

約定優于配置(convention over configuration),也稱作按約定程式設計,是一種軟體設計範式,旨在減少軟體開發人員需做決定的數量,獲得簡單的好處,而又不失靈活性。

本質是說,開發人員僅需規定應用中不符約定的部分。例如,如果模型中有個名為 User 的類,那麼資料庫中對應的表就會預設命名為 user。隻有在偏離這一約定時,例如将該表命名為”user_info”,才需寫有關這個名字的配置。

Spring Boot 讓部署變得更簡單

說起 Spring Boot 讓部署變簡單,就不得不說 Spring Boot 内嵌容器。内嵌容器不隻讓部署變得簡單,其實在開發調試階段也會帶來非常大的便利性,對比以往開發 Web 項目時配置 Tomcat 的繁瑣,會讓大家使用 Spring Boot 内嵌容器開發時有更深的感觸。使用 Spring Boot 開發 Web 項目,讓我們不需要關心容器的環境問題,專心寫業務代碼即可。

Jenkins 是目前持續建構領域使用最廣泛的工具之一,Jenkins 是一個獨立的開源自動化伺服器,可用于自動化各種任務,如建構,測試和部署軟體。Jenkins 可以通過本機系統包 Docker 安裝,甚至可以通過安裝 Java Runtime Environment 的任何機器獨立運作。

說直白一點 Jenkins 就是專門來負責如何将代碼變成可執行的程式包,将它部署到目标伺服器中,并對其營運狀态(日志)進行監控的軟體。自動化、性能、打包、部署、釋出、釋出結果自動化驗證、接口測試、單元測試等等關于我們打包測試部署的方方面面 Jenkins 都可以很友好的支援。

使用 Jenkins 部署 Spring Boot 項目非常簡單,大家想繼續了解可以參考我的文章:使用Jenkins部署Spring Boot,隻需要前期做一些簡單的配置,當我們需要釋出項目時隻需要點選項目對應的釋出按鈕,就可以将項目從版本庫中拉取、打包、釋出到目标伺服器中,大大簡化了運維後期的部署工作。

虛拟化技術的發展給我們帶來了更多的可能性,我們可以利用容器化技術,将 Spring Boot 項目做成鏡像,根據容器叢集的政策來實作彈性擴容、動态部署等。是以 Spring Boot + Docker + Jenkins 會将 Spring Boot 項目的部署做得更簡單化、智能化。

Spring Boot 讓監控變得更簡單

可以說 Spring Boot 就是一款自帶監控的開源軟體,在設計之初就考慮到應用的監控問題,專門提供了一款監控元件來完成這個工作,這個元件就是

Spring Boot Actuator 。

Spring Boot Actuator 是 Spring Boot 提供的對應用系統監控的內建功能,可以檢視應用配置的詳細資訊,例如自動化配置資訊、建立的 Spring beans 以及一些環境屬性等。

當然 Spring Boot Actuator 雖然可以監控一個 Spring Boot 應用的健康情況,實際上現在的系統都是需要很多的服務互相配合來完成工作,如何通過一個監控軟體來監控是以的 Spring Boot 項目将變得比較緊迫。

在開源界也有人意識到了這個問題,并且基于 Spring boot actuator 做出了一款強大的監控軟體,這個軟體就是 Spring Boot admin 。

Spring Boot Admin 是一個管理和監控 Spring Boot 應用程式的開源軟體。每個應用都認為是一個用戶端,通過 HTTP 或者使用 Eureka 注冊到 admin server 中進行展示,Spring Boot Admin UI 部分使用 AngularJs 将資料展示在前端。

Spring Boot Admin 是一個針對 spring-boot 的 actuator 接口進行UI美化封裝的監控工具。他可以:在清單中浏覽所有被監控 spring-boot 項目的基本資訊,詳細的 Health 資訊、記憶體資訊、JVM 資訊、垃圾回收資訊、各種配置資訊(比如資料源、緩存清單和命中率)等,還可以直接修改logger的level。

使用 Spring Boot Admin 不僅可以監控 Spring Boot 項目,還可以監控 Spring Cloud 項目,是以使用了 Spring Boot 項目之後我們監控 Spring Boot 叢集效果如下:

為什麼說Java程式員到了必須掌握Spring Boot的時候?

簡單、直覺、易用是它的特點,針對一些特殊情況還可以提供報警服務。是以說使用 Spring Boot Actuator 解決了單個 Spring Boot 的監控問題,使用 Spring Boot Admin 就是解決了整個叢集監控的問題。

Spring 、Spring Boot 和 Spring Cloud 的關系

Spring 最初最核心的兩大核心功能 Spring Ioc 和 Spring Aop 成就了 Spring,Spring 在這兩大核心的功能上不斷的發展,才有了 Spring 事務、Spirng Mvc 等一系列偉大的産品,最終成就了 Spring 帝國,到了後期 Spring 幾乎可以解決企業開發中的所有問題。

Spring Boot 是在強大的 Spring 帝國生态基礎上面發展而來,發明 Spring Boot 不是為了取代 Spring ,是為了讓人們更容易的使用 Spring 。是以說沒有 Spring 強大的功能和生态,就不會有後期的 Spring Boot 火熱, Spring Boot 使用約定優于配置的理念,重新重構了 Spring 的使用,讓 Spring 後續的發展更有生命力。

Spring Cloud 是一系列架構的有序集合。它利用 Spring Boot 的開發便利性巧妙地簡化了分布式系統基礎設施的開發,如服務發現注冊、配置中心、消息總線、負載均衡、斷路器、資料監控等,都可以用 Spring Boot 的開發風格做到一鍵啟動和部署。

Spring 并沒有重複制造輪子,它隻是将目前各家公司開發的比較成熟、經得起實際考驗的服務架構組合起來,通過 Spring Boot 風格進行再封裝屏蔽掉了複雜的配置和實作原理,最終給開發者留出了一套簡單易懂、易部署和易維護的分布式系統開發工具包。

根據上面的說明我們可以看出來,Spring Cloud 是為了解決微服務架構中服務治理而提供的一系列功能的開發架構,并且 Spring Cloud 是完全基于 Spring Boot 而開發,Spring Cloud 利用 Spring Boot 特性整合了開源行業中優秀的元件,整體對外提供了一套在微服務架構中服務治理的解決方案。

綜上我們可以這樣來了解,正是由于 Spring Ioc 和 Spring Aop 兩個強大的功能才有了 Spring ,Spring 生态不斷的發展才有了 Spring Boot ,使用 Spring Boot 讓 Spring 更易用更有生命力,Spring Cloud 是基于 Spring Boot 開發的一套微服務架構下的服務治理方案。

用一組不太合理的包含關系來表達它們之間的關系。

Spring ioc/aop > Spring > Spring Boot > Spring Cloud

給大家推薦一個專門收集 Spring Boot 學習資源的網站:Spring Boot 中文索引

總結

不知道什麼時候起,行業裡一些開發人員願意相信,使用複雜的軟體就意味着采用了高深的技術;使用了大量的配置,就意味着軟體有着很多比較強大的功能。在産品設計的時候有一個理念就是讓産品操作足夠的傻瓜化,假設使用者是一個智商并不高的群體,卻可以使他很容易的學會使用其産品,将此特性做為産品設計的一項标準之一。

其實我們的開源軟體也是一款産品,繁瑣并不意味着功能強大,反而有可能是設計不夠合理;簡潔也并不意味着簡單,很有可能它隻是将衆多複雜的功能進行了封裝,讓我們在使用的時候足夠的簡單。好的産品如此,好的開源軟體也應該如此,Spring Boot 的出現就是讓程式設計變得更簡單一些。

在此引用 Python 的經典設計格言,格言來源于 Python 但不限于 Python。

美麗優于醜陋。

清楚優于含糊。

簡單優于複雜。

複雜優于繁瑣。

平坦優于曲折。

寬松優于密集。

重要的是可讀性。

特殊的案例不足以特殊到破壞規則。

盡管實踐可以打破真理。

錯誤卻不可置之不理。

除非另有明确要求。

面對模棱兩可,拒絕猜測。

總會有一個 —— 最好是隻有一個 —— 顯而易見的方式來明辨。

哪怕這種方式在開始的時候可能并不明顯。

現在有比沒有好。

盡管沒有經常好于現在。

如果如何實作很難被解釋清楚,那麼這個想法就是一個壞想法。

如果如何實作可以被很好的解釋,那麼這是一個好想法。