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