科技改變生活 · 科技引領未來
微服務本身是一種架構風格,也是指導組織構建軟件的一系列最佳實踐集合。然而,業務團隊在拆分應用后,會產生更多細粒度服務,并面臨這些服務在分布式網絡環境中的復雜性。如何專心實現業務邏輯而不陷入微服務架構的技術細節,對開發者來說是一大難題。本章將
微服務本身是一種架構風格,也是指導組織構建軟件的一系列最佳實踐集合。然而,業務團隊在拆分應用后,會產生更多細粒度服務,并面臨這些服務在分布式網絡環境中的復雜性。如何專心實現業務邏輯而不陷入微服務架構的技術細節,對開發者來說是一大難題。
本章將介紹腳手架的概念,并介紹JVM環境下在技術成熟度、架構完整性、生態活躍度等方面都占據優勢的微服務腳手架項目:SpringBoot。
腳手架介紹
什么是腳手架
腳手架是一種用在建筑領域的輔助工具,或者說是為了保證各施工過程順利進行而搭設的工作平臺,有興趣的讀者可自行查看維基百科上的定義。
對應到軟件工程領域,腳手架可以解釋為幫助開發人員在開發過程中使用的開發工具、開發框架,使用腳手架你無須從頭開始搭建或者編寫底層軟件。下面的“腳手架”定義來自Stack Overflow,更加偏向于應用服務框架使用的一種編程思想或者說編程范式(供參考)。
腳手架:是一種元編程的方法,程序員編寫一份規格說明書(Specification),用來描述怎樣去使用數據庫,然后由編譯器腳手架根據這份規格說明書生成相應的代碼,進行增、刪、改、查等數據庫的操作,在腳手架上更高效地建造出強大的應用。
為什么需要腳手架
為什么軟件開發需要腳手架呢?我們通過軟件開發的一些基本原則看一下腳手架對軟件工程的重要作用。
● 復用原則(Reuse Principle):現在我們推崇的是極致化的編程體驗,縮短的開發時間、大量的開發任務、支持需求的變更、高頻率的應用服務交付,這些都給軟件開發人員帶來了前所未有的壓力。其中,軟件復用技術被公認為解決這些問題的行之有效的方法。從計算機軟件編程的發展歷史來看,從面向過程的編程語言到面向對象的高級編程語言的廣泛使用,是軟件復用技術進步的體現。從對象的復用到更大的組件復用,再到如今的框架的復用、服務的復用,都是在利用他人的優秀成果來放大你的工作價值。當一個新手使用腳手架時,對于一個具體問題,可以套用現成的解決方案加以擴展。使用腳手架的應用,僅需通過簡單的注解和配置就可以具備健康狀態檢查、生產環境就緒、可觀測等基本服務能力。對于一個業務邏輯問題,可以復用已有的邏輯,一步步迭代,敏捷開發。
● DRY原則(Don't Repeat Yourself):DRY原則直譯過來就是“不要重復你自己”。這一原則和復用原則類似,強調盡量在項目中減少重復的代碼行、重復的方法、重復的模塊。其實,軟件設計原則和模式最本質的思想都是“消除重復”。
我們經常提到的重用性和可維護性其實是基于減少重復這一簡單而重要的思想的。DRY原則意味著系統內的每一個部件都應該是唯一的,并且是具有明確含義的(不模糊的)。我們可以通過應用職責單一、接口隔離等原則盡量拆分系統、模塊、類和方法,使每一個部件都是職責明確并且可重復使用的。
● 開閉原則(Open Close Principle):開閉原則中的“開”就是指對功能的擴展是開放的,“閉”是指對于原有代碼的修改是封閉的。通俗一點講,軟件系統通常是由各種模塊組成的,軟件系統在增加一項新的功能時,應該在不修改現有代碼的基礎上操作。實現開閉原則的關鍵就是“抽象”,從微觀的角度講,開閉原則適用于一個業務模型的類的設計,把系統內的所有可能行為抽象為一個抽象底層,在這個抽象底層中規定需要提供的方法接口,具體實現類通過集成、代理、委托的方式,擴展實現新的行為或者新的功能。從宏觀的角度講,我們說開閉原則就是將公共模塊、開發約定、最佳技術實踐經過共享、提煉沉淀到封閉的底層技術基座;而將變化頻繁的業務模塊、獨特的功能邏輯通過繼承、組合和集成的方式實現對擴展的開放。
不要重新造輪子
不要重新造輪子(Stop Reinventing The Wheel),這個原則可以說是軟件開發里的“金科玉律”。在實際的軟件工程場景中,腳手架的使用正是為了我們避免重新造輪子。如果你不借助已有框架或者工具,不僅不會提升開發效率,還會將自己陷入重新造輪子的風險中。這里舉一個發生在本人參與的實際項目中的血淋淋的案例。
我們在一個服務治理項目中需要在數據持久層實現一個通用的數據存儲接入組件,初衷是降低應用接入不同數據存儲引擎的復雜性,屏蔽使用者對不同持久層的感知差異,使開發者通過簡單的配置就能適配不同的數據類型。另外,因為期望完全掌握對持久層的控制,以及實現深度定制化的數據轉換功能,所以我們并沒有使用Spring框架,而是走上了自研持久層的道路。如下圖所示是自研持久層的UML框架圖。
我們分別對接了MySQL、MongoDB、OpenTSDB、Hbase等數據源。系統從架構設計到落地花費了大概兩個月的時間,還不包括后期的測試、對接、調試、修復Bug至少一個月的磨合期。然而,由于人員、經驗、項目周期等各種因素,最終自研持久層框架的效果并沒有達到預期,后期在與業務對接的過程中還出現了各種技術和業務適配問題。
在經過一番技術調研后,我們決定逐漸使用Spring Data替代原有的自研持久層框架。經過項目的實踐后,我們發現在業務的需求滿足性、易用性、開發效率、業務穩定性等各個方面,Spring Data都具備壓倒性的優勢,它不僅可以完全滿足業務和技術上的需求,而且可以簡化我們的開發工作、顯著提升工作效率。二者的復盤對比如下表所示。
Spring Data項目通過使用對象的語義可以讓我們更方便地操作不同類型的數據。它將應用的骨架部分通過“抽象”提取出來,形成了一套系統的開發范式和行為模式。Spring Boot腳手架也為自定義的復雜查詢、修改操作提供了擴展的Repository類和自動化配置,使添加定制化的擴展方法更加輕松方便。我們只需要理解Spring為我們提供的操作API接口,就可以實現復雜的查詢等業務邏輯。
Spring Data將我們的數據持久層框架進行了進一步的封裝,開發者通過簡單的注解,就可以實現將不同類型數據放到不同持久層集合的存儲映射操作。可以說,腳手架工程可以為開發人員屏蔽繁雜的數據存儲引擎底層差異和具體工作細節,提升了開發效率,降低了開發難度。除非你是這個領域的專家,或者沒有現成的軟件腳手架能夠滿足你的需求,否則請停止“愚蠢地重復造輪子”的行為。
常用腳手架
下面列舉一些軟件開發中經常使用的腳手架,看一下如何通過腳手架提高我們的開發效率。
Vue框架
對于前端開發人員來說,Vue無疑是一套簡單的、易于使用的構建用戶界面的前端腳手架。根據Vue的官網說法,Vue是一套構建用戶界面的漸進式的Javascript框架。與其他重量級框架不同的是,Vue采用自底向上的增量開發的設計,Vue的目標是通過盡可能簡單的API實現響應的數據綁定和組合的視圖組件。
vue-cli腳手架構建工具,可用于快速搭建大型單頁應用。該工具提供“開箱即用”的構建工具配置,帶來了現代化的前端開發流程。
只需幾分鐘即可創建并啟動一個帶熱重載、保存時靜態檢查及可用于生產環境的構建配置的項目:
要創建基于Webpack模板的項目,首先我們選定目錄,然后在命令行中把目錄轉到選定的目錄即可,可以使用下面的命令:
Maven
Maven是一個跨平臺的項目管理工具,是服務于Java平臺的項目構建、依賴管理、項目信息管理工具。同時使用Maven可以規范項目骨架及包層次結構、命名配置文件、生成代碼原型等。
Maven提供了archetype插件來幫助開發人員快速勾勒出項目的骨架,要使用本地Maven倉庫中的腳手架創建新項目,直接執行如下Maven命令,根據提示依次輸入groupId、version、package信息即可:
Maven自動化構建簡化了開發人員手動構建工程的過程,規范了項目的構建過程。Maven自動化構建流程如下圖所示。
Netty
Netty是JBoss提供的一個Java開源框架。Netty提供異步的、事件驅動的網絡應用程序框架和工具,用以快速開發高性能、高可用性的網絡服務器和客戶端程序。在Java世界中還沒有Netty框架的時候,Java自帶的NIO非常復雜,并且還會出現Epoll Bug(代碼缺陷),這個Bug會觸發Selector空輪詢,導致CPU的使用率達到100%。Netty的解決方式是,在N次空輪詢后自動關閉Selector,避免了原生NIO的空輪詢問題。而且Netty有很好的線程模型和內存管理框架,如下圖所示是Netty Reactor工作架構圖。
Java EE
Java EE的全稱是Java 2 Platform Enterprise Edition,它是在SUN公司領導下,多家公司參與共同制定的企業級分布式應用程序開發規范。
Java EE技術由一系列技術規范和技術組件組成,包括RESTfulWeb Server(JAX-RS)、Jersey Rest框架、Java Servelt、JMS、EJB等。通常可以把滿足這些標準的業務應用部署在Tomcat、JBoss等Web服務器上運行。
DropwizardDropwizard只需通過簡單配置就能讓你的類提供RESTful服務。
Dropwizard是一個微服務框架,是各項技術的一個集成封裝,它包含以下組件:
● 嵌入式Jetty:一個應用程序被打包成一個jar文件,并使用自己嵌入的Jetty容器。除此之外,無任何其他war文件和外部Servlet容器。
● JAX-RS:Jersey,用來寫基于REST的Web服務。
● JSON:REST服務數據傳遞處理全部用JSON,使用Jackson庫。
● 日志:使用Logback和SLF4。
● 數據庫:使用Hibernate集成ORM框架。
● 指標:使用Metrics作為指標度量工具,在Java代碼中嵌入Metrics代碼,可以方便地對業務代碼的各個指標進行監控,同時Metrics能夠很好地跟Ganlia、Graphite結合,方便地提供圖形化接口。
在微服務架構領域,Dropwizard可以說是早期腳手架的一個代表,然而Spring Boot青出于藍而勝于藍,在Spring強大和成熟的技術生態下,Spring Boot展現出來的特性更加優雅,也更加契合當前微服務架構的理念,下一節我們將正式開始Spring Boot之旅。
本文給大家講解的內容是微服務架構深度解析:什么是軟件開發腳手架? 為什么需要腳手架?常用的腳手架有哪些?
高書