黃麗萍
(廣西盈賽數(shù)字科技有限公司 廣西 南寧 530011)
在信息化時(shí)代下,互聯(lián)網(wǎng)已經(jīng)滲透到了人們生活、生產(chǎn)的方方面面,而人們生活、生產(chǎn)中的大量線(xiàn)上需求,如網(wǎng)上購(gòu)物、支付、打車(chē)、工作等,都需要通過(guò)Web類(lèi)型的軟件程序來(lái)實(shí)現(xiàn),這會(huì)使Web軟件程序承擔(dān)大量的客戶(hù)訪(fǎng)問(wèn)及業(yè)務(wù)運(yùn)行壓力。而且當(dāng)前人們對(duì)于Web軟件程序的功能及效率需求也越來(lái)越高,這就給Web軟件程序的框架設(shè)計(jì)提出了更高要求。只有高效、安全且擴(kuò)展靈活的程序框架結(jié)構(gòu),才能保證Web軟件程序的有序開(kāi)發(fā)和順暢運(yùn)行[1]。
自20世紀(jì)80年代開(kāi)始,程序的開(kāi)發(fā)與設(shè)計(jì)日益廣泛和普遍,最初由于程序的功能需求單一,所以程序的開(kāi)發(fā)與設(shè)計(jì)采用的都是單層結(jié)構(gòu),國(guó)內(nèi)外均是如此。此后,隨著計(jì)算機(jī)軟硬件的迭代發(fā)展以及程序功能需求的增加,單層結(jié)構(gòu)的程序開(kāi)發(fā)與設(shè)計(jì)逐漸無(wú)法再適應(yīng)現(xiàn)實(shí)的需要,于是便出現(xiàn)了多層結(jié)構(gòu)[2]。分層設(shè)計(jì)最先開(kāi)始在國(guó)外得到了廣泛應(yīng)用,進(jìn)入21世紀(jì)后在我國(guó)也快速普及起來(lái),現(xiàn)如今已經(jīng)成為主要的程序開(kāi)發(fā)設(shè)計(jì)方式[3]。
隨著信息化設(shè)備以及互聯(lián)網(wǎng)的廣泛普及,人們對(duì)于各種程序應(yīng)用的需求性、依賴(lài)性也越來(lái)越強(qiáng),程序開(kāi)發(fā)設(shè)計(jì)逐漸成為一項(xiàng)關(guān)鍵和重要的課題,不論是程序語(yǔ)言、輔助技術(shù)還是框架結(jié)構(gòu)都在不斷改進(jìn)、完善與升級(jí)[4]。如在最初的程序開(kāi)發(fā)設(shè)計(jì)中,由于技術(shù)設(shè)備的限制以及功能需求較為單一,所以程序的框架結(jié)構(gòu)是扁平化的,這足以滿(mǎn)足程序開(kāi)發(fā)設(shè)計(jì)、運(yùn)行維護(hù)的需要。但是隨著技術(shù)設(shè)備性能的提升以及功能需求的增加,程序的規(guī)模變得越來(lái)越大,結(jié)構(gòu)越來(lái)越復(fù)雜,扁平化的程序框架結(jié)構(gòu)難以再適應(yīng)程序開(kāi)發(fā)設(shè)計(jì)的要求,容易出現(xiàn)結(jié)構(gòu)混亂、組織無(wú)序以及維護(hù)升級(jí)復(fù)雜等一系列難題。分層設(shè)計(jì)是與扁平化框架結(jié)構(gòu)相對(duì)應(yīng)的一種程序開(kāi)發(fā)設(shè)計(jì)框架模式,它打破了扁平化的框架結(jié)構(gòu)體系,使程序開(kāi)發(fā)設(shè)計(jì)的組織更加井然有序[5]。如它將程序的前端與后端相分離,相互之間通過(guò)專(zhuān)門(mén)的接口通道連接,彼此協(xié)調(diào)、配合,完成程序的整體運(yùn)行,實(shí)現(xiàn)相應(yīng)的功能供給。最基本的分層設(shè)計(jì)是雙層模式,它概括性地將程序的前端與后端分離開(kāi)來(lái),除此還有三層模式、四層模式以及五層和多層模式,其不同之處在于,對(duì)后端進(jìn)行了更加詳細(xì)的層次劃分,如將數(shù)據(jù)層和業(yè)務(wù)層進(jìn)一步分離開(kāi)來(lái)。
分層設(shè)計(jì)的主要特征是改變了原始的扁平化程序框架結(jié)構(gòu),顯著地增強(qiáng)了程序開(kāi)發(fā)設(shè)計(jì)的組織性和有序性[6]。通過(guò)分層,不同層次的程序開(kāi)發(fā)設(shè)計(jì)只需要專(zhuān)注其本身應(yīng)當(dāng)實(shí)現(xiàn)的功能,不需要考慮其他功能如何實(shí)現(xiàn),如在前端的顯示層、交互層中,只需要考慮如何向用戶(hù)展示充分的信息,如何引導(dǎo)用戶(hù)提交其所需的功能需求等,并向用戶(hù)反饋結(jié)果,至于反饋結(jié)果是如何得出的,它則不需要考慮。而在后端的業(yè)務(wù)層中,就只需要考慮如何處理用戶(hù)的需求,不需要考慮如何與用戶(hù)交互,數(shù)據(jù)層的功能則更加純粹,只需要存儲(chǔ)數(shù)據(jù),提供數(shù)據(jù)的查詢(xún)、更新等功能即可。需要注意的是,在分層設(shè)計(jì)中,雖然程序的各個(gè)層次具有明確的界限劃分,但是它們依舊是一個(gè)嚴(yán)密的邏輯整體。
除了可以使程序的開(kāi)發(fā)設(shè)計(jì)更加井然有序之外,分層設(shè)計(jì)的主要優(yōu)勢(shì)還有以下幾點(diǎn):(1)程序的管理、維護(hù)更加方便,穩(wěn)定性更強(qiáng)。由于分層設(shè)計(jì)將不同的功能層劃分開(kāi)了,只是存在邏輯上的聯(lián)系,所以如果需要對(duì)層序的某一層進(jìn)行管理、維護(hù),不會(huì)涉及和影響到其他層,一般情況下只需要對(duì)本層做出調(diào)整,便可以使程序穩(wěn)定運(yùn)行[7];(2)程序的拓展性更強(qiáng),如果需要的話(huà),可以隨時(shí)在業(yè)務(wù)層中進(jìn)行程序的功能拓展和優(yōu)化,不會(huì)影響到其他層的運(yùn)行;(3)分層設(shè)計(jì)能夠大大提高程序開(kāi)發(fā)設(shè)計(jì)的效率,不同分層的開(kāi)發(fā)設(shè)計(jì)工作可以同時(shí)進(jìn)行,加快程序開(kāi)發(fā)設(shè)計(jì)的周期,不同層之間只需要提前協(xié)商、預(yù)留好接口即可;(4)一些功能模塊可以重復(fù)性使用,這有助于加快開(kāi)發(fā)設(shè)計(jì)效率,降低開(kāi)發(fā)設(shè)計(jì)成本。
在基于Java的Web軟件程序框架分層設(shè)計(jì)中,前后端分離部署是最基礎(chǔ)的結(jié)構(gòu)模式,它將前端的服務(wù)器與后端的服務(wù)器分離,形成雙層結(jié)構(gòu)。
前后端分離部署結(jié)構(gòu)見(jiàn)圖1。
前后端分離部署結(jié)構(gòu)中需注意以下幾點(diǎn):(1)前端程序運(yùn)行在前端服務(wù)器;(2)后面程序運(yùn)行在后端服務(wù)器;(3)用戶(hù)端通過(guò)瀏覽器向前端服務(wù)器進(jìn)行頁(yè)面請(qǐng)求;(4)前端服務(wù)器返回請(qǐng)求Web頁(yè)面;(5)Web頁(yè)面通過(guò)AJAX向后端服務(wù)器發(fā)出數(shù)據(jù)接口請(qǐng)求;(6)后端服務(wù)器返回?cái)?shù)據(jù)給Web進(jìn)行數(shù)據(jù)加載顯示。
基于Web的軟件一般都由前端交互程序和后端服務(wù)程序組成,前端與后端以一個(gè)怎么樣的模式協(xié)同工作是一個(gè)基于Web軟件程序框架必須解決的問(wèn)題。早期基于Web的框架大多是前端和后端代碼交織在一起開(kāi)發(fā),由此帶來(lái)許多問(wèn)題,開(kāi)發(fā)效率低下,代碼易被污染,排查錯(cuò)誤及后期維護(hù)困難,擴(kuò)展功能不靈活。尤其是如果前端和后端是不同程序員開(kāi)發(fā),程序出問(wèn)題后,還有可能發(fā)生互相推卸責(zé)任的問(wèn)題,前后端不分離,也就不存在高效、靈活的技術(shù)框架,所以一個(gè)優(yōu)秀的基于Web技術(shù)框架的開(kāi)發(fā)模式必須采用前后端分離開(kāi)發(fā)模式。
基于前后端分離開(kāi)發(fā)模式,可以得到上面的前后端分離總署結(jié)構(gòu)。因?yàn)榍岸顺绦蚝秃蠖顺绦蚴仟?dú)立的,所以可以將兩個(gè)程序分開(kāi)部署運(yùn)行,這樣部署有以下幾點(diǎn)優(yōu)勢(shì)。
(1)前后端程序更新可互不影響。當(dāng)某一端的程序需要更新時(shí),只需要暫停要更新的目標(biāo)程序,而不會(huì)影響到另一個(gè)程序運(yùn)行。
(2)用戶(hù)體驗(yàn)更友好。一般前端使用的是靜態(tài)頁(yè),程序比較穩(wěn)定,后端因?yàn)橐惺艽罅空?qǐng)求處理及數(shù)據(jù)庫(kù)交互比較容易發(fā)生異常,前后端程序分離運(yùn)行后,在后端發(fā)生異常錯(cuò)誤時(shí),用戶(hù)還能瀏覽網(wǎng)頁(yè),不至于出現(xiàn)諸如404、505的錯(cuò)誤頁(yè)面。
(3)并行開(kāi)發(fā),效率高。前端和后端程序分開(kāi)運(yùn)行,前后端開(kāi)發(fā)互不影響,只要按照約定的接口就能做到自己調(diào)試程序,這樣就能實(shí)現(xiàn)并行開(kāi)發(fā)。
(4)減輕后端服務(wù)的負(fù)載壓力。如果前后端不分離,服務(wù)器勢(shì)必要處理前端請(qǐng)求和后端請(qǐng)求,如果用戶(hù)請(qǐng)求量大的話(huà),服務(wù)器容易過(guò)載,分離部署到不同服務(wù)器上,后端服務(wù)器負(fù)載壓力就可以大大減輕。
(5)可以更好地保護(hù)后端服務(wù)器。當(dāng)后端服務(wù)器壓力超負(fù)荷時(shí),會(huì)給數(shù)據(jù)庫(kù)造成影響,所以后端服務(wù)顯得尤為重要。前后端分開(kāi)部署運(yùn)行后,用戶(hù)訪(fǎng)問(wèn)時(shí)首先請(qǐng)求的是前端服務(wù),在前端用戶(hù)請(qǐng)求數(shù)超負(fù)載時(shí),我們便可以在前端服務(wù)器做應(yīng)急措施,不至于讓后端程序直接受到攻擊。
為了完善分層設(shè)計(jì),在基于Java的Web軟件程序后端服務(wù)器中,其不同的業(yè)務(wù)模塊需要相互獨(dú)立,并通過(guò)maven將不同的業(yè)務(wù)模塊進(jìn)行粘合打包,使程序的組織更加有序。
程序包模型結(jié)構(gòu)見(jiàn)圖2。
程序包模型結(jié)構(gòu)說(shuō)明:(1)后端框架使用spring boot技術(shù),主服務(wù)僅有一個(gè)啟動(dòng)服務(wù)的功能,對(duì)此我們稱(chēng)之為殼;(2)通過(guò)maven將多個(gè)業(yè)務(wù)模塊jar包粘合到殼中再進(jìn)行打包。
場(chǎng)景:市場(chǎng)人員要求軟件按照客戶(hù)購(gòu)買(mǎi)的功能提供對(duì)應(yīng)的功能接口服務(wù),并且軟件要部署到客戶(hù)的服務(wù)器上去。該軟件業(yè)務(wù)較為復(fù)雜,且業(yè)務(wù)模塊相對(duì)獨(dú)立,不互相影響。
如果按常規(guī)做法,把所有業(yè)務(wù)模塊放一起開(kāi)發(fā)打包,雖然也可以使用一些方法來(lái)限制用戶(hù)只能使用購(gòu)買(mǎi)的功能,例如通過(guò)攔截器做權(quán)限判斷,但是如果某些軟件業(yè)務(wù)包依賴(lài)包含有個(gè)別大文件的工具包時(shí),而且用戶(hù)非未購(gòu)買(mǎi)這些服務(wù)時(shí),軟件包就顯得不這么精巧,也就是說(shuō)里面存在了冗余包。上面的程序包模式結(jié)構(gòu)就解決了這個(gè)問(wèn)題,把業(yè)務(wù)模塊解耦,按業(yè)務(wù)功能劃分成獨(dú)立的業(yè)務(wù)包,主程序服務(wù)只提供啟動(dòng)服務(wù),當(dāng)客戶(hù)需求定下后,只要把需要的包丟到殼里面去打包就可以有相應(yīng)的功能服務(wù)[8]。這樣操作的優(yōu)點(diǎn)有如下幾點(diǎn)。
(1)采用分包結(jié)構(gòu)后,就能按客戶(hù)購(gòu)買(mǎi)功能提供功能服務(wù)市場(chǎng)要求,不需要再寫(xiě)程序代碼控制,從結(jié)構(gòu)上就實(shí)現(xiàn)了這點(diǎn)需求,從實(shí)現(xiàn)方法來(lái)說(shuō)是代價(jià)最小、最簡(jiǎn)單的方法。
(2)擴(kuò)展性強(qiáng),高度解耦。業(yè)務(wù)包之間都是獨(dú)立的,不互相影響,要增減功能都非常好控制,配置靈活。
(3)打包精準(zhǔn),不存在冗余包。
(4)開(kāi)發(fā)效率高。如果所有業(yè)務(wù)包都做成一體,開(kāi)發(fā)時(shí),Java項(xiàng)目啟動(dòng)時(shí)會(huì)很慢,在調(diào)試某一個(gè)業(yè)務(wù)功能時(shí),顯然降低了工作的效率。業(yè)務(wù)包解耦后,開(kāi)發(fā)什么功能就依賴(lài)哪個(gè)業(yè)務(wù)包,程序啟動(dòng)速度會(huì)快些,從而提升工作的效率。
(5)縮小測(cè)試范圍。很多程序員在項(xiàng)目修改某個(gè)業(yè)務(wù)功能時(shí),如果只做針對(duì)該業(yè)務(wù)的測(cè)試,程序發(fā)布后,用戶(hù)在使用時(shí)可能會(huì)出現(xiàn)其他功能問(wèn)題,跟蹤后就發(fā)現(xiàn)另一個(gè)包的程序改動(dòng)了,但一起打包發(fā)布了。出現(xiàn)這種情況后,測(cè)試人員不得不每次都對(duì)整體進(jìn)行全流程測(cè)試。采用分包模式后,在打包后把對(duì)應(yīng)的業(yè)務(wù)模塊生成到外包lib目錄下,修改了哪個(gè)業(yè)務(wù)模塊就替換掉哪個(gè)業(yè)務(wù)模塊包,測(cè)試時(shí)也可以只針對(duì)該業(yè)務(wù)測(cè)試,這樣就不用每次都做全流程測(cè)試了。
在基于Java的Web軟件程序中,其服務(wù)層也需要進(jìn)行合理的分層設(shè)計(jì),以使業(yè)務(wù)的開(kāi)發(fā)、組織、調(diào)用更加有序。
服務(wù)層模塊結(jié)構(gòu)見(jiàn)圖3。
服務(wù)層模塊結(jié)構(gòu)說(shuō)明:(1)對(duì)外接口調(diào)用對(duì)應(yīng)的業(yè)務(wù)服務(wù)模塊的服務(wù)功能;(2)業(yè)務(wù)服務(wù)模塊書(shū)寫(xiě)邏輯;(3)單表服務(wù)模塊僅操作做對(duì)應(yīng)單表,供業(yè)務(wù)服務(wù)模塊按業(yè)務(wù)邏輯調(diào)用;(4)單表服務(wù)模塊都是基于MyBatis-Plus搭建的。
該結(jié)構(gòu)有兩個(gè)最大的特點(diǎn),一是底層采用了MyBatis-Plus,二是對(duì)服務(wù)層的再分層。
(1)MyBatis-Plus(opens new window)(簡(jiǎn)稱(chēng)MP)是一個(gè)MyBatis(opens new window)的增強(qiáng)工具,在MyBatis的基礎(chǔ)上只做增強(qiáng)不做改變。MyBatis-Plus數(shù)據(jù)庫(kù)操作功能非常強(qiáng)大,只需要調(diào)用該工具的方法就能對(duì)數(shù)據(jù)表進(jìn)行讀寫(xiě),開(kāi)發(fā)速度可得到極大提升。
(2)對(duì)服務(wù)層的再分層。一般基于service層(服務(wù)層)為單層結(jié)構(gòu),設(shè)計(jì)成雙層原因就在于采用了MyBatis-Plus。MyBatis-Plus決定了服務(wù)層是單表服務(wù)模塊。MyBatis-Plus的數(shù)據(jù)庫(kù)操作接口函數(shù)都是針對(duì)單表的操作,即能發(fā)揮單表服務(wù)的優(yōu)勢(shì)又能適用于復(fù)雜的業(yè)務(wù),需把服務(wù)層進(jìn)行再分層,按數(shù)據(jù)表建立相應(yīng)的單表服務(wù)模塊,按業(yè)務(wù)劃分業(yè)務(wù)服務(wù)模塊,然后由業(yè)務(wù)模塊按照業(yè)務(wù)邏輯調(diào)用單表服務(wù)模塊,這樣模塊接口條理清晰,數(shù)據(jù)表操作服務(wù)簡(jiǎn)單輕巧,抽象度高,可被不同的業(yè)務(wù)服務(wù)模塊復(fù)用。
隨著軟硬件技術(shù)的發(fā)展,功能需求的不斷提高,傳統(tǒng)的單層框架程序開(kāi)發(fā)模式已經(jīng)不能再適應(yīng)如今的需要。應(yīng)當(dāng)積極探索與合理應(yīng)用好分層設(shè)計(jì),用組織更加有序的框架,來(lái)進(jìn)行程序的設(shè)計(jì)與開(kāi)發(fā),這樣才能提高程序設(shè)計(jì)與開(kāi)發(fā)的質(zhì)量,增強(qiáng)設(shè)計(jì)與開(kāi)發(fā)的規(guī)范性,加快設(shè)計(jì)與開(kāi)發(fā)速度,降低設(shè)計(jì)與開(kāi)發(fā)成本。本文對(duì)基于Java的Web軟件程序框架分層設(shè)計(jì)進(jìn)行了探討,分析了分層設(shè)計(jì)的實(shí)際應(yīng)用及其與相關(guān)程序開(kāi)發(fā)技術(shù)的融合,希望能進(jìn)一步促進(jìn)分層設(shè)計(jì)的推廣和應(yīng)用。