閏四洋 胡昌平 卞德志 左剛



摘要:微服務的出現大大降低了Web系統的耦合度,但隨著微服務的規模不斷增大,其運行日志的數量不斷增多、內容也更加雜亂,給用戶查看日志數據帶來困難,因此對微服務的運行日志進行處理具有重要意義。文章介紹的微服務日志系統,采用SpringBoot開發,利用非關系性數據庫MongoDB作為日志系統的存儲庫,提供日志管理的相關接口,從而極大地提高了對日志數據管理和應用的效率。
關鍵詞:微服務;日志數據;查詢;SpringBoot;處理;MongoDB
中圖分類號:TP311 文獻標識碼:A 文章編號:1006-8228(2020)08-69-04
0 引言
當前微眼務的治理框架大多采用SpringCloud,如果把基于微服務架構的系統比作是一棟大樓,鋼筋混凝土結構可以說是SpringCloud,那么最基礎的磚頭瓦塊就是SpringBoot。所謂的獨立的微服務是用SpringBoot開發的,作為一套全新的框架,繼承了Spring所有的功能并青出于藍;SpringBoot的約定大于配置的核心思想,默認幫用戶做了許多基礎設置,很多SpringBoot應用只需要很少的Spring配置就可以正常運行。同時,SpringBoot也提供了很多應用集成包,支持絕大多數開源軟件,讓用戶可以以很低的成本去集成其他主流開源軟件[2]。
MongoDB是一個基于文檔模型的,支持索引、復制、事務的數據庫,是目前比較流行的非關系型數據庫[1]。微服務在運行過程中,由于用戶訪問、計劃任務等操作會產生大量日志,而MongoDB數據庫系統就非常適合管理這些日志。首先,它易擴展,靈活的文檔數據模型可以快捷直觀地處理數據;第二,它和關系型數據庫有共同點,具有豐富的數據查詢語言,其主要的聚合函數操作如表l所示;第三,它以文件形式把數據加載在內存中,假如服務器的內存資源足夠豐富,其插入和查詢效率要高于關系型數據庫[1]。
由于SpringBoot本身就封裝了MongoDB的套件,因此使用SpringBoot整合MongoDB做日志系統的開發,是相得益彰的。
1 實現原理
本系統共分為兩個模塊。一個是日志記錄模塊,是一個單獨的依賴組件,需要被微服務所引用,使用Spring的AOP及SpringBoot等技術開發,用于在微服務運行過程中,對Http請求的內容以及產生的異常等信息進行捕獲處理,并按照微服務名稱以及日期進行分類記錄到MongoDB數據庫。另一個模塊是日志管理模塊,是用SpringBoot開發的獨立的微服務,利用了MongoDB的相關特性,可提供日志數據的靈活查詢、統計分析、批量刪除、批量導出等功能接口供其他微服務調用[4]。
2 具體實現
2.1 功能模塊
2.1.1 日志記錄
日志記錄模塊在微服務內運行,主要負責在微服務運行過程中,將其產生的運行日志異步地記錄到MongoDB數據庫,其功能設計如圖l所示。
2.1.2 日志管理
日志管理模塊主要負責日志數據的管理,可對數據進行查詢、統計分析、批量刪除和導出,其功能設計如圖2所示。
2.2 軟件接口
2.2.1 寫日志接口
異步接口,其功能是將微服務產生的運行日志按照微服務名稱、產生日期進行分類,并記錄到MongoDB數據庫。
/**
* @param info日志信息
* @param level日志級別1 inf0 2 warn 3 error
*/|
public void saveLog(String info, int level);
2.2.2 查詢日志接口
提供日志數據的查詢功能,根據微服務名稱、日志產生日期篩選到指定的日志數據,并可根據具體的時間以及類型做進一步篩選,同時也可以根據日志內容做模糊查詢[3,5,6]。
/** @param appName微服務名稱* @param date檢索日期* @param time檢索時間* @param timeType檢索時間類型* @param searchStr檢索字符串*/ public ListgetAppLogs(String appName,
LocaIDate date, LocaITime time, int timeType,
String searchStr);
2.2.3 統計分析接口
可根據微服務名稱、分析類型、檢索字符串等條件,同時利用MongoDB的聚合函數等,對日志數據進行統計分析,例如按小時、天、月統計某個微服務的日志數量。
/**
* @param appName微服務名稱
* @param type分析類型
* @param searchStr檢索字符串
*/
public Object analyseAppLogs(String appName,
int type, String searchStr);
2.2.4批量刪除日志接口
根據微服務名稱及指定的日期范圍對日志進行批量刪除。
/**
* @param appName微服務名稱
* @param startDate刪除范圍的起始日期
* @param endDate刪除范圍的截止日期
*/
public void deleteAppLogs(String appName,
LocaIDate startDate, LocaIDate endDate);
2.2.5 批量導出日志接口
根據微服務名稱及指定的時間范圍對日志進行批量導出。
/**
* @param appName微服務名稱
* @param startDate導出范圍的起始時間
* @param endDate導出范圍的截止時間
*/
public void exportAppLogs(String appName, LocaIDate
startDate, LocaIDate endDate, int type);
2.3 日志表設計
為了方便日志系統將來拓展,特增加幾個備用屬性,表定義見表2。
3 項目代碼
3.1 日志記錄接口
在業務系統的實際開發中,需要對日志進行不同級別的記錄,這里提供四個級別的接口,來分別記錄不同級別的日志。
public interfaceLogger(
/★調試級別,不記錄/*,
void debug(String info);
/* info級別*/,
void info(String info);
/* warn級別 */,
void warn(String info);
/* error級別*/
void error(String info);
)
3.2 請求跟蹤
對于微服務接收的Http請求,可以利用AOP切面技術來處理。首先可以利用Pointcut注解來對所有的web接口進行匹配,這樣就可以在每一個請求的流轉過程中進行內容的處理并記錄日志[4]。
/*切點,匹配包路徑最后為controller的所有包下面類的所有方法+,
@Pointcut(”execution(++..controIIer*.*(..))”)
public void printPointCutController()O
/*切點,匹配所有帶有RequestMapping注解的方法*/,
@Pointcut(”@annotation(org.springframework.web.bind
.annotation.RequestMapping)“)
public void printPointCutRequestMapping()O
/* AOP切點交集,針對所有的web接口 */,
@Pointcut(”printPointCutController0&&
printPointCutRequestMapping0”)
public void printPointCut()0
/*調用web接口之前調用此方法,可以對請求的路徑、地址、
內容等進行記錄*/,
@Before(”printPointCut()”)
public void doBefore(JoinPoint joinPoint){…)
/*調用web接口之后調用此方法,可以對請求的返回結果等進行記錄*,
@AfterReturning(returning=”ret”, pointcut=”printPointCut0”)
public void doAfterReturning(Object ret){…}
/*調用web接口的過程中調用此方法,可以對請求的響應時
間等進行記錄+,
@Around(”printPointCut()”)
public Object doAround(ProceedingjoinPoint pjp){…}
3.3 異常捕獲
在工具類上使用RestControllerAdvice注解可捕獲運行過程中產生的異常,而在方法上使用ExceptionHandler注解會匹配異常。一旦捕獲異常,此工具類會按照方法定義的前后順序去匹配異常執行。
@RestControllerAdvice
public class ExceptionHandler{
r匹配空指針異常*,
@ Exception Handler(N uIIPointerException.class)
public Object handleRException(RException e){…}
/*匹配所有異常*/
@ExceptionHandler(Exception.class)
public Object handleRException(RException e){…}}
4 結束語
本文針對微服務日志規模龐大、難管理的問題,利用Spring的AOP切面技術、SpringBoot的配置管理及MongoDB數據庫實現了對分散的微服務運行日志的統一收集處理。利用Spring的切面及SpringBoot的配置[6],可以獲取到微服務的運行日志及異常信息。使用MongoDB數據庫做存儲,主要是MongoDB的易拓展、高性能等特性以及具備一定的統計分析查詢功能,可以快速地對日志進行記錄并可以靈活地查詢、統計分析等。
目前,根據上面的設計開發的日志系統已成功應用到多個微服務平臺,運行狀況良好,用戶可直觀便捷地對日志進行查詢統計,大大提高了后臺日志的利用率。
參考文獻(References):
[1]宋瑜輝.基于MongoDB存儲和分析輔助決裳系統中的海量日志[J].科技創新與應用,2019:2095-2945
[2]張驍,應時,張韜.應用軟件運行日志的收集與服務處理框架[J].計算機工程與應用,2018.10:1002-8331
[3]楊旭東,陳婷,梁瀟聆.基于web的本科畢業師生雙選系統開發設計[J].軟件,2018.39(5):182-188
[4]李天賜,余海情.基于SSH框架試題系統的設計與實現[J].軟件,2018.39(6):74-77
[5]周芷儀,陳婷,袁瑩靜,陳龍.基于JavaScript的電子時鐘效果實現[J].軟件,2019.40(3):60-64
[6]陳申平.敏捷軟件開發中的配置管理探討[J].軟件,2018.39(5):134-138
*基金項目:中國船舶集團有限公司科技創新項目(201823K)
作者簡介:閆四洋(1993-),男,江蘇連云港人,本科,工程師,主要研究方向:企業應用開發。