葉 峰
摘要:傳統(tǒng)監(jiān)控軟件在模塊化和靈活性方面存在固有的缺陷,面向方面編程(AOP)是為了解決傳統(tǒng)監(jiān)控軟件而提出來,它能夠較為理想的解決橫切關注點的問題,使系統(tǒng)獲得更好的模塊化。
關鍵詞: 監(jiān)控軟件;AOP;模塊化
1引言
傳統(tǒng)的應用軟件監(jiān)控系統(tǒng)中,監(jiān)控功能在整個系統(tǒng)中表現(xiàn)為一個模塊,但由于被監(jiān)控的對象分布在系統(tǒng)的各個模塊中,所以用于實現(xiàn)監(jiān)控的代碼(主要是監(jiān)控代理的代碼)也就分散于需要監(jiān)控的各個模塊中。當系統(tǒng)變化時,這種方式既難維護,也很難深入的進行修改。這造成日后要求對性能需求有更好理解的時候,添加或修改監(jiān)控程序的代碼變得困難。簡單地說,系統(tǒng)監(jiān)控是經(jīng)典的橫切關注點,因此任何非模塊化的實現(xiàn)都會讓它混亂。針對傳統(tǒng)監(jiān)控軟件模塊化和靈活性的不足,本文利用面向方面編程的思想提出一種更加模塊化、易擴展且易使用的軟件監(jiān)控系統(tǒng)的原型,并進行技術探討。
2常用的應用監(jiān)控
2.1常用應用監(jiān)控
對Tomcat服務器的監(jiān)控內(nèi)容主要有:可用性、應答時間明細、內(nèi)存利用率、線程明細、響應概要、應用的概要和明細、每分鐘對于Tomcat服務器的請求、每分鐘每JSP的請求及應答時間等。對WebLogic服務器的監(jiān)控內(nèi)容主要有:JVM堆棧使用情況、服務器應答時間、所有web應用的指標、用戶會話及相關信息、EJB(Enterprise JavaBean), EJB Pool統(tǒng)計量、EJB Cache統(tǒng)計量、Servlet, Thread pool, Java Database Connectivity (JDBC)Pool、等待連接的時間、正在使用的數(shù)據(jù)庫連接所占比例、自定義應用MBean (JMX)屬性等。
對WebSphere服務器的監(jiān)控內(nèi)容主要有:JVM內(nèi)存使用率、服務器應答時間、CPU利用率、所有web應用的指標、用戶會話及相關信息、Enterprise JavaBeans(EJBs), Thread Pool, Java Database Connectivity (JDBC) Pool、自定義應用MBean(JMX)屬性等。
數(shù)據(jù)庫的監(jiān)控。Oracle數(shù)據(jù)庫的主要監(jiān)控內(nèi)容:應答時間、活動用戶、狀態(tài)、表空間使用率、表空間明細、表空間狀態(tài)、SGA性能、明細、狀態(tài)、Data文件的性能、會話明細、回退段的信息等。
系統(tǒng)監(jiān)控。系統(tǒng)監(jiān)控的對象包括Microsoft Windows系列監(jiān)控的內(nèi)容類似,主要是以下四個方面:
CPU利用,監(jiān)控CPU利用率。檢查CPUGnu/Linux和Sun Solaris等,是否被完全利用,或利用不足;內(nèi)存利用,避免系統(tǒng)因內(nèi)存溢出而出現(xiàn)問題;并在內(nèi)存利用率過高(或故障性過低)時獲得通知;磁盤利用率,維持一部分空白磁盤空間,如果磁盤空間低于這一界限就會發(fā)出通知。當超出閩值時,可以運行自己的程序或腳本來清理磁盤;進程監(jiān)控,監(jiān)控系統(tǒng)中的重要進程,并在某一特定進程出現(xiàn)故障時獲得通知。
網(wǎng)絡服務監(jiān)控。一般是針對網(wǎng)絡中某個TCP端口(如FTP-21, Telnet-23)上運行的不同服務提供可用性和性能監(jiān)控,主要任務包括:可用性,提供服務的可用性;應答時間,提供服務的應答時間Web服務器監(jiān)控。Apache服務器的主要監(jiān)控內(nèi)容:被訪問的次數(shù)、負載、正常運行的持續(xù)時間、每分鐘的請求數(shù)量、每秒傳輸?shù)淖止?jié)數(shù)量、每個請求傳輸?shù)淖止?jié)數(shù)量、活動線程數(shù)、非激活的線程數(shù)等。IIS服務器的主要監(jiān)控內(nèi)容:服務器的可用性、服務器的應答時間。PHP服務器的主要監(jiān)控內(nèi)容:服務器的可用性、服務器的應答時間。
2.2監(jiān)控分類
在對軟件的監(jiān)控過程中,人們感興趣的監(jiān)控任務按其監(jiān)控的對象可以分為如下幾類:時間相關的信息,包括系統(tǒng)的啟動時刻、停止時刻、請求的延時、操作的耗時、服務持續(xù)的時間等。配置情況,系統(tǒng)一般都有一些可配置的選項,如是否啟動某項功能等。性能數(shù)據(jù),系統(tǒng)中的關鍵組件的性能一般都是監(jiān)控的重點,性能一般是指時間和狀態(tài)信息的相關組合。歷史數(shù)據(jù),統(tǒng)計某種服務或操作的次數(shù),某些對象的總數(shù)等互操作信息,包括各個組件間建立的連接,連接的狀態(tài)和連接上的請求的相關信息(如請求者、被請求者、請求延時等),通過其它方式實現(xiàn)的服務請求的信息等。狀態(tài)數(shù)據(jù),包括系統(tǒng)的負載,各個組件是否可用等信息。從系統(tǒng)的角度劃分監(jiān)控任務。由于我們考察的監(jiān)控對象都是應用軟件,所以有必要從軟件系統(tǒng)的角度來對這些監(jiān)控對象進行分析和總結。
各種軟件的實現(xiàn)方法各不相同,大部分的內(nèi)部結構也可能錯綜復雜,但是這些軟件一般都可以看成是一組核心服務和相關周邊服務組成的、能對外提供某種應用接口的功能實體。其監(jiān)控內(nèi)容可以按如下方式劃分對核心服務的監(jiān)控;對周邊服務組件的監(jiān)控;對核心服務與其他組件互操作請求的監(jiān)控;從統(tǒng)計數(shù)據(jù)類別劃分監(jiān)控任務。大多數(shù)監(jiān)控任務在獲得原始的監(jiān)控數(shù)據(jù)之后,還需要將幾個不同的對象的值或者同一個對象不同時刻的值進行統(tǒng)計分析,以獲取人們感興趣的信息。對于多個不同的對象,常見的統(tǒng)計類型有:最常出現(xiàn)、最少出現(xiàn)、每種對象出現(xiàn)的概率、總數(shù)等;對于同一個對象,常見的統(tǒng)計類型有:總數(shù)、最大值、最小值、平均值等。
從監(jiān)控手段劃分監(jiān)控任務。雖然監(jiān)控的對象千差萬別,但監(jiān)控軟件使用的監(jiān)控手段并不是很多,主要有直接的和間接的兩種。直接的方法比較簡單,一般是通過系統(tǒng)調(diào)用直接獲取待監(jiān)視系統(tǒng)的狀態(tài)或直接讀取其中某個變量的值。如系統(tǒng)的CPU負載和內(nèi)存使用率的監(jiān)控就是直接調(diào)用系統(tǒng)的相關函數(shù)得到的。間接的方法主要用于監(jiān)控對象間請求和操作。例如要監(jiān)控某個請求,常用的方法是攔截這個請求,對其上下文進行分析,然后再按原路徑繼續(xù)這個請求。
2AOP的技術優(yōu)勢
AOP作為一種程序設計方法學,關注于提高軟件的抽象程度和模塊性,從而在很大程度上改善了軟件的可擴展性、可重用性、易理解性和易維護性。
可擴展性。AOP提供系統(tǒng)的擴展機制是通過擴展aspect(如繼承)或增加aspect來實現(xiàn)的。由于方面模塊根本不知道橫切關注點,所以很容易通過建立新的方面加入新的功能。
可重用性??芍赜眯允侵改硞€應用系統(tǒng)中的元素被應用到其他系統(tǒng)的能力。AOP中的系統(tǒng)模塊包括系統(tǒng)組件和影響這些組件的系統(tǒng)特性,通過將實現(xiàn)基本功能的組件和特定于應用的系統(tǒng)特性分離,并把每個系統(tǒng)特性實現(xiàn)為獨立的方面模塊,使得組件的重用性得到提高,并使不能封裝為類或函數(shù)的系統(tǒng)特性的重用成為可能。
易理解性和易維護性。AOP用最小的禍合處理每個關注點,使得橫切關注點也是模塊化的,從而避免了傳統(tǒng)開發(fā)方法中由于對橫切關注點的解決而導致的代碼混亂和代碼分散,提高了程序的易理解性。而且,對一個aspect的修改可以通過編織器影響到系統(tǒng)相關的各個部分,大大提高了系統(tǒng)的易維護性。
3實現(xiàn)AOP的關鍵技術
編織(weaving)是實現(xiàn)AOP的一個重要機制,利用方面編織器將方面代碼織入到核心功能代碼中,可以構建最終系統(tǒng)。
3.1靜態(tài)編織和動態(tài)編織
靜態(tài)編織是指在核心功能代碼中的適當位置,比如某段代碼調(diào)用前后將方面代碼織入,從而形成混合的編碼;而動態(tài)編織可以在程序運行時,根據(jù)上下文決定調(diào)用的方面和它們的先后順序以及增加或刪除一個方面等。利用靜態(tài)編織的工具有Aspect), AspectC一等;其他一些使用反射技術或運行時代碼織入技術的體系結構都屬于動態(tài)編織,這樣的工具有AspectWerkz, Jboss, Spring AOP, AOP/ST等。
3.2不同時刻的編織
編譯時編織。編譯時編織可以在編譯前進行預處理,將兩種代碼自動混合,將方面中的代碼自動插入到功能模塊代碼的合適位置處,也可在編譯后,對編譯后的代碼進行操作。
載入時編織。載入時編織是在代碼載入時,實現(xiàn)代碼的編織。利用對字節(jié)碼的修改實現(xiàn)方面的織入,通過引入一個被稱為方面容器的間接層以及對字節(jié)碼的轉化來實現(xiàn)動態(tài)AOP的要求。
運行時編織。運行時編織是指在運行時根據(jù)對方法的調(diào)用執(zhí)行適當?shù)姆矫娲a以實現(xiàn)編織。運行時編織可能是所有編織方式中最為靈活的,程序在運行過程中可以為單個的對象指定是否需要編織特定的Aspect。運行時編織采用的編織技術有反射、動態(tài)代理和攔截器。
參考文獻
[1]周立萍,陳平.逆向工程發(fā)展現(xiàn)狀研究[J].計算機工程與設計,2004.
[2]周之英,現(xiàn)代軟件工程(中)[M].北京:科學出版社,2000.
[3]宋亞奇. 基于代碼混淆的軟件保護技術研究 [D]. 西安:西北大學.2005.