林楠

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