江健鋒 徐振平
摘要:Springboot是在Spring基礎(chǔ)上衍生的實用性框架,其目的并不是要替代Spring,而是為了改變Spring框架中煩瑣的配置項而誕生。其特點是更好地和第三方庫結(jié)合進(jìn)行開發(fā),減少大量的配置代碼,達(dá)到開箱即用的目的。而Springboot的最小系統(tǒng)架構(gòu),是在web開發(fā)環(huán)境中,把安全驗證、數(shù)據(jù)交互、錯誤返回等web程序基本要素結(jié)合成一個架構(gòu)系統(tǒng),不隨業(yè)務(wù)內(nèi)容改變。而當(dāng)項目業(yè)務(wù)內(nèi)容發(fā)生改變時,只需要在該最小系統(tǒng)的基礎(chǔ)上,實現(xiàn)業(yè)務(wù)邏輯即可。
關(guān)鍵詞:Java;Springboot;Mybatis;SpringSecurity;Json
中圖分類號:TP311文獻(xiàn)標(biāo)識碼:A
文章編號:1009-3044(2021)04-0062-02
1引言
作為Apache基金的頂級項目,Springboot框架的提出是為了解決傳統(tǒng)Spring框架配置煩瑣的問題,而且配備了一系列諸如SQL、NoSQL數(shù)據(jù)庫、分布式系統(tǒng)等開源項目作為擴展項,堪稱全家桶,是現(xiàn)在絕大多數(shù)互聯(lián)網(wǎng)單系統(tǒng)或分布式系統(tǒng)的必備框架。而傳統(tǒng)的基于Springboot框架的系統(tǒng)只是對Spring全家桶按需使用,沒有明確規(guī)劃,在后期會造成項目的結(jié)構(gòu)混亂,例如:返回數(shù)據(jù)不統(tǒng)一造成前后端聯(lián)調(diào)復(fù)雜;缺乏全局錯誤處理,錯誤日志復(fù)雜,定位問題變得困難。所以,為了排除不同項目業(yè)務(wù)對系統(tǒng)造成的差異性,我們可以構(gòu)建最小系統(tǒng)框架,方便項目的拓建,并且給團隊一個適應(yīng)的編程規(guī)范。
2系統(tǒng)架構(gòu)描述
2.1最小系統(tǒng)架構(gòu)
如圖1,絕大多數(shù)系統(tǒng)架構(gòu)核心必須包含三大模塊,與用戶相關(guān)的業(yè)務(wù)模塊;連接底層的數(shù)據(jù)管理模塊;以及用于中間協(xié)調(diào)系統(tǒng)的基礎(chǔ)功能模塊;就企業(yè)級而非個人的項目來說,除了業(yè)務(wù)模塊不一樣之外,基礎(chǔ)模塊在邏輯功能上是共通的。最小系統(tǒng)架構(gòu),其實就是構(gòu)建系統(tǒng)的安全功能,數(shù)據(jù)交互封裝,全局異常處理,數(shù)據(jù)庫連接等模塊功能,同時避免受業(yè)務(wù)邏輯的干擾,成為脫離業(yè)務(wù)單獨運行的系統(tǒng)。下文將對系統(tǒng)的三個模塊進(jìn)行剖析。
2.2系統(tǒng)采用技術(shù)
2.2.1基礎(chǔ)功能模塊
如圖2所示,對于基礎(chǔ)功能模塊來說,有三個功能是不可或缺的,分別是安全驗證,前后端數(shù)據(jù)交互,異常處理,下文將對這個功能逐一說明。
1)全局異常處理
眾所周知,用戶的輸入不可能完全按照程序員的意愿來進(jìn)行;同時,程序員無法對程序運行的各種情況考慮的面面俱到,因此,運行時出現(xiàn)異?;蛘咤e誤是很難避免的。如果把程序內(nèi)部響應(yīng)的錯誤直接返回給用戶,會給用戶造成疑惑。綜上,我們應(yīng)該對程序所有可能發(fā)生的錯誤都進(jìn)行捕捉,把錯誤信息封裝,挑選用戶能理解的部分進(jìn)行返回,提高用戶體驗度,全局異常處理就顯得十分重要。
全局異常處理應(yīng)用的是SpringMVC提供的組件增強注解@ControllerAdvice,以及捕捉系統(tǒng)異常的注解@ExceptionHandler來進(jìn)行全局聲明,對于不同的類型,可以返回不同的消息。對應(yīng)部分代碼如下:
@ControllerAdvice
@Slf4j
publicclassGlobalExceptionHandler {
// 捕獲運行時異常
@ExceptionHandler(RuntimeException.class)
@ResponseBody
publicJsonResulthandlerBusinessException(RuntimeException ex) {
log.error("錯誤: {}"ex.getErrMsg());
ex.printStackTrace();
returnJsonResult.failure(ex);
}
}
2)前后端數(shù)據(jù)封裝
JSON(JavaScript Object Notation)是一種廣泛應(yīng)用的數(shù)據(jù)交換格式,其簡潔而又清晰的層次結(jié)構(gòu)讓其逐漸取代XML稱為前后端格式交互的主要格式[1]。在Springboot的核心jar包spring-boot-starter-web中,默認(rèn)封裝了JSON工具包,當(dāng)前端對后臺進(jìn)行請求的時候,可以設(shè)置返回的文本格式為JSON。但是JSON簡單清晰的特點只體現(xiàn)在數(shù)據(jù)傳輸方面,Springboot框架并沒有對返回的數(shù)據(jù)內(nèi)容格式上做任何要求,即返回的JSON中,可以是一串文字,也可以是某種層次結(jié)構(gòu)。
根據(jù)計算機網(wǎng)絡(luò)傳輸?shù)闹R,我們知道,當(dāng)系統(tǒng)正常運轉(zhuǎn)并返回時,計算機狀態(tài)碼為200;服務(wù)器內(nèi)部執(zhí)行錯誤狀態(tài)碼會返回5xx來代表不同的錯誤狀態(tài)。我們可以結(jié)合全局異常處理的內(nèi)容,不管用戶傳輸給我們的數(shù)據(jù)是什么,只要程序能夠接收,http攜帶的狀態(tài)碼都返回200,我們可以把程序的錯誤或者程序員自定義的錯誤內(nèi)容封裝到JSON中,所以我們必須有一個代表狀態(tài)碼的code字段和中文解析message字段。除了錯誤返回之外,程序必須能夠正常執(zhí)行并返回數(shù)據(jù),返回數(shù)據(jù)的數(shù)據(jù)是一個對象,我們用data字段來表示。最終,前后端通用的JSON文本格式為。
{
code:狀態(tài)碼(數(shù)字),
msg:中文解析(字符串),
data:程序返回的數(shù)據(jù)(對象)
}
3)安全模塊
本文使用的安全模塊采用的是SpringSecurity框架,SpringSecurity是一款企業(yè)級的權(quán)限認(rèn)證授權(quán)框架,作為Spring全家桶的一員,和Springboot具有很好的契合性。同時,安全模型的結(jié)構(gòu)設(shè)計采用RBAC(Role-Based Access Control 基于角色的訪問控制)模型設(shè)計。文獻(xiàn)2通過提出一致性準(zhǔn)則、安全性準(zhǔn)則和可用性準(zhǔn)則分別證明了RBAC模型安全特性與該三項準(zhǔn)則安全特性相一致,證明了RBAC的可靠性[2]。
2.2.2 數(shù)據(jù)管理模塊
項目必須考慮后期的擴展性,而隨著業(yè)務(wù)數(shù)據(jù)量的激增,框架對數(shù)據(jù)的承受能力必須有很好的把握,或者說要有足夠的擴展性,在后期進(jìn)行擴展。作為一個抽象的單系統(tǒng),最小系統(tǒng)架構(gòu)來說,最大化地減少系統(tǒng)負(fù)擔(dān)并且有足夠的擴展性,都是不可或缺的。圖3是數(shù)據(jù)管理模塊的抽象結(jié)構(gòu)圖,其中不包含任何數(shù)據(jù)分析的模塊,只做數(shù)據(jù)管理功能。
1)ORM框架
如圖3所示,ORM(Object Relational Mapping,對象關(guān)系映射)框架,用于實現(xiàn)面向?qū)ο笳Z言里不同類型系統(tǒng)的數(shù)據(jù)之間的轉(zhuǎn)換[3]。在Java語言中,JDK(Java development kit Java開發(fā)工具包)提供了數(shù)據(jù)庫映射數(shù)據(jù)的API,作為數(shù)據(jù)返還,ORM作為框架接收;底層需要數(shù)據(jù)庫驅(qū)動,為了提高數(shù)據(jù)庫復(fù)用率,提高系統(tǒng)吞吐率,我們可以使用數(shù)據(jù)庫連接池來進(jìn)行并發(fā)優(yōu)化。
基于Java語言的開源ORM框架有Hibernate和Mybatis,前者是全自動化的集成框架,包括數(shù)據(jù)映射,數(shù)據(jù)庫建表,增刪改查語言的自動生成;而Mybatis則是一個半自動框架,提供了大量接口供用戶調(diào)用,這種半自動化給了用戶很大的自由性,所以最小系統(tǒng)框架選擇使用Mybatis框架。
2)數(shù)據(jù)庫連接池
著名的數(shù)據(jù)庫連接池開源組件有Druid,c3p0,dbcp。本系統(tǒng)采用的數(shù)據(jù)庫連接池是阿里開源的Druid,相比于其他兩款數(shù)據(jù)庫連接池,Druid提供了強大的擴展和監(jiān)控功能,在適應(yīng)大數(shù)據(jù)方面,容錯率和性能上都相當(dāng)?shù)某錾?/p>
3總結(jié)
本文從框架的層面,分析和綜合了絕大多數(shù)程序架構(gòu)的特點和共性,抽象化地提出了互聯(lián)網(wǎng)應(yīng)用最小系統(tǒng)架構(gòu)的概念。其特點是抽離了業(yè)務(wù)邏輯實現(xiàn)系統(tǒng)運行的最小化,同時保證了系統(tǒng)的可擴展性。
參考文獻(xiàn):
[1] 百度.JSON[EB/OL].[2020-05-24].https://baike.baidu.com/item/JSON,2015-5-11.
[2] 熊厚仁,陳性元,張斌,等.基于RBAC的授權(quán)管理安全準(zhǔn)則分析與研究[J].計算機科學(xué),2015,42(3):117-123.
[3] 百度.ORM 對象關(guān)系映射[EB/OL]. [2020-05-24].https://baike.baidu.com/item對象關(guān)系映射/311152?fromtitle=ORM&fromid=3583252&fr=aladdin.
【通聯(lián)編輯:代影】