江健鋒 徐振平



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