林楠
摘 ?要:IPv4地址資源不足,共享IP一般采用NAT、代理、反向代理等方式,在客戶端數(shù)量較多的情況下,一般要考慮負載均衡與冗余的情況。文章介紹一種通過定期輪詢動態(tài)生成PAC腳本,從而達到數(shù)臺代理服務(wù)器的負載均衡與冗余的程序設(shè)計,具有低成本、操作簡單的特點。
關(guān)鍵詞:CSharp;PAC腳本;代理服務(wù)器;負載均衡;冗余
中圖分類號:TP393.06 ? ? 文獻標識碼:A ? ? ?文章編號:1006-8937(2015)06-0070-02
目前,IPv4的地址資源嚴重告急,在日常工作生活中,家庭或企業(yè)一般只能通過一個或幾個互聯(lián)網(wǎng)IP地址進行接入,其內(nèi)部網(wǎng)絡(luò)如需同時訪問互聯(lián)網(wǎng),一般使用路由器的NAT(Network Address Translation網(wǎng)絡(luò)地址轉(zhuǎn)換)功能或代理服務(wù)器來實現(xiàn)私網(wǎng)對互聯(lián)網(wǎng)的訪問。但是當內(nèi)部網(wǎng)絡(luò)計算機數(shù)量過多時,NAT會極大的影響整臺路由器的性能,單代理服務(wù)器也會因負載過大而經(jīng)常宕機。此時,我們一般采用以下幾種方式來解決這個問題:
①使用防火墻的NAT功能來替代路由器的NAT功能,防火墻的NAT功能是由硬件實現(xiàn),性能遠超路由器,可以支持大數(shù)量級的NAT。
②使用多臺代理服務(wù)器實現(xiàn)負載均衡。將用戶請求隨機發(fā)送到不同的代理服務(wù)器,以實現(xiàn)負載均衡。
基于成本等因素考慮,我們選擇方案2,通過部署多臺代理服務(wù)器,并在客戶端使用自動代理PAC腳本來實現(xiàn)代理服務(wù)器的負載均衡。
1 ?PAC腳本應(yīng)用
自動代理腳本(Proxy auto-config Script),簡稱PAC腳本。一個PAC文件就是一個Javascript腳本,可放置在服務(wù)器上,通過遠程WEB訪問,客戶端只需要在代理的使用自動檢測腳本中輸入PAC腳本的WEB地址,就可以使用該腳本,當代理服務(wù)器發(fā)生變化時,只需維護Web服務(wù)器上的PAC腳本,無需更改客戶端配置,方便后期維護,減輕運維成本與負擔(dān)。
PAC腳本包含一個FindProxyForURL函數(shù),IE通過傳入兩個參數(shù)url(訪問地址的完整URL)與host(訪問地址的主機名)來判斷是直接訪問,還是通過函數(shù)返回的代理服務(wù)器地址與端口來訪問。
PAC腳本可以通過取隨機數(shù)輕松實現(xiàn)負載均衡,但是當其中一臺服務(wù)器宕機時,腳本依舊有可能返回該服務(wù)器,從而導(dǎo)致客戶端訪問異常。于是我們考慮可以編寫一個程序,運行在存放PAC腳本的WEB服務(wù)器,通過定時對各代理服務(wù)器進行輪詢,根據(jù)代理服務(wù)器狀態(tài)變化,重寫PAC腳本。
2 ?程序總體設(shè)計
程序基于C#的Winform編寫,分為兩個模塊。
2.1 ?監(jiān)控模塊
程序設(shè)置一個timer定時器,定期對各代理服務(wù)器進行輪詢,根據(jù)輪詢結(jié)果決定是否重寫PAC腳本,并顯示輪詢結(jié)果,方便巡檢查看。輪詢采用TcpClinet.Connect方法來測試代理服務(wù)器是否正常工作,如圖1所示。
2.2 ?配置模塊
可對代理服務(wù)器地址、端口、輪詢間隔、PAC文件存放路徑與文件名等參數(shù)進行配置。配置文件采用XML格式保存,如圖2所示。
3 ?技術(shù)實現(xiàn)
3.1 ?連接測試
如直接使用TcpClient.Connect連接測試端口,當服務(wù)器不連通或端口未打開時,需要很長時間才能返回結(jié)果,捕獲So-
cketException異常。這里希望可以設(shè)定一個較短的時間獲取結(jié)果,超時則判斷連接失敗。
這里使用了ConnectorState.Completed.WaitOne(int millise-
condsTimeout,bool exitContext)函數(shù),在millisecondsTimeout內(nèi)未響應(yīng),則返回錯誤,退出線程。
3.2 ?文件寫入
FileStream對象表示在磁盤或網(wǎng)絡(luò)路徑上指向文件的流。這個類提供了在文件中讀寫字節(jié)的方法,經(jīng)常使用StreamRea-
der或StreamWriter執(zhí)行這些功能。FileMode.Create表示當文件不存在時直接創(chuàng)建文件,而文件已存在時刪除該文件,然后創(chuàng)建新文件。
3.3 ?XML讀寫
可擴展標記語言,簡稱XML,輕量級的數(shù)據(jù)存儲文件,規(guī)范統(tǒng)一,易于閱讀、擴展,可被幾乎所有的語言所支持。
程序使用XmlDocument來讀取XML文件。XML文件可視為由聲明(Declare),元素(Element),屬性(Attribute),文本(Text)等構(gòu)成的一個樹。第一個結(jié)點為根結(jié)點,每個結(jié)點均可以有自己的子結(jié)點??梢酝ㄟ^一系列屬性或方法得到這個結(jié)點的值或其它一些屬性。
3.4 ?功能控制
當監(jiān)控未開始時,可以重新加載代理服務(wù)器,但不能手動輪詢。當開始監(jiān)控時,可以手動輪詢,但不可以重新加載代理服務(wù)器。
4 ?后期功能擴展
后期可考慮對以下功能進行擴展,也可以根據(jù)實際需求,開發(fā)新的功能。
4.1 ?日志與備份
將輪詢結(jié)果、文件生成、更改配置等操作記錄在日志中備查,并在生成新的PAC文件與配置前,對原文件進行備份。
4.2 ?服 ?務(wù)
將程序安裝為服務(wù),可在WEB服務(wù)器啟動時自動運行。設(shè)置為只運行一個實例,避免不同用戶登錄重復(fù)運行,造成資源浪費。
4.3 ?異常提醒
運維人員可以根據(jù)輪詢顯示結(jié)果及時發(fā)現(xiàn)故障??煽紤]以發(fā)送短信等方式進行實時提醒,縮短故障發(fā)現(xiàn)周期,提高可靠性。
5 ?結(jié) ?語
本文提供一種思路,使用自動代理腳本PAC實現(xiàn)代理服務(wù)器的負載均衡,再編寫一個程序,通過定時輪詢檢測代理服務(wù)器的狀態(tài),根據(jù)狀態(tài)變化,動態(tài)生成PAC文件,實現(xiàn)代理服務(wù)器的冗余,低成本地解決代理服務(wù)器的負載均衡與冗余。
參考文獻:
[1] 董文江,胡軼,李健玲,等.PAC腳本在文獻代理數(shù)據(jù)庫中的應(yīng)用[J].甘肅科技,2006,(9).