摘 要: 提出一種基于動(dòng)態(tài)AOP的監(jiān)測(cè)器模型及其實(shí)現(xiàn),,它能夠?qū)ΜF(xiàn)有的,、已在運(yùn)行的系統(tǒng)進(jìn)行最靈活和能耗最小的代碼級(jí)性能分析。利用AOP動(dòng)態(tài)織入機(jī)制,,可在目標(biāo)系統(tǒng)運(yùn)行過程中動(dòng)態(tài)添加或刪除監(jiān)測(cè)器,,從而提高監(jiān)測(cè)的靈活性。
關(guān)鍵詞: 性能監(jiān)測(cè),;AOP,;IoC;織入機(jī)制
隨著Internet的日益普及和電子商務(wù)的飛速發(fā)展,,基于B/S的Web應(yīng)用系統(tǒng)大量出現(xiàn),。在這些Web應(yīng)用系統(tǒng)中,客戶端只提供人機(jī)交互的接口而未參與實(shí)際運(yùn)算,,而服務(wù)器端將承擔(dān)數(shù)據(jù)存儲(chǔ)及運(yùn)算的全部工作,,在面對(duì)海量客戶端數(shù)量的情況下,服務(wù)端的性能壓力問題就尤為突出,。為了保證Web應(yīng)用系統(tǒng)的正常運(yùn)行,,以及系統(tǒng)在服務(wù)器端具有較高的性能來響應(yīng)大量用戶的并發(fā)訪問,進(jìn)行合理的性能規(guī)劃和有效的性能監(jiān)測(cè)就顯得非常重要。性能監(jiān)測(cè)的主要意義[1]是:在系統(tǒng)運(yùn)行階段,,通過監(jiān)測(cè)系統(tǒng)的運(yùn)行情況,,發(fā)現(xiàn)錯(cuò)誤并對(duì)故障進(jìn)行定位,從而解決開發(fā)和測(cè)試階段中的錯(cuò)誤,。
現(xiàn)有的監(jiān)測(cè)器存在以下不足[2-3]:監(jiān)測(cè)邏輯與業(yè)務(wù)邏輯緊密耦合,,可擴(kuò)展性、可復(fù)用性,、可維護(hù)性差;監(jiān)測(cè)部件分散在目標(biāo)系統(tǒng)中,,缺乏合理的組織,;監(jiān)測(cè)代碼寫在業(yè)務(wù)代碼中,不易修改,;監(jiān)測(cè)部件在開發(fā)階段手動(dòng)插入,,不適合動(dòng)態(tài)添加或刪除。
本文設(shè)計(jì)并實(shí)現(xiàn)了一款A(yù)OP監(jiān)測(cè)器,,它圍繞目前.NET平臺(tái)下主流的Web開發(fā)框架——Asp.net MVC,,除了利用AOP關(guān)注點(diǎn)分離原則,克服了現(xiàn)有監(jiān)測(cè)器的不足外,,還針對(duì)MVC框架的特點(diǎn),,實(shí)現(xiàn)了注入切面,不僅實(shí)現(xiàn)了方法級(jí)別的監(jiān)測(cè),,同時(shí)還實(shí)現(xiàn)了針對(duì)Controller及Action級(jí)別的監(jiān)測(cè),,與其他方法[2]相比,該監(jiān)測(cè)方式更適合Web系統(tǒng)的使用,。
1 性能監(jiān)測(cè)的作用及主要監(jiān)測(cè)對(duì)象
性能監(jiān)測(cè)也可稱為構(gòu)件交互行為監(jiān)測(cè)[4],,指對(duì)構(gòu)件在交互活動(dòng)期間所進(jìn)行的操作進(jìn)行監(jiān)視記錄的過程。構(gòu)件交互行為[5]是指在分布式構(gòu)件軟件中,,構(gòu)件以主體的身份在完成某項(xiàng)協(xié)作活動(dòng)時(shí),,通過構(gòu)件的接口在運(yùn)行環(huán)境中與其他構(gòu)件進(jìn)行交互的活動(dòng)。性能監(jiān)測(cè)主要包括:軟件實(shí)體間的交互行為監(jiān)測(cè),、行為信息的收集,、為行為診斷、預(yù)測(cè)和可信評(píng)估等提供基礎(chǔ)數(shù)據(jù),。
對(duì)于分布式構(gòu)件軟件的性能監(jiān)測(cè),,其各監(jiān)測(cè)類型所對(duì)應(yīng)的監(jiān)測(cè)對(duì)象[3]如表1所示。
現(xiàn)有的監(jiān)測(cè)器大都面向操作系統(tǒng)級(jí)別,,其監(jiān)測(cè)范圍及粒度均大于Web系統(tǒng)的監(jiān)測(cè)所需,,從而導(dǎo)致所監(jiān)測(cè)的數(shù)據(jù)不能很好地用于對(duì)系統(tǒng)性能的提升分析上。由于Web系統(tǒng)屬于非連續(xù)性開放系統(tǒng),,基于HTTP協(xié)議的基本“請(qǐng)求—響應(yīng)”特性,,決定了其安全性及可用性均與系統(tǒng)的業(yè)務(wù)存在必然的聯(lián)系,,傳統(tǒng)的監(jiān)測(cè)器不能根據(jù)一定的業(yè)務(wù)邏輯對(duì)所采集的數(shù)據(jù)進(jìn)行篩選,而只能通過海量的原始數(shù)據(jù)結(jié)合業(yè)務(wù)進(jìn)行判斷,。這也是本課題未直接采用傳統(tǒng)性能監(jiān)測(cè)器而是進(jìn)行構(gòu)件設(shè)計(jì)的一個(gè)主要原因,。
2 基于AOP的性能監(jiān)測(cè)系統(tǒng)及其實(shí)現(xiàn)
2.1 系統(tǒng)結(jié)構(gòu)
本文設(shè)計(jì)實(shí)現(xiàn)的AOP性能監(jiān)測(cè)系統(tǒng)結(jié)構(gòu)如圖1所示,它由3個(gè)部分構(gòu)成:目標(biāo)監(jiān)測(cè)系統(tǒng),、獨(dú)立監(jiān)測(cè)控制臺(tái)和性能監(jiān)測(cè)構(gòu)件包,。其中可視化部分——獨(dú)立監(jiān)測(cè)控制臺(tái)是輔助實(shí)現(xiàn)動(dòng)態(tài)織入的關(guān)鍵,也是連接目標(biāo)監(jiān)測(cè)系統(tǒng)和性能監(jiān)視構(gòu)件包的橋梁,,它提供性能數(shù)據(jù)讀寫接口以實(shí)現(xiàn)標(biāo)準(zhǔn)化的性能數(shù)據(jù)采集,,以及為目標(biāo)系統(tǒng)擴(kuò)展IoC功能提供織入控制容器。性能監(jiān)測(cè)構(gòu)件包提供了基本標(biāo)準(zhǔn)接口,,監(jiān)控器的類型和功能可以根據(jù)實(shí)際項(xiàng)目需要擴(kuò)展新的監(jiān)測(cè)組件,。
2.2 相關(guān)技術(shù)介紹
本系統(tǒng)主要采用AOP 技術(shù)實(shí)現(xiàn)監(jiān)測(cè)代碼和業(yè)務(wù)代碼松散耦合,并可在目標(biāo)系統(tǒng)運(yùn)行過程中動(dòng)態(tài)添加或刪除監(jiān)測(cè)器,。本系統(tǒng)主要采用的開發(fā)工具有Asp.net MVC,、NInject.WEB.MVC、WMI,。
面向方面編程(AOP)是美國(guó)施樂公司帕洛阿爾托研究中心在20世紀(jì)90年代提出的一種編程思想,。AOP技術(shù)作為一種新興的軟件開發(fā)方法,提供了不同關(guān)注點(diǎn)的分離實(shí)現(xiàn)機(jī)制,,具有可擴(kuò)展性,、可復(fù)用性、易理解性,、易維護(hù)性等特性,。本監(jiān)測(cè)器利用AOP關(guān)注點(diǎn)分離原則,實(shí)現(xiàn)監(jiān)測(cè)代碼與業(yè)務(wù)代碼松散耦合,,提高目標(biāo)系統(tǒng)的可擴(kuò)展性,、可復(fù)用性、易維護(hù)性,;使用AOP的動(dòng)態(tài)織入機(jī)制,,允許動(dòng)態(tài)添加、刪除監(jiān)測(cè)器,,從而實(shí)現(xiàn)監(jiān)測(cè)的可控性與動(dòng)態(tài)性,。
Asp.net MVC框架將模型、視圖,、控制器引入開發(fā)模型,,將Web系統(tǒng)跟蹤從頁面層次提升到了面向業(yè)務(wù)的層次。NInject是一個(gè)超輕量級(jí)的依賴注入框架,具備靈活,、自由的織入機(jī)制,,其擴(kuò)展框架NInject.WEB.MVC是專門為Asp.net MVC設(shè)計(jì)的擴(kuò)展包。除了一般IoC所具備的構(gòu)造函數(shù),、方法,、屬性注入之外,還提供了針對(duì)Controller生命周期的注入及擴(kuò)展的MvcInjectApplication類,。WMI是Windows的核心管理技術(shù),,本系統(tǒng)中多處需要提取操作系統(tǒng)及硬件信息,而在Windows操作系統(tǒng)環(huán)境下,,WMI編程接口具有良好的可操作性,,因此本系統(tǒng)的交互行為監(jiān)測(cè)組件主要使用該技術(shù)實(shí)現(xiàn)。
2.3 系統(tǒng)的實(shí)現(xiàn)
本系統(tǒng)使用Visual Studio.Net2010開發(fā),,使用Asp.net MVC2.0和NInject.Web.MVC技術(shù)實(shí)現(xiàn)。
一般的Web系統(tǒng)由于頁面級(jí)別和類級(jí)別往往不能包含一個(gè)完整的業(yè)務(wù)功能,,因此在實(shí)現(xiàn)對(duì)業(yè)務(wù)功能級(jí)別的性能監(jiān)測(cè)上存在著一定的復(fù)雜度,。本系統(tǒng)圍繞Asp.net MVC框架而實(shí)現(xiàn),它改變Web Form框架依賴頁面的Web架構(gòu)模式,,按照控制器和動(dòng)作的方式將業(yè)務(wù)功能進(jìn)行邏輯劃分,,使得IoC注入方式增加了控制器注入、動(dòng)作注入,、控制器異常注入,、動(dòng)作異常注入等幾種方式,使得Web系統(tǒng)的性能監(jiān)測(cè)粒度范圍有了更實(shí)際的業(yè)務(wù)價(jià)值,。圖2為Asp.net MVC的執(zhí)行流程,。
AOP技術(shù)中存在多種編譯時(shí)機(jī)和織入方式,由于本系統(tǒng)所設(shè)計(jì)的運(yùn)行環(huán)境一般不能獲取被監(jiān)測(cè)系統(tǒng)的源代碼,,也不能對(duì)其進(jìn)行修改和重編譯,。因此,采用運(yùn)行時(shí)的動(dòng)態(tài)織入技術(shù)實(shí)現(xiàn)監(jiān)測(cè)組件到被監(jiān)測(cè)系統(tǒng)指定連接點(diǎn)的織入,。
在.NET平臺(tái)下的多種IoC框架中,,NInject框架最符合本系統(tǒng)的設(shè)計(jì)要求。它提供了對(duì)Asp.net MVC系統(tǒng)的良好基礎(chǔ)擴(kuò)展,,而且只提供運(yùn)行時(shí)織入,。本系統(tǒng)中,通過NInjectMvcApplication類對(duì)HttpApplication的替換,,實(shí)現(xiàn)了由NInject的IoC容器替換原本W(wǎng)eb系統(tǒng)應(yīng)用程序的目的,,從而使系統(tǒng)內(nèi)對(duì)象的創(chuàng)建全部受到NInject容器的控制。其替換過程示意圖如圖3所示。
該替換過程首先將NInjectMvcApplication類注冊(cè)到公共運(yùn)行庫(GAC),,而后搜索目標(biāo)Web系統(tǒng)的全局配置文件并替換其HttpApplication,,其關(guān)鍵代碼邏輯如下:
public void ReplaceIoContainer(string path)
{
if(string.IsNullOrEmpty(path)) throw new FileNotFound-
Exception(path);
var files = Directory.GetFiles(path);
foreach(var file in files)
{
if(file.ToLower().Equals("global.asax"))
{
using(var sr=new StreamReader(file))
{
var data = sr.ReadToEnd();
Regex reg=new Regex("inherits=\"(\\w+)
\"",RegexOptions.IgnoreCase | RegexOptions.Multiline);
var mat = reg.Match(data);
if(mat.Length==0) throw new InvalidOpera-
tionException();
reg.Replace(data, typeof (NInjectMvcAppli-
cation).FullName);
using (var sw=new FileStream(path,
FileMode.Open))
{
var writeData = Encoding.UTF8.Get-
Bytes(data);
sw.Write(writeData,0,writeData.Length);
}
}
}
}
}
替換IoC容器后可按配置將監(jiān)測(cè)組件按需進(jìn)行織入,織入連接點(diǎn)為構(gòu)造函數(shù),、方法,、屬性、控制器,、動(dòng)作等,,以常量進(jìn)行標(biāo)識(shí),其關(guān)鍵代碼如下:
/// <summary>
/// 檢測(cè)器的插入位置(可以用或符號(hào)多重選擇)
/// </summary>
[Flags]
public enum MonitorPoint
{
mpBeforeContructor,mpBeforeMehtod,mpBeforeProperty,
mpAfterContructor,
mpAfterMethod,mpAfterProperty,mpBeforeController,
mpSurroundController,
mpAfterController,mpBeforeAction,mpSurroundAction,
mpAfterAction,mpActionException
}
public interface IMonitorContainer
{
/// 注入的位置
MonitorPoint InjectPosition { get; set; }
/// 所要注入的監(jiān)視器
MonitorBase Monitor { get; set; }
/// NInject注入引擎
IKernel Component { get; set; }
}
通過連接Ikernel和MonitorBase,,容器將監(jiān)測(cè)組件織入到目標(biāo)系統(tǒng)指定位置,。由于監(jiān)測(cè)組件存在多樣性,本系統(tǒng)為使監(jiān)測(cè)組件設(shè)計(jì)具有更好的擴(kuò)展性,,做了以下工作:
(1)標(biāo)準(zhǔn)化織入目標(biāo)連接點(diǎn)方式:任何拓展的監(jiān)測(cè)組件,,都必須支持IoC容器所提供的所有織入點(diǎn)的監(jiān)測(cè)工作;
(2)預(yù)留監(jiān)測(cè)數(shù)據(jù)輸出接口:由于監(jiān)測(cè)組件的多樣性,,其數(shù)據(jù)產(chǎn)生量也有不同的變化,,因此預(yù)留了多個(gè)監(jiān)測(cè)數(shù)據(jù)輸出接口(例如文本中HTTP、數(shù)據(jù)庫,、XML,、電子郵件等)。
圖4列出了監(jiān)測(cè)組件的可拓展接口,。
本文設(shè)計(jì)并實(shí)現(xiàn)了一款運(yùn)行在作業(yè)環(huán)境下的代碼級(jí)的Web性能監(jiān)測(cè)分析工具,。它采集實(shí)時(shí)數(shù)據(jù)進(jìn)行分析;使用AOP技術(shù)實(shí)現(xiàn)了Web應(yīng)用系統(tǒng)的代碼級(jí)監(jiān)測(cè)分析,,并且可自由控制監(jiān)測(cè)范圍,;使用構(gòu)件技術(shù)實(shí)現(xiàn)了即插即用,減少了對(duì)現(xiàn)有系統(tǒng)的修改和結(jié)構(gòu)上的破壞,,避免因性能監(jiān)測(cè)而引入新的BUG,;通過控制臺(tái)自由配置變更監(jiān)測(cè)的范圍,靈活調(diào)整監(jiān)測(cè)的目標(biāo),;利用Windows性能計(jì)數(shù)器顯示檢測(cè)和分析的結(jié)果,。該工具對(duì)系統(tǒng)進(jìn)行監(jiān)測(cè)分析時(shí),不需要對(duì)作業(yè)系統(tǒng)進(jìn)行任何重編譯的工作,,盡量地降低性能監(jiān)測(cè)所帶來的額外損耗,。下一步將對(duì)構(gòu)件包進(jìn)行擴(kuò)展,使其能夠應(yīng)用在更多的系統(tǒng)上,,實(shí)現(xiàn)多個(gè)被測(cè)系統(tǒng)的聯(lián)合監(jiān)測(cè),。
參考文獻(xiàn)
[1] 朱幸輝,,楊樹強(qiáng).基于CORBA分布式對(duì)象監(jiān)測(cè)系統(tǒng)的研究與實(shí)現(xiàn)[J].計(jì)算機(jī)應(yīng)用研究,2005,,22(10):39-41.
[2] 萬燦軍,,李長(zhǎng)云.基于動(dòng)態(tài)AOP的構(gòu)件交互行為監(jiān)測(cè)器[J].計(jì)算機(jī)應(yīng)用,2011,,31(2):572-576.
[3] 黃興華,,胡飛.AOP技術(shù)在面向用戶的軟件組件測(cè)試中的應(yīng)用[J].計(jì)算機(jī)應(yīng)用與軟件,2009,,26(8):125-127.
[4] 萬燦軍,,李長(zhǎng)云.動(dòng)態(tài)演化環(huán)境中可信軟件行為監(jiān)控研究與進(jìn)展[J].計(jì)算機(jī)應(yīng)用研究,2009,,26(4):1201-1204.
[5] 萬燦軍,,李長(zhǎng)云,賀宗梅.分布式軟件的交互行為監(jiān)測(cè)機(jī)制的研究[J].計(jì)算機(jī)工程與應(yīng)用,,2011,,47(5):60-64.