【下載本文PDF進行閱讀】spring
Spring家族很龐大,從最先先出現的服務於企業級程序開發的Core、安全方面的Security、到後來的做爲各類數據源橋樑的Data、最近幾年很火的Boot,以及最新推出的正在蓬勃發展的Cloud(在本文以後都簡單稱爲Boot、Cloud省略Spring節省一點個人打字時間😊)。數據庫
上面這個腦圖給出了Spring家族主要的一些成員,右側非Cloud部分列的是功能,左側Cloud部分雖然組件繁雜,可是結構清晰(確實新版本清晰多了,命名也統一,你能夠放大圖片看一下這些是否熟悉),因此更進一步列出了組件要的一些模塊依賴和開啓功能的主註解。編程
Spring框架幾乎涉及到了Java企業級服務開發的全部方面,也幾乎針對全部開發經常使用的模式、中間件、數據庫進行了整合適配。設計模式
以前在聊互聯網架構模式的時候我談到過,不少時候咱們寫一個業務把邏輯寫死寫出來是比較容易的,可是把這個邏輯提取成模式進而打包成一個框架來給你們使用,這是比較難的。由於咱們只有經歷過足夠多的場景後才能提取出普適的功能框架,大部分人才能用上,並且咱們須要針對核心功能開放出可配置的部分,知足小部分人進一步定製和擴展功能的須要。安全
Spring框架經歷了幾個階段:架構
Spring的發展能夠看到互聯網架構的發展,Spring給咱們帶來至關多的技術啓發,從軟件設計模式的啓發慢慢到了架構的啓發,甚至我以爲Spring是爲Java開發打造了架構風格的模板,接下去Spring繼續發展2到3年有望成爲架構標準,我在想這個時候應用架構師何去何從?併發
Spring Core提供的IOC、AOP功能已經變爲半個Java命根子了。其實不少開發平臺並非那麼強調IOC和AOP,甚至有的平臺徹底沒有相關支持。雖然我一直以爲IOC和AOP是很是好的思想,可讓咱們的軟件內部作到組件之間的低耦合,容易替換,容易擴展,可是個人觀點是,做爲一個類庫不該該把本身組件的初始化以及組裝工做交給外部來作。咱們知道經過IOC容器來管理咱們組件的實例化和依賴,其實咱們能夠在程序內部實現每個組件,把裝配工做交給XML配置進行,可是對於一些複雜的組件,若是這個工做的配置交給XML進行,那麼也就至關於交給了使用者進行,至關於須要使用者必定要理解組件內部的裝配結構,這是不合理的。更合理的方式是,組件或框架的做者提供一些擴展點,讓使用者能夠明確經過API來注入本身的擴展組件或實現組件,而對於只須要簡單使用組件的使用者能夠無需配置開箱即用。框架
固然,這不是說Spring的IOC和AOP有什麼很差,正由於框架實現的如此靈活,Java使用Spring做爲容器也基本是標準了,因此Java界不少框架也所以能夠相互進行很好的集成,確實是一個很好的平臺。模塊化
Spring 5推出了Reactive非阻塞技術棧,基於Netty或Servlet 3.1+容器,提供了Stream API、WebFlux以及各類響應式的存儲(各類NOSQL)訪問類庫。從前到後實現非阻塞的服務,能夠避免IO阻塞佔據線程,減小線程切換和資源使用,以最小的資源作到最大化的併發。惋惜的是JDBC目前並無非阻塞的版本,這樣咱們主流的基於MySQL的應用並不能進行全鏈路(從Controller到外部的Rest服務到數據庫)的非阻塞IO(一竿子到底這樣纔是最爽的)。並且對於Reactive套件,我通過簡單的使用我的感受API比較晦澀,鏈式調用可讀性並不高,並且反而遇到了併發的一些坑,加上代碼的示例和最佳實踐如今也不多,我感到如今使用並非特別成熟。函數
Spring Data但願以相對比較一致的Template API來讓咱們更方便得使用各類數據存儲。我我的不太喜歡習慣使用Data套件而是更喜歡使用各類NOSQL的Java原生客戶端。幾個緣由:
固然,若是咱們只是對NOSQL進行簡單使用的話,Spring Data可能使用起來更方便。
稍微老一點的Java開發基本都是從純XML配置到XML+註解配置走過來的,比較有意思的是不少開發雖然當初在使用XML配置,可是每每問他們每個配置的含義都不能準確回答出,基本就是拿着主管或前人搭建的一套XML配置直接複製粘貼過來使用。從側面說明了,其實咱們大部分那些Mybatis、Spring MVC的配置都是在幹組件初始化而不是定製化的事情。從0開始要讓一個組件用起來就須要這些基本的配置,既然是這樣的話,其實徹底能夠有默認配置,採用約定大於配置的方式來作。只有在咱們須要針對組件進行定製化的時候纔去作更多配置。
Spring Boot不但在自動配置、配置簡化上作了不少工做,並且還提供了輕量的嵌入式的容器,只須要20行的Pom+10行代碼,就能夠當即實現一個能夠自啓的應用程序(部署簡單)激發了咱們使用微服務的熱情。此外也給咱們作了不少Production-ready的啓示(Actuator),告訴咱們一個完善的應用程序應當注重環境切換、監控、日誌、打點等等方面。總之,以前咱們可能須要半天時間搭建一個項目,如今經過start.spring.io甚至只須要10秒。在有Boot以前,我實在沒有興趣使用重量級的Java(可能就爲了訪問下數據庫作一些處理,仍是使用Python算了)來建立一個實驗性的控制檯應用程序。
上圖來自官網首頁,很好地闡述了各個組件之間的關係。咱們來逐一過一下腦圖上的那些組件:
總結一下,整體上我感受Cloud模塊化的思想很好,模塊和模塊之間能夠相互搭配使用,可是可能一開始沒有進行系統性的規劃,版本的升級帶來的Breaking Changes有點過多,並且由於內容太多了,文檔方面沒有特別全面,要所有用起來坑會比較多,須要享受新功能的話還須要不斷更新框架版本不斷踩坑。
從目前功能的完善程度來講我感受核心功能完善度在60%(大概還須要發展1年能夠用的比較舒服)。後臺方面過於簡陋,官方提供的後臺零散醜陋並且完成度極低(相比國內一線互聯網在治理這塊開發的功能來講,完善度大概在30%,大概還須要發展2年能夠用的比較舒服,若是能夠好好規劃一套完整的後臺把服務治理全部相關功能都整合在一塊兒就行了)。無論怎麼樣,至少Cloud套件是一套完整的解決方案,目前來看尚未能夠媲美的其它開源選擇可使用(Dubbo咱們也知道雖然如今又開始高速迭代,可是因爲其原始定位是RPC框架,理念上仍是有不少不一樣的,組件方面並無Cloud那麼完善)。
除了功能不完善,Cloud令我擔憂的還有一點是(我沒測試過,可是由於看到目前功能的迭代速度對這方面信心不足,誰大規模應用了可否能夠給點數據),這些中間件(服務發現、網關服務、鏈路跟蹤、配置管理)是否是通過壓測,是否能夠知足比較大的壓力,若是隻是實現功能的話,可能會在全面用起來後遇到性能瓶頸,在這個時候恐怕就麻煩了。
Spring家族已是功能強大的龐然大物了,咱們的項目pom中出現幾十個Spring依賴也是屢見不鮮。使用.NET家族的套件也是幾年前的事情了,可是至今我仍是以爲微軟.NET的開發套件無論是MVC仍是ORM仍是RPC方面比Spring的MVC、Data JPA(如今你們都使用Mybatis,Mybatis也仍是太弱了)、Cloud套件在功能和設計的優雅上更勝一籌,但願未來能夠看到Spring針對這些點繼續發力,而且持續打造Dataflow套件,結合K8S打形成一個微服務的OS(各類中間件能夠實現一鍵部署集羣)。另外對於Spring Cloud除了核心功能以外,但願在管理臺方面能夠繼續完善,打造一個一體化(不必定是一個網站,可是至少能夠有權限控制和審計,實現SSO)的管理臺,全面實現微服務部署伸縮、服務治理、數據流程管理、服務全鏈路監控、配置管理等等功能,也期待Spring Cloud和Dataflow雙劍合璧在未來的2到3年定義微服務和以數據爲核心的流處理的架構標準。