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