摘要:人工監(jiān)測(cè)網(wǎng)絡(luò)運(yùn)行狀態(tài)費(fèi)時(shí)費(fèi)力效率低下。為及時(shí)發(fā)現(xiàn)網(wǎng)絡(luò)故障,減輕值班人員工作強(qiáng)度,提高自動(dòng)化監(jiān)測(cè)能力,基于java語(yǔ)言,利用InetSocketAddress類(lèi)的相關(guān)方法,配合數(shù)據(jù)庫(kù),實(shí)現(xiàn)了對(duì)網(wǎng)絡(luò)中的重要信息節(jié)點(diǎn)如交換機(jī)、服務(wù)器等硬件設(shè)備,以及重要的業(yè)務(wù)平臺(tái)和服務(wù)運(yùn)行狀態(tài)的自動(dòng)監(jiān)測(cè),并在監(jiān)測(cè)到故障時(shí)能自動(dòng)發(fā)送告警短信通知相關(guān)人員。
關(guān)鍵詞:java;網(wǎng)絡(luò)狀態(tài):自動(dòng)監(jiān)測(cè);自動(dòng)告警
中圖分類(lèi)號(hào):TP311.1 文獻(xiàn)標(biāo)識(shí)碼:A
文章編號(hào):1009-3044(2020)05-0035-03
開(kāi)放科學(xué)(資源服務(wù))標(biāo)識(shí)碼(OSID):
1 概述
隨著氣象業(yè)務(wù)現(xiàn)代化的深入發(fā)展,氣象信息化集成度越來(lái)越高,對(duì)實(shí)效性的要求也更加嚴(yán)格。氣象數(shù)據(jù)和報(bào)文傳輸?shù)葮I(yè)務(wù)對(duì)網(wǎng)絡(luò)的穩(wěn)定性也相應(yīng)的提出了更高的要求,這意味著信息網(wǎng)絡(luò)運(yùn)維人員必須要能及時(shí)發(fā)現(xiàn)問(wèn)題并能在第一時(shí)間處理問(wèn)題。故障發(fā)現(xiàn)的越及時(shí),處理故障的余地越大。在以往單純依靠人工巡檢來(lái)監(jiān)測(cè)網(wǎng)絡(luò)運(yùn)行狀態(tài)費(fèi)時(shí)費(fèi)力且效率低下,還使得業(yè)務(wù)值班人員壓力非常之大,疲于應(yīng)付。目前的網(wǎng)管軟件在應(yīng)用上其功能點(diǎn)主要側(cè)重于網(wǎng)絡(luò)維護(hù)功能方面,如網(wǎng)絡(luò)拓?fù)鋱D顯示、線(xiàn)路流量統(tǒng)計(jì)、ip地址統(tǒng)計(jì)等。而在網(wǎng)絡(luò)通斷狀態(tài)的檢測(cè),F(xiàn)TP、ns、Tomcat等網(wǎng)絡(luò)服務(wù)運(yùn)行監(jiān)測(cè)、告警短信號(hào)碼定制等方面不能靈活的按照網(wǎng)絡(luò)管理者的意愿進(jìn)行靈活定制。基于上述原因,開(kāi)發(fā)一套自動(dòng)的、可定制化的監(jiān)測(cè)和告警系統(tǒng)(以下簡(jiǎn)稱(chēng)監(jiān)測(cè)系統(tǒng)),用以實(shí)現(xiàn)對(duì)重要的信息網(wǎng)絡(luò)節(jié)點(diǎn)、服務(wù)器以及重要的業(yè)務(wù)平臺(tái)服務(wù)運(yùn)行狀態(tài)監(jiān)測(cè)勢(shì)在必行。
目前主流的短信發(fā)送技術(shù)主要有兩種:使用自購(gòu)設(shè)備“短信貓(GMS Modem)”實(shí)現(xiàn)短信發(fā)送;利用通信運(yùn)營(yíng)商(如中國(guó)聯(lián)通)提供的webservice接口實(shí)現(xiàn)短信發(fā)送。監(jiān)測(cè)系統(tǒng)采用的短信告警技術(shù)也正是這兩種方式?!岸绦咆垺钡膬?yōu)點(diǎn)在于短信發(fā)送端位于網(wǎng)絡(luò)內(nèi)部,短信發(fā)送操作在內(nèi)網(wǎng)完成,減少傳輸間網(wǎng)絡(luò)損耗。webservice方式的優(yōu)點(diǎn)在于發(fā)送快速,編輯好模板之后,可快速實(shí)現(xiàn)大量的短信發(fā)送。兩種方式互為備份,一種方式發(fā)送失敗后可以轉(zhuǎn)至另一種方式繼續(xù)發(fā)送短信,確保告警短信正常及時(shí)送達(dá)至管理員手機(jī)上。監(jiān)測(cè)系統(tǒng)開(kāi)發(fā)完成后,可以實(shí)現(xiàn)對(duì)重要信息節(jié)點(diǎn)和服務(wù)器以及重要業(yè)務(wù)平臺(tái)、服務(wù)的狀態(tài)監(jiān)測(cè)和告警,不僅能提高信息運(yùn)維部門(mén)的反應(yīng)速度,也能極大地減輕值班員的勞動(dòng)強(qiáng)度。
2 系統(tǒng)設(shè)計(jì)
2.1 功能設(shè)計(jì)
監(jiān)測(cè)系統(tǒng)運(yùn)行流程圖如圖1所示。
監(jiān)測(cè)系統(tǒng)運(yùn)行的具體步驟是:首先初始化配置數(shù)據(jù),例如,將要被監(jiān)測(cè)的設(shè)備ip地址及端口號(hào)、與設(shè)備相關(guān)聯(lián)的管理員電話(huà)號(hào)碼等數(shù)據(jù)。配置數(shù)據(jù)初始化出現(xiàn)異常時(shí),例如從數(shù)據(jù)庫(kù)讀 取配置數(shù)據(jù)失敗,則將錯(cuò)誤信息通過(guò)短信發(fā)送給管理員進(jìn)行處理,并將檢查結(jié)果寫(xiě)入日志備查。配置數(shù)據(jù)初始化成功后,根據(jù)配置數(shù)據(jù)選擇待監(jiān)測(cè)ip的檢查方法。如設(shè)備配置數(shù)據(jù)中端口號(hào)為0,則表示只對(duì)該設(shè)備的網(wǎng)絡(luò)可達(dá)性進(jìn)行監(jiān)測(cè)。若端口號(hào)不為0,表示需要監(jiān)測(cè)該端口號(hào)上的服務(wù)是否正常運(yùn)行。最后如果判斷ip或者端口不可達(dá),則將觸發(fā)告警,由短信告警模塊發(fā)送告警信息給相關(guān)管理員處理。無(wú)論本次監(jiān)測(cè)有無(wú)問(wèn)題,最后的監(jiān)測(cè)結(jié)果都將寫(xiě)人數(shù)據(jù)庫(kù)作為運(yùn)行日志備查。
2.2 元數(shù)據(jù)設(shè)計(jì)
監(jiān)測(cè)系統(tǒng)數(shù)據(jù)初始化的工作是讀取待監(jiān)測(cè)的ip列表,端口列表以及與ip相關(guān)聯(lián)的管理員的電話(huà)號(hào)碼。這些相關(guān)數(shù)據(jù)被稱(chēng)作監(jiān)測(cè)系統(tǒng)的元數(shù)據(jù),其在數(shù)據(jù)庫(kù)中持久化保存,方便監(jiān)測(cè)系統(tǒng)獲取,以及修改配置數(shù)據(jù),對(duì)監(jiān)測(cè)對(duì)象進(jìn)行調(diào)整。 元數(shù)據(jù)主要分為兩類(lèi),分別以表的形式存放于數(shù)據(jù)庫(kù)中,表分別是“被監(jiān)測(cè)設(shè)備配置表”以及“管理員電話(huà)號(hào)碼配置表”。其中“被監(jiān)測(cè)設(shè)備配置表”中存儲(chǔ)的是被監(jiān)測(cè)的網(wǎng)絡(luò)設(shè)備的狀態(tài)配置信息。詳情見(jiàn)表1“被監(jiān)測(cè)設(shè)備配置表”。
其中,IpAddress表示被監(jiān)測(cè)設(shè)備的ip地址,OpenPort表示該設(shè)備開(kāi)放出可被監(jiān)測(cè)的端口,0”表示無(wú)端口開(kāi)放,需要用ping的方式來(lái)確定該ip地址是否可達(dá),從而判定此ip是否存活。其他數(shù)字表示此ip上開(kāi)放有相應(yīng)的服務(wù),需要監(jiān)測(cè)該端口是否在正常,以判斷該設(shè)備及服務(wù)是否正常。IsValid表示該設(shè)備否要被監(jiān)控,存入值“0”或者“l(fā)”。0代表此ip不需要再監(jiān)測(cè)。Administrator表示該設(shè)備被檢出問(wèn)題后要通知的部門(mén)所屬。若該設(shè)備有多個(gè)部門(mén)管轄,可配置多個(gè)部門(mén),用“,”隔開(kāi)即可。
“管理員信息配置表”內(nèi)存儲(chǔ)的是待監(jiān)測(cè)設(shè)備的管理員配置,詳情見(jiàn)表2管理員信息配置表。
其中,“AlarmCategory”列中存儲(chǔ)的信息表示配置表中本條記錄歸屬的業(yè)務(wù)種類(lèi)。例如“network”表示監(jiān)測(cè)系統(tǒng)的元數(shù)據(jù)配置信息。“Administrator”列用于標(biāo)識(shí)接收短信告警的相關(guān)部門(mén),與表1中“Administator”列相對(duì)應(yīng)?!癙honeNo”列顧名思義,就是用來(lái)接收告警短信的號(hào)碼??紤]到一個(gè)部門(mén)可能要多個(gè)管理員需要接收告警短信,例如“青島”,需要有兩個(gè)網(wǎng)絡(luò)管理員同時(shí)接收告警短信,則可以在此列配置多個(gè)電話(huà)號(hào)碼,用英文逗號(hào)“·”隔開(kāi)即可。
2.3 數(shù)據(jù)庫(kù)表設(shè)計(jì)
數(shù)據(jù)庫(kù)用來(lái)存儲(chǔ)監(jiān)測(cè)系統(tǒng)運(yùn)行所需要的配置數(shù)據(jù)和監(jiān)測(cè)系統(tǒng)運(yùn)行日志。元數(shù)據(jù)確定完畢后,在數(shù)據(jù)庫(kù)中創(chuàng)建兩個(gè)數(shù)據(jù)表來(lái)存儲(chǔ)元數(shù)據(jù)。以“被監(jiān)測(cè)設(shè)備配置表”為例,建表語(yǔ)句如下:
create table ipconfig(
id VARCHAR(32) primary key not null comment‘主鍵,in-sertdatetime DATE default current_timestamp comment‘記錄插入時(shí)間,
ipAddress VARCHAR(15) not null comment‘被監(jiān)測(cè)IP地址,
openPort INTEGER not null default o comment‘端口號(hào),默認(rèn)0,
isValid CHAR(1) default 'O, comment‘是否有效,默認(rèn)無(wú)效,1代表有效,
editBy VARCHAR(IO) default 'admin, comment‘操作人員,
admin VARCHAR(150) not null comment‘故障時(shí)通知所屬單位)
表創(chuàng)建完畢并初始化數(shù)據(jù)后,監(jiān)測(cè)系統(tǒng)即可從表中讀取配置數(shù)據(jù)進(jìn)行處理。若需要對(duì)監(jiān)測(cè)ip地址、端口等數(shù)據(jù)進(jìn)行變更,只需對(duì)元數(shù)據(jù)配置表進(jìn)行增刪改操作即可,監(jiān)測(cè)系統(tǒng)在每一次運(yùn)行時(shí)均可根據(jù)讀取新的配置數(shù)據(jù)進(jìn)行監(jiān)測(cè)。
2.4 代碼實(shí)現(xiàn)
2.4.1 監(jiān)測(cè)功能代碼實(shí)現(xiàn)
Java是一門(mén)面向?qū)ο蟮恼Z(yǔ)言。類(lèi)是屬性和操作屬性的方法的集合,屬性和操作屬性的方法一起描述對(duì)象的狀態(tài)和行為。在監(jiān)測(cè)系統(tǒng)中,待監(jiān)測(cè)的設(shè)備、服務(wù)即可看作一個(gè)類(lèi),用IpData-Conf來(lái)表示。該類(lèi)具有ip地址、開(kāi)放端口號(hào)、是否有效、管理員等屬性,同時(shí)也具有各個(gè)屬性的getter方法,如表3所示:
在完成數(shù)據(jù)庫(kù)表創(chuàng)建并填人初始化數(shù)據(jù)后,系統(tǒng)即可開(kāi)始對(duì)進(jìn)行監(jiān)測(cè)。系統(tǒng)運(yùn)行流程如圖1所示,其偽代碼如下所示:
List ipDataConfs= loadProperties0;
if (ipDataConfs.size0==0){
alertModule0;
return;1
ipDataConfs.forEach(ipDataConfo{
if(ipDataConf.getOpenPort0==0){
boolean checkResult= checkNetWorkBylp0;
if (!checkResult){
alertModule0;
)
】else{
boolean checkResult= checkNetorkByPort0;
if(! checkResult){ alertModule0;】
¨)
loadProperties0函數(shù)完成監(jiān)測(cè)系統(tǒng)初始化的功能,其初始化的是ipDataConf類(lèi),并將該類(lèi)存儲(chǔ)在一個(gè)List結(jié)構(gòu)中,若初始化配置數(shù)據(jù)后返回的List大小為0,表示初始化配置數(shù)據(jù)失敗,將直接觸發(fā)告警模塊并退出本次監(jiān)測(cè)操作。 若初始化配置數(shù)據(jù)成功,則開(kāi)始用循環(huán)遍歷該對(duì)象,輪流取出IpDataConf類(lèi),通過(guò)getOpenPort0方法獲取該ip對(duì)應(yīng)配置的端口,若獲取到的端口值為0,表示該ip僅僅用checkNetwork-Bylp0監(jiān)測(cè)網(wǎng)絡(luò)可達(dá)性即可。若不為0,表示該ip上開(kāi)放有服務(wù)需要監(jiān)測(cè),則使用checkNetworkByPort0方法來(lái)進(jìn)行監(jiān)測(cè)。
在進(jìn)行網(wǎng)絡(luò)可達(dá)性監(jiān)測(cè)時(shí),checkNetWorkBylp0函數(shù)用In-etSocketAddress類(lèi)以及該類(lèi)的isReachable0方法,InetSocketAd-dress類(lèi)是SocketAddress(抽象)類(lèi)的子類(lèi),其實(shí)現(xiàn)了ip套接字地址(ip地址+端口號(hào))。具體代碼如下:
InetSocketAddress socketAddress=
new InetSocketAddress(ipDataConf.getlp0,0);
return (socketAddress.getAddress0 1= null)
&& socketAddress.getAddressO.isReachable0;
監(jiān)測(cè)系統(tǒng)先根據(jù)ip地址來(lái)創(chuàng)建InetSocketAddress對(duì)象socketAddress,然后對(duì)socketAddress. getAddress0進(jìn)行非空判斷,并使用isReachable0方法判斷其網(wǎng)絡(luò)可達(dá)性。
在進(jìn)行端口監(jiān)測(cè)時(shí),checkNetworkService0方法采用的是socket對(duì)象的isConnect0方法:
Socket socket= net Socket0;
InetAddress inetAddress= new
InetAddress(ipD ataConf.getIpO.ipD ataConf.getOpenPort O);
socket.isConnect(remoteAddress,connectTimeOut);
return socket.isConnected0;
創(chuàng)建socket對(duì)象,再根據(jù)ip和端口創(chuàng)建一個(gè)InetSocketAd-dress對(duì)象,并使用socket的connect0方法去連接,如果連接失敗則觸發(fā)短信告警模塊,告警該ip上運(yùn)行的服務(wù)(即開(kāi)放的端口)失效,需要立即通知管理員檢查。
2.4.2 自動(dòng)短信告警模塊設(shè)計(jì)
考慮到存在這種情況:當(dāng)檢測(cè)到設(shè)備或者服務(wù)發(fā)生故障時(shí),如某地部署的路由器出現(xiàn)問(wèn)題,需要同時(shí)發(fā)送告警短信給該設(shè)備所屬地網(wǎng)絡(luò)管理員,以及上級(jí)網(wǎng)絡(luò)管理部門(mén)的網(wǎng)管員。而還存在一種情況是兩地的網(wǎng)管員都不止一個(gè)人需要接收告警短信。因此,就需要在表1待監(jiān)測(cè)ip及端口配置表中設(shè)置字段來(lái)存儲(chǔ)故障時(shí)需要通知的單位或者網(wǎng)管員代碼。然后在表2電話(huà)號(hào)碼配置表中設(shè)置字段來(lái)配置相應(yīng)管理員代碼的告警短信接收電話(huà)號(hào)碼,電話(huà)號(hào)碼可以不止一個(gè),中間用英文逗號(hào)隔開(kāi)即可。告警短信發(fā)送模塊可以識(shí)別并按照設(shè)定號(hào)碼分別發(fā)送告警短信。模塊的最終目的是要?jiǎng)?chuàng)建HashMap結(jié)構(gòu)的鏈表,其中存儲(chǔ)的都是要發(fā)給對(duì)應(yīng)Ke y 的所有告警信息。storePhoneMsg存儲(chǔ)的是接收告警短信的電話(huà)號(hào)碼及對(duì)應(yīng)的告警內(nèi)容列表。相關(guān)代碼如下:
HashMap0;
for (String mobile:mobileList){
if (storePhoneMsg.get(mobile)==null)(
List f'irstCreated= new ArrayList<>0;
firstCreated.add(msg);
storePhoneMsg.put(mobile, firstCreated);
) else{
List alreadyExist= storePhoneMsg.get(mobile);
alreadyExist.add(msg);
storePhoneMsg.put(phoneNo, alreadyExist);")
此段代碼的邏輯是:循環(huán)遍歷告警短信要通知的電話(huà)號(hào)碼列表,并檢查storePhoneMsg中是否已經(jīng)包含該電話(huà)號(hào)碼。若不包含,表示該電話(huà)號(hào)碼是第一次添加到storePhoneMsg中,創(chuàng)建List并添加到storePhoneMsg中;若包含,則表示該電話(huà)號(hào)碼已經(jīng)有告警短信信息存儲(chǔ)在storePhoneMsg中,那就需要取出該電話(huà)號(hào)碼對(duì)應(yīng)的List并將新的告警短信添加進(jìn)去,最后將該List放回storePhoneMsg中。如此循環(huán)添加完畢后,在用嵌套循環(huán)遍歷出所有告警短信并發(fā)送出去。代碼如下:
storePhoneMsg.forEach《mobile,msgList)→{
for(String alertMsg: msgList){
sendAlertMsg(mobile,alertMsg);
}})。
3 結(jié)論
本文利用基于Java的InetSocketAddress類(lèi)中的相關(guān)方法,結(jié)合數(shù)據(jù)庫(kù)存儲(chǔ),實(shí)現(xiàn)了可自主定義的網(wǎng)絡(luò)狀態(tài)監(jiān)測(cè)和故障自動(dòng)發(fā)現(xiàn)告警系統(tǒng),得出以下主要結(jié)論:
(1) Java語(yǔ)言有豐富的類(lèi)庫(kù)和方法,可較好地實(shí)現(xiàn)基于網(wǎng)絡(luò)的系統(tǒng)編程。
(2)自定義的網(wǎng)絡(luò)監(jiān)測(cè)系統(tǒng)可以較好地實(shí)現(xiàn)本地定制,可靈活的根據(jù)實(shí)際情況對(duì)監(jiān)測(cè)對(duì)象和告警對(duì)象進(jìn)行調(diào)整。
(3)監(jiān)測(cè)系統(tǒng)總體運(yùn)行平穩(wěn)良好,有故障能及時(shí)發(fā)現(xiàn)并告警,較好地實(shí)現(xiàn)了系統(tǒng)設(shè)計(jì)的初衷。但偶爾會(huì)出現(xiàn)極少數(shù)的錯(cuò)誤告警,可能是因?yàn)榫W(wǎng)絡(luò)波動(dòng)引起,需要根據(jù)實(shí)際情況再進(jìn)行檢查,調(diào)整監(jiān)測(cè)參數(shù)。
(4)考慮在不侵入原有業(yè)務(wù)代碼的情況下,引入Redis,提高監(jiān)測(cè)系統(tǒng)初始化數(shù)據(jù)的速度,盡量減少與數(shù)據(jù)庫(kù)的數(shù)據(jù)交互,提高系統(tǒng)運(yùn)行效率。
參考文獻(xiàn):
[1]田春婷.基于Java Socket文字聊天系統(tǒng)的GUl實(shí)現(xiàn)【J].蘭州石化職業(yè)技術(shù)學(xué)院學(xué)報(bào),2019,19(2):11-15.
[2]陸鑫,王艷蓉,孫超,史豪杰,一種高性能多模式的內(nèi)存數(shù)據(jù)庫(kù)系統(tǒng)[J].計(jì)算機(jī)應(yīng)用與軟件,2019,36(1):94-98.
[3]余廣宏.實(shí)時(shí)數(shù)據(jù)庫(kù)技術(shù)的發(fā)展及應(yīng)用效果[J].電子技術(shù)與軟件工程,2016(20):185.
[4]鄭逸凡.Java多線(xiàn)程機(jī)制及其在socket編程中的應(yīng)用[J].赤峰學(xué)院學(xué)報(bào):自然科學(xué)版,2018,34(9):62-63.
[5]歐陽(yáng)宏基,李紅,宋笑雪.一種基于ES2SH框架的Java EE應(yīng)用架構(gòu)[J].實(shí)驗(yàn)室研究與探索,2018,37(10):157-162,167.
[6]喬嵐,基于MyBatis和Spring的JavaEE數(shù)據(jù)持久層的研究與應(yīng)用[J].信息與電腦,2017(8).
[7]何軍,陳倩怡.Vue+Springboot+Mybatis開(kāi)發(fā)消費(fèi)管理系統(tǒng)[J].電腦編程技巧與維護(hù),2019,404(2):89-90,104.
[8]王倩;鄧媛劫.基于Java Socket的網(wǎng)絡(luò)聊天系統(tǒng)的設(shè)計(jì)[J].電腦與信息技術(shù),2018,6(1):51-53.
[9]郭琳.分析Java語(yǔ)言與Java技術(shù)的應(yīng)用[Jl,電腦迷,2018,112(11):123.
【通聯(lián)編輯:梁書(shū)】
收稿日期:2019-11-09
基金項(xiàng)目:青島市氣象局青年科研專(zhuān)項(xiàng)
作者簡(jiǎn)介:王宜明(1981-),男,山東青島人,工程師,碩士,主要研究方向?yàn)閿?shù)據(jù)挖掘校驗(yàn)以及服務(wù)運(yùn)維。