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