吳一鳴,田永濤
(南寧供電局信息中心 南寧 530031)
J2EE(Java 2 platform enterprise edition)作為當(dāng)前主流的Web服務(wù)架構(gòu),廣泛應(yīng)用于電力行業(yè)的各個信息系統(tǒng)中。南寧供電局內(nèi),包括生產(chǎn)MIS(management information system,管理信息系統(tǒng))和營銷MIS等多個信息系統(tǒng)都采取了J2EE架構(gòu)。
在J2EE架構(gòu)中,應(yīng)用服務(wù)中間件作為應(yīng)用服務(wù)程序(服務(wù)器程序)的容器,是用戶業(yè)務(wù)請求和應(yīng)用服務(wù)程序服務(wù)處理的中繼以及橋梁。一方面,應(yīng)用服務(wù)中間件接收用戶請求并屏蔽瀏覽器之間的請求差異;另一方面,應(yīng)用服務(wù)中間件將應(yīng)用服務(wù)程序請求處理結(jié)果響應(yīng)請求客戶端。應(yīng)用服務(wù)中間件是J2EE信息系統(tǒng)正常工作的保證。常見的 J2EE 應(yīng)用服務(wù)中間件包括:Tomcat、WebLogic、JBoss和WebSphere 等[1]。
正是由于應(yīng)用服務(wù)中間件在信息系統(tǒng)中的關(guān)鍵位置,當(dāng)應(yīng)用服務(wù)中間件出現(xiàn)內(nèi)存溢出、進程僵死類似異常情況時,輕則服務(wù)器超時響應(yīng)用戶請求,重則信息系統(tǒng)崩潰無法訪問,均會導(dǎo)致系統(tǒng)服務(wù)異常,影響用戶工作。
應(yīng)用服務(wù)中間件監(jiān)控是電力行業(yè)信息工作人員日常系統(tǒng)運維的重要任務(wù)。在實際工作中,采用人為方式監(jiān)控信息系統(tǒng)應(yīng)用服務(wù)中間件運行狀況既不現(xiàn)實也不可靠,以系統(tǒng)級別的自動化程序監(jiān)控應(yīng)用服務(wù)中間件是最好的解決方式。南寧供電局信息中心針對J2EE架構(gòu)的應(yīng)用服務(wù)中間件自主設(shè)計并實現(xiàn)了監(jiān)控系統(tǒng),并在南寧供電局生產(chǎn)MIS中成功應(yīng)用該監(jiān)控系統(tǒng)。
南寧供電局生產(chǎn)MIS架構(gòu)體系可以分為4個層次,如圖1所示。從上至下依次為負載均衡器、應(yīng)用服務(wù)中間件、應(yīng)用服務(wù)程序和系統(tǒng)數(shù)據(jù)庫。負載均衡器是整個系統(tǒng)的對外接口,用戶在以太網(wǎng)內(nèi)發(fā)起服務(wù)請求,到達負載均衡器,負載均衡器根據(jù)指定算法,將用戶請求分流至應(yīng)用服務(wù)中間件。應(yīng)用服務(wù)程序是用戶請求的處理單元,處理用戶請求并生成響應(yīng)結(jié)果。系統(tǒng)數(shù)據(jù)庫位于數(shù)據(jù)持久層,提供數(shù)據(jù)服務(wù)。
圖1 生產(chǎn)MIS結(jié)構(gòu)
南寧供電局生產(chǎn)MIS采用的J2EE應(yīng)用服務(wù)中間件是Tomcat,Tomcat對于其運行載體的計算機物理內(nèi)存并非全數(shù)使用,為了充分利用服務(wù)器計算機的物理內(nèi)存資源,生產(chǎn)MIS里采用的是Tomcat集群模式,即同一臺服務(wù)器計算機上開啟多個Tomcat應(yīng)用服務(wù)中間件,提供無差別的系統(tǒng)服務(wù)。
南寧供電局監(jiān)控系統(tǒng)的監(jiān)控對象是生產(chǎn)MIS的應(yīng)用服務(wù)中間件,獲取應(yīng)用服務(wù)中間件的各種實時運行參數(shù),根據(jù)參數(shù)判斷健康狀態(tài)或警戒狀態(tài),在此基礎(chǔ)上延伸高級應(yīng)用。
在生產(chǎn)MIS新的架構(gòu)體系中,監(jiān)控系統(tǒng)位于負載均衡器與應(yīng)用服務(wù)中間件之間:監(jiān)控系統(tǒng)對下層應(yīng)用服務(wù)中間件實時監(jiān)控,對其上層負載均衡器提供接口,反饋應(yīng)用服務(wù)中間件運行狀態(tài),以便負載均衡器優(yōu)化分流用戶請求。監(jiān)控系統(tǒng)亦可以作為生產(chǎn)MIS對外接口,憑借其收集整理的應(yīng)用服務(wù)中間件運行狀態(tài)數(shù)據(jù),導(dǎo)流以太網(wǎng)用戶服務(wù)請求,集成負載均衡功能。生產(chǎn)MIS集成監(jiān)控系統(tǒng)結(jié)構(gòu)如圖2所示。
圖2 生產(chǎn)MIS集成監(jiān)控系統(tǒng)結(jié)構(gòu)
根據(jù)軟件設(shè)計中功能聚合的原則,本次南寧供電局開發(fā)的J2EE應(yīng)用服務(wù)中間件監(jiān)控系統(tǒng)采取的是模塊化模式,如圖3所示。整個系統(tǒng)從總體上劃分為:監(jiān)控數(shù)據(jù)采集模塊、監(jiān)控數(shù)據(jù)處理模塊、監(jiān)控數(shù)據(jù)展示模塊、監(jiān)控控制模塊、應(yīng)用服務(wù)中間件控制模塊、對外接口模塊以及系統(tǒng)基礎(chǔ)類庫模塊。
圖3 應(yīng)用服務(wù)中間件監(jiān)控系統(tǒng)結(jié)構(gòu)模塊
各個模塊功能說明如下。
監(jiān)控數(shù)據(jù)采集模塊:此模塊是整個系統(tǒng)的核心,采集模塊獲取到監(jiān)控目標(biāo)應(yīng)用服務(wù)中間件的實時運行狀態(tài)數(shù)據(jù)是監(jiān)控系統(tǒng)運行的基礎(chǔ)。通過對采集監(jiān)控的數(shù)據(jù)分析以及處理,系統(tǒng)做出正確的響應(yīng)。
監(jiān)控數(shù)據(jù)處理模塊:此模塊對監(jiān)控數(shù)據(jù)結(jié)構(gòu)化處理,并實現(xiàn)監(jiān)控數(shù)據(jù)持久化。在此模塊數(shù)據(jù)處理成果之上,可以實現(xiàn)應(yīng)用服務(wù)中間件運行狀態(tài)統(tǒng)計分析,進而實現(xiàn)中間件運行狀態(tài)趨勢預(yù)測以及對策預(yù)防等高級功能。
監(jiān)控數(shù)據(jù)展示模塊:電力信息工作運維人員通過此模塊可以實時了解應(yīng)用服務(wù)中間件的運行狀態(tài)。展示模塊是監(jiān)控數(shù)據(jù)采集模塊的“顯示器”。
監(jiān)控控制模塊:運維人員人機操作的接口,操作人員通過控制模塊將預(yù)設(shè)指令輸入系統(tǒng),完成各種系統(tǒng)功能。
應(yīng)用服務(wù)中間件控制模塊:系統(tǒng)通過此模塊控制應(yīng)用服務(wù)中間件,可對應(yīng)用服務(wù)中間件實現(xiàn)啟動、終止或者重啟操作。
對外接口模塊:為第三方程序提供特定格式的應(yīng)用服務(wù)中間件運行狀態(tài)數(shù)據(jù),在南寧供電局生產(chǎn)MIS中,負載均衡器可以接收監(jiān)控系統(tǒng)的監(jiān)控反饋,以實時更新分流策略。
系統(tǒng)基礎(chǔ)類庫模塊:包括網(wǎng)絡(luò)接口類、系統(tǒng)日志類、信息封裝解析類等供系統(tǒng)其他模塊直接調(diào)用的類庫。
通過對各個模塊功能分析可以看出,監(jiān)控數(shù)據(jù)采集模塊是整體系統(tǒng)開發(fā)的重點,是系統(tǒng)運行的數(shù)據(jù)之源,是系統(tǒng)功能實現(xiàn)的基礎(chǔ)。南寧供電局J2EE應(yīng)用服務(wù)中間件監(jiān)控系統(tǒng)開發(fā)小組將此模塊設(shè)為重點攻關(guān)對象。
監(jiān)控數(shù)據(jù)采集模塊的開發(fā)采用JMX(Java management extensions,Java管理擴展)技術(shù)。JMX是一個為Java應(yīng)用程序、Java設(shè)備、Java系統(tǒng)等植入管理功能的框架,JMX中定義了Java進程管理的體系結(jié)構(gòu)、監(jiān)控模式和應(yīng)用程序接口以及服務(wù)。Tomcat中間件基于J2EE標(biāo)準(zhǔn),其本身集成了JMX框架,使用JMX技術(shù)可以實現(xiàn)對J2EE應(yīng)用服務(wù)中間件運行狀態(tài)數(shù)據(jù)的實時采集[2]。
JMX框架本身定義了一系列進程監(jiān)控數(shù)據(jù)交互的接口,監(jiān)控程序接入應(yīng)用服務(wù)中間件內(nèi)置JMX框架的監(jiān)控服務(wù)端,以此形成監(jiān)控數(shù)據(jù)傳輸通道,在通道內(nèi)傳輸符合JMX框架定義格式的應(yīng)用服務(wù)中間件運行狀態(tài)數(shù)據(jù)。由此可見,JMX框架可以看成一系列協(xié)議的集合,包括基于TCP/IP的網(wǎng)絡(luò)連接協(xié)議以及傳輸消息格式協(xié)議,JMX技術(shù)的體現(xiàn)就在于以JMX框架協(xié)議交互。
南寧供電局J2EE應(yīng)用服務(wù)中間件監(jiān)控系統(tǒng)開發(fā)小組經(jīng)過對JMX框架的深入研究,了解了其中的監(jiān)控連接和數(shù)據(jù)傳輸?shù)募毠?jié),解析出網(wǎng)絡(luò)連接以及傳輸消息格式的協(xié)議規(guī)范,將JMX框架的網(wǎng)絡(luò)連接協(xié)議和傳輸消息格式協(xié)議以類的方式在系統(tǒng)基礎(chǔ)類庫模塊中實現(xiàn)。監(jiān)控數(shù)據(jù)采集模塊通過實例化這兩個基于JMX框架的類,調(diào)用類的方法,實時獲取到應(yīng)用服務(wù)中間件的運行狀態(tài)數(shù)據(jù)。
通過JMX技術(shù),開發(fā)小組實現(xiàn)了對單個應(yīng)用服務(wù)中間件運行狀態(tài)的監(jiān)控,但是在實際應(yīng)用中,南寧供電局生產(chǎn)MIS采用的是應(yīng)用服務(wù)中間件集群。為了使一對一的JMX技術(shù)擴展為一對多的應(yīng)用來應(yīng)對現(xiàn)實的應(yīng)用場景,開發(fā)小組采取了線程池技術(shù)。監(jiān)控線程池工作如圖4所示。
圖4 監(jiān)控線程池工作
作為監(jiān)控系統(tǒng)的子進程,監(jiān)控數(shù)據(jù)采集模塊進程啟動后,等待來自監(jiān)控控制模塊進程的系統(tǒng)指令。當(dāng)采集模塊收到指向某個具體應(yīng)用服務(wù)中間件的監(jiān)控指令后,通過工廠模式,從應(yīng)用JMX技術(shù)的線程池中新建一個線程,以監(jiān)控指令中解析出的參數(shù)實例化該線程,線程開始對指定應(yīng)用服務(wù)中間件的監(jiān)控服務(wù)端以JMX框架網(wǎng)絡(luò)連接協(xié)議發(fā)起監(jiān)控請求,應(yīng)用服務(wù)中間件響應(yīng)了監(jiān)控請求后,JMX框架網(wǎng)絡(luò)連接通道建立,應(yīng)用服務(wù)中間件持續(xù)通過JMX框架網(wǎng)絡(luò)通道發(fā)送以JMX框架傳輸消息格式封裝的運行狀態(tài)數(shù)據(jù),期間如果雙方的JMX框架網(wǎng)絡(luò)連接異常,則監(jiān)控線程保持對指定應(yīng)用服務(wù)中間件發(fā)送監(jiān)控請求,直至采集模塊收到停止對指定應(yīng)用服務(wù)中間件監(jiān)控指令,采集模塊釋放該監(jiān)控線程[3]。采取線程池技術(shù)保證了線程工廠及時生成和回收監(jiān)控線程,監(jiān)控線程之間并發(fā)運行互不影響之間的監(jiān)控功能,線程池技術(shù)實現(xiàn)了監(jiān)控數(shù)據(jù)采集模塊一對多個應(yīng)用服務(wù)中間件監(jiān)控,監(jiān)控數(shù)據(jù)采集模塊功能開發(fā)完成。
以下是監(jiān)控數(shù)據(jù)采集模塊的3個監(jiān)控線程在同一時間獲取到的Tomcat中間件運行狀態(tài)數(shù)據(jù):
maxMemory:1398145024;
commitMemory:91029504;
usedMemory:33862408;
heap:37.19937658893539%;
maxMemory:1398145024;
commitMemory:102563840;
usedMemory:42737488;
heap:41.66915747304313%;
nonheap:175.77420874747304%;
nonheap:139.27205952029988%;
maxMemory:1398145024;
commitMemory:153288704;
usedMemory:76276240;
heap:49.759857060308896%;
nonheap:313.71510960663744%。
監(jiān)控數(shù)據(jù)處理模塊的功能主要有兩個:一是處理原始應(yīng)用服務(wù)中間件監(jiān)控數(shù)據(jù),寫入系統(tǒng)數(shù)據(jù)庫;二是從系統(tǒng)數(shù)據(jù)庫中讀出歷史監(jiān)控數(shù)據(jù),加以處理以實現(xiàn)高級統(tǒng)計功能。
從監(jiān)控數(shù)據(jù)采集模塊獲取到的應(yīng)用服務(wù)中間件運行狀態(tài)數(shù)據(jù),在監(jiān)控數(shù)據(jù)處理模塊匯聚,數(shù)據(jù)處理模塊按照監(jiān)控系統(tǒng)數(shù)據(jù)庫表單定義字段,將監(jiān)控匯聚數(shù)據(jù)生成結(jié)構(gòu)化的運行狀態(tài)記錄,應(yīng)用JDBC(Java database connectivity)技術(shù)寫入指定的系統(tǒng)數(shù)據(jù)庫(SQL Server 2005)表單,實現(xiàn)監(jiān)控數(shù)據(jù)持久化。
數(shù)據(jù)是重要的資源,通過對監(jiān)控數(shù)據(jù)的分析,可以得出許多有用的結(jié)論,作為判斷決策的依據(jù)。監(jiān)控數(shù)據(jù)處理模塊的另一個功能是從系統(tǒng)數(shù)據(jù)庫中應(yīng)用JDBC技術(shù)抽取出記錄數(shù)據(jù),作為高級統(tǒng)計應(yīng)用的輸入,經(jīng)過高級統(tǒng)計處理后,可以得出中間件運行狀態(tài)趨勢預(yù)測以及預(yù)防對策等有效信息。
南寧供電局生產(chǎn)MIS中,某Tomcat應(yīng)用節(jié)點某一時段堆內(nèi)存使用率數(shù)據(jù),見表1。
表1 Tomcat應(yīng)用節(jié)點堆內(nèi)存使用情況
監(jiān)控數(shù)據(jù)展示模塊是監(jiān)控系統(tǒng)向系統(tǒng)用戶傳輸應(yīng)用服務(wù)中間件運行監(jiān)控數(shù)據(jù)的單工通道,模塊采用圖形化技術(shù)直觀地顯示各類監(jiān)控信息,以便系統(tǒng)用戶實時了解應(yīng)用服務(wù)中間件運行狀態(tài)以采取正確的應(yīng)對措施[4],如圖5所示。
監(jiān)控控制模塊是監(jiān)控系統(tǒng)人機交互的接口,系統(tǒng)管理員通過控制模塊向監(jiān)控系統(tǒng)發(fā)送預(yù)設(shè)的系統(tǒng)指令,系統(tǒng)收到指令后,解析指令以及指令參數(shù),執(zhí)行系統(tǒng)管理員指令,并將指令執(zhí)行結(jié)果通過監(jiān)控模塊反饋系統(tǒng)管理員,完成一次人機交互。
在監(jiān)控控制模塊中,預(yù)設(shè)系統(tǒng)指令采用的是帶參數(shù)的命令行模式,即指令字符串后拼接參數(shù)名和參數(shù)值。
新建監(jiān)控線程指令:new-a 127.0.0.1-p 10091-dba 127.0.0.1-dbp 20000。
監(jiān)控系統(tǒng)解析指令類型和指令參數(shù)后,指令執(zhí)行處理通過函數(shù)形式實現(xiàn),函數(shù)形式保證了系統(tǒng)指令執(zhí)行處理的可拓展性。
監(jiān)控系統(tǒng)通過此模塊遠程控制應(yīng)用服務(wù)中間件,遠程控制操作類型當(dāng)前主要有啟動、終止和重啟3種。啟動操作實現(xiàn)的原理是,調(diào)用Tomcat批處理啟動文件startup.bat;終止操作實現(xiàn)的原理是通過Tomcat監(jiān)聽端口號查詢出該Tomcat進程的ID號,調(diào)用Windows操作系統(tǒng)命令taskkill終止該進程ID號的Tomcat;重啟操作實現(xiàn)是將Tomcat調(diào)用終止操作后,再調(diào)用啟動操作。
圖5 監(jiān)控數(shù)據(jù)展示模塊
對外接口模塊取決于對外接口系統(tǒng),針對不同的接口系統(tǒng),監(jiān)控系統(tǒng)的對外接口模塊亦有相應(yīng)變化。在南寧供電局生產(chǎn)MIS中,對外接口系統(tǒng)是Radware負載均衡器,監(jiān)控系統(tǒng)與Radware交互,實時更新應(yīng)用服務(wù)中間件Tomcat集群中可用單體信息,保證Radware的分流服務(wù)均指向可用的Tomcat[5]。
Radware與監(jiān)控系統(tǒng)交互如圖6所示。Radware接口機制的實現(xiàn)是基于TCP/IP自定義網(wǎng)絡(luò)傳輸協(xié)議交互:對于一個Tomcat,Radware系統(tǒng)中可設(shè)定一個 IP地址、TCP端口和時間間隔作為接口屬性,Radware向指定IP地址的指定TCP端口以一定的時間間隔發(fā)送“detect”消息,監(jiān)控系統(tǒng)中該Tomcat運行狀態(tài)正常時,對外接口模塊向 Radware回發(fā)“succeed”消息,如果該 Tomcat運行狀態(tài)非正常時,對外接口模塊回發(fā)“failed”消息,網(wǎng)絡(luò)傳輸交互完成。
南寧供電局J2EE應(yīng)用服務(wù)中間件監(jiān)控系統(tǒng)開發(fā)完成后,在技術(shù)上實現(xiàn)了以下幾點突破。
·深度了解了J2EE應(yīng)用服務(wù)中間件運行機制以及技術(shù)體系,應(yīng)用JMX技術(shù)實現(xiàn)對J2EE應(yīng)用服務(wù)中間件運行參數(shù)數(shù)據(jù)監(jiān)控,實時掌握J(rèn)2EE應(yīng)用服務(wù)中間件運行狀態(tài)。
圖6 Radware與監(jiān)控系統(tǒng)交互
·監(jiān)控系統(tǒng)內(nèi)模塊功能劃分清晰合理,模塊間高聚合、低耦合,體現(xiàn)了 MVC(model,view,controller)模式軟件設(shè)計典范。
·監(jiān)控系統(tǒng)對外接口設(shè)計規(guī)范、兼容性強,系統(tǒng)間數(shù)據(jù)流轉(zhuǎn)通暢,數(shù)據(jù)共享程度高。在監(jiān)控系統(tǒng)基礎(chǔ)上與其他系統(tǒng)靈活集成,功能對接。
·實現(xiàn)了系統(tǒng)級別的自動化程序監(jiān)控,以信息化的方
式提升供電企業(yè)的信息運維水平。
南寧供電局J2EE應(yīng)用服務(wù)中間件監(jiān)控系統(tǒng),在技術(shù)上仍有以下拓展空間。
·數(shù)據(jù)加密。無論是通信傳輸中的數(shù)據(jù),還是持久層存儲數(shù)據(jù),都需做到數(shù)據(jù)加密,確保數(shù)據(jù)安全。
·趨勢分析。針對系統(tǒng)獲取到的大量J2EE應(yīng)用服務(wù)中間件運行數(shù)據(jù)統(tǒng)計分析,進而實現(xiàn)中間件運行狀態(tài)趨勢預(yù)測以及對策預(yù)防等高級功能。
·機器學(xué)習(xí)智能故障處理。應(yīng)用機器學(xué)習(xí)技術(shù),對故障處理操作建模,分析每次故障處理控制信息,操作目標(biāo)參數(shù)回歸,最終實現(xiàn)自動故障處理。
1 高張,康小軍.提高Tomcat服務(wù)器運行性能的研究.計算機與數(shù)字工程,2008(10):153~154
2 孫仁鵬,何淼.Tomcat性能監(jiān)視和調(diào)優(yōu)研究.軟件導(dǎo)論,2012(12):56~59
3 林泊,周明輝,劉天成等.一個J2EE應(yīng)用服務(wù)器的Web容器集成框架.軟件學(xué)報,2006(5):26~28
4 田珂,謝世波,方馬.J2EE數(shù)據(jù)持久層的解決方案.計算機工程,2003(22):102~103
5 竇蕾,袁臻,劉冬梅.基于構(gòu)件的中間件技術(shù)J2EE.計算機科學(xué),2004(6):98~102