套用古龍武俠小說(shuō)套路來(lái)說(shuō),代理服務(wù)技術(shù)是一門很古老的技術(shù)姿骏,是在互聯(lián)網(wǎng)早期出現(xiàn)就使用的技術(shù)糖声。一般實(shí)現(xiàn)代理技術(shù)的方式就是在服務(wù)器上安裝代理服務(wù)軟件,讓其成為一個(gè)代理服務(wù)器分瘦,從而實(shí)現(xiàn)代理技術(shù)蘸泻。常用的代理技術(shù)分為正向代理、反向代理和透明代理嘲玫。本文就是針對(duì)這三種代理來(lái)講解一些基本原理和具體的適用范圍悦施,便于大家更深入理解代理服務(wù)技術(shù)。
最后去团,如果大家如果在自學(xué)遇到困難抡诞,想找一個(gè)java的學(xué)習(xí)環(huán)境,可以加入我們的java學(xué)習(xí)圈土陪,點(diǎn)擊我加入吧昼汗,會(huì)節(jié)約很多時(shí)間,減少很多在學(xué)習(xí)中遇到的難題鬼雀。
一:正向代理(Forward Proxy)
一般情況下顷窒,如果沒(méi)有特別說(shuō)明,代理技術(shù)默認(rèn)說(shuō)的是正向代理技術(shù)源哩。關(guān)于正向代理的概念如下:正向代理(forward)是一個(gè)位于客戶端【用戶A】和原始服務(wù)器(origin server)【服務(wù)器B】之間的服務(wù)器【代理服務(wù)器Z】鞋吉,為了從原始服務(wù)器取得內(nèi)容,用戶A向代理服務(wù)器Z發(fā)送一個(gè)請(qǐng)求并指定目標(biāo)(服務(wù)器B)励烦,然后代理服務(wù)器Z向服務(wù)器B轉(zhuǎn)交請(qǐng)求并將獲得的內(nèi)容返回給客戶端谓着。客戶端必須要進(jìn)行一些特別的設(shè)置才能使用正向代理崩侠。
(圖1.1)
從上面的概念中漆魔,我們看出坷檩,文中所謂的正向代理就是代理服務(wù)器替代訪問(wèn)方【用戶A】去訪問(wèn)目標(biāo)服務(wù)器【服務(wù)器B】這就是正向代理的意義所在。而為什么要用代理服務(wù)器去代替訪問(wèn)方【用戶A】去訪問(wèn)服務(wù)器B呢改抡?這就要從代理服務(wù)器使用的意義說(shuō)起矢炼。使用正向代理服務(wù)器作用主要有以下幾點(diǎn):
1.訪問(wèn)本無(wú)法訪問(wèn)的服務(wù)器B,如下圖1.2
(圖1.2)
我們拋除復(fù)雜的網(wǎng)絡(luò)路由情節(jié)來(lái)看圖1.2阿纤,假設(shè)圖中路由器從左到右命名為R1,R2句灌。假設(shè)最初用戶A要訪問(wèn)服務(wù)器B需要經(jīng)過(guò)R1和R2路由器這樣一個(gè)路由節(jié)點(diǎn),如果路由器R1或者路由器R2發(fā)生故障欠拾,那么就無(wú)法訪問(wèn)服務(wù)器B了胰锌。但是如果用戶A讓代理服務(wù)器Z去代替自己訪問(wèn)服務(wù)器B,由于代理服務(wù)器Z沒(méi)有在路由器R1或R2節(jié)點(diǎn)中藐窄,而是通過(guò)其它的路由節(jié)點(diǎn)訪問(wèn)服務(wù)器B资昧,那么用戶A就可以得到服務(wù)器B的數(shù)據(jù)了。
2.加速訪問(wèn)服務(wù)器B
這種說(shuō)法目前不像以前那么流行了荆忍,主要是帶寬流量的飛速發(fā)展格带。早期的正向代理中,很多人使用正向代理就是提速刹枉。還是如圖1.2假設(shè)用戶A到服務(wù)器B叽唱,經(jīng)過(guò)R1路由器和R2路由器,而R1到R2路由器的鏈路是一個(gè)低帶寬鏈路微宝。而用戶A到代理服務(wù)器Z棺亭,從代理服務(wù)器Z到服務(wù)器B都是高帶寬鏈路。那么很顯然就可以加速訪問(wèn)服務(wù)器B了蟋软。
3.Cache作用
Cache(緩存)技術(shù)和代理服務(wù)技術(shù)是緊密聯(lián)系的(不光是正向代理镶摘,反向代理也使用了Cache(緩存)技術(shù)。還如上圖所示钟鸵,如果在用戶A訪問(wèn)服務(wù)器B某數(shù)據(jù)J之前钉稍,已經(jīng)有人通過(guò)代理服務(wù)器Z訪問(wèn)過(guò)服務(wù)器B上得數(shù)據(jù)J,那么代理服務(wù)器Z會(huì)把數(shù)據(jù)J保存一段時(shí)間棺耍,如果有人正好取該數(shù)據(jù)J,那么代理服務(wù)器Z不再訪問(wèn)服務(wù)器B种樱,而把緩存的數(shù)據(jù)J直接發(fā)給用戶A蒙袍。這一技術(shù)在Cache中術(shù)語(yǔ)就叫Cache命中。如果有更多的像用戶A的用戶來(lái)訪問(wèn)代理服務(wù)器Z嫩挤,那么這些用戶都可以直接從代理服務(wù)器Z中取得數(shù)據(jù)J害幅,而不用千里迢迢的去服務(wù)器B下載數(shù)據(jù)了。
4.客戶端訪問(wèn)授權(quán)
這方面的內(nèi)容現(xiàn)今使用的還是比較多的岂昭,例如一些公司采用ISA SERVER做為正向代理服務(wù)器來(lái)授權(quán)用戶是否有權(quán)限訪問(wèn)互聯(lián)網(wǎng)以现。
(圖1.3)
圖1.3防火墻作為網(wǎng)關(guān),用來(lái)過(guò)濾外網(wǎng)對(duì)其的訪問(wèn)。假設(shè)用戶A和用戶B都設(shè)置了代理服務(wù)器邑遏,用戶A允許訪問(wèn)互聯(lián)網(wǎng)佣赖,而用戶B不允許訪問(wèn)互聯(lián)網(wǎng)(這個(gè)在代理服務(wù)器Z上做限制)這樣用戶A因?yàn)槭跈?quán),可以通過(guò)代理服務(wù)器訪問(wèn)到服務(wù)器B记盒,而用戶B因?yàn)闆](méi)有被代理服務(wù)器Z授權(quán)憎蛤,所以訪問(wèn)服務(wù)器B時(shí),數(shù)據(jù)包會(huì)被直接丟棄纪吮。
5.隱藏訪問(wèn)者的行蹤
如下圖1.4 我們可以看出服務(wù)器B并不知道訪問(wèn)自己的實(shí)際是用戶A俩檬,因?yàn)榇矸?wù)器Z代替用戶A去直接與服務(wù)器B進(jìn)行交互。如果代理服務(wù)器Z被用戶A完全控制(或不完全控制)碾盟,會(huì)慣以“肉雞”術(shù)語(yǔ)稱呼棚辽。
(圖1.4)
總結(jié)下,正向代理是一個(gè)位于客戶端和原始服務(wù)器(origin server)之間的服務(wù)器冰肴,為了從原始服務(wù)器取得內(nèi)容晚胡,客戶端向代理發(fā)送一個(gè)請(qǐng)求并指定目標(biāo)(原始服務(wù)器),然后代理向原始服務(wù)器轉(zhuǎn)交請(qǐng)求并將獲得的內(nèi)容返回給客戶端嚼沿」琅蹋客戶端必須設(shè)置正向代理服務(wù)器,當(dāng)然前提是要知道正向代理服務(wù)器的IP地址骡尽,還有代理程序的端口遣妥。
二:反向代理(reverse proxy)
反向代理正好與正向代理相反,對(duì)于客戶端而言代理服務(wù)器就像是原始服務(wù)器攀细,并且客戶端不需要進(jìn)行任何特別的設(shè)置箫踩。客戶端向反向代理的命名空間(name-space)中的內(nèi)容發(fā)送普通請(qǐng)求谭贪,接著反向代理將判斷向何處(原始服務(wù)器)轉(zhuǎn)交請(qǐng)求境钟,并將獲得的內(nèi)容返回給客戶端。
使用反向代理服務(wù)器的作用如下:
1. 保護(hù)和隱藏原始資源服務(wù)器
(圖2.1)
用戶A始終認(rèn)為它訪問(wèn)的是原始服務(wù)器B而不是代理服務(wù)器Z俭识,但實(shí)用際上反向代理服務(wù)器接受用戶A的應(yīng)答慨削,從原始資源服務(wù)器B中取得用戶A的需求資源,然后發(fā)送給用戶A套媚。由于防火墻的作用缚态,只允許代理服務(wù)器Z訪問(wèn)原始資源服務(wù)器B。盡管在這個(gè)虛擬的環(huán)境下堤瘤,防火墻和反向代理的共同作用保護(hù)了原始資源服務(wù)器B玫芦,但用戶A并不知情。
2.負(fù)載均衡
(圖2.2)
當(dāng)反向代理服務(wù)器不止一個(gè)的時(shí)候本辐,我們甚至可以把它們做成集群桥帆,當(dāng)更多的用戶訪問(wèn)資源服務(wù)器B的時(shí)候医增,讓不同的代理服務(wù)器Z(x)去應(yīng)答不同的用戶,然后發(fā)送不同用戶需要的資源老虫。當(dāng)然反向代理服務(wù)器像正向代理服務(wù)器一樣擁有CACHE的作用叶骨,它可以緩存原始資源服務(wù)器B的資源,而不是每次都要向原始資源服務(wù)器B請(qǐng)求數(shù)據(jù)张遭,特別是一些靜態(tài)的數(shù)據(jù)邓萨,比如圖片和文件,如果這些反向代理服務(wù)器能夠做到和用戶X來(lái)自同一個(gè)網(wǎng)絡(luò)菊卷,那么用戶X訪問(wèn)反向代理服務(wù)器X缔恳,就會(huì)得到很高質(zhì)量的速度。這正是CDN技術(shù)的核心洁闰。
(圖2.3)
我們并不是講解CDN歉甚,所以去掉了CDN最關(guān)鍵的核心技術(shù)智能DNS。只是展示CDN技術(shù)實(shí)際上利用的正是反向代理原理這塊扑眉。反向代理結(jié)論與正向代理正好相反纸泄,對(duì)于客戶端而言它就像是原始服務(wù)器,并且客戶端不需要進(jìn)行任何特別的設(shè)置腰素∑覆茫客戶端向反向代理的命名空間(name-space)中的內(nèi)容發(fā)送普通請(qǐng)求,接著反向代理將判斷向何處(原始服務(wù)器)轉(zhuǎn)交請(qǐng)求弓千,并將獲得的內(nèi)容返回給客戶端衡便,就像這些內(nèi)容原本就是它自己的一樣⊙蠓茫基本上镣陕,網(wǎng)上做正反向代理的程序很多,能做正向代理的軟件大部分也可以做反向代理姻政。開(kāi)源軟件中最流行的就是squid呆抑,既可以做正向代理,也有很多人用來(lái)做反向代理的前端服務(wù)器汁展。另外MS ISA也可以用來(lái)在WINDOWS平臺(tái)下做正向代理鹊碍。反向代理中最主要的實(shí)踐就是WEB服務(wù),近些年來(lái)最火的就是Nginx了善镰。網(wǎng)上有人說(shuō)NGINX不能做正向代理妹萨,其實(shí)是不對(duì)的。NGINX也可以做正向代理炫欺,不過(guò)用的人比較少了。
三:透明代理
如果把正向代理熏兄、反向代理和透明代理按照人類血緣關(guān)系來(lái)劃分的話品洛。那么正向代理和透明代理是很明顯堂親關(guān)系树姨,而正向代理和反向代理就是表親關(guān)系了。
透明代理的意思是客戶端根本不需要知道有代理服務(wù)器的存在桥状,它改編你的request fields(報(bào)文)帽揪,并會(huì)傳送真實(shí)IP。注意辅斟,加密的透明代理則是屬于匿名代理转晰,意思是不用設(shè)置使用代理了。
透明代理實(shí)踐的例子就是時(shí)下很多公司使用的行為管理軟件士飒。如下圖3.1
(圖3.1)
用戶A和用戶B并不知道行為管理設(shè)備充當(dāng)透明代理行為查邢,當(dāng)用戶A或用戶B向服務(wù)器A或服務(wù)器B提交請(qǐng)求的時(shí)候,透明代理設(shè)備根據(jù)自身策略攔截并修改用戶A或B的報(bào)文酵幕,并作為實(shí)際的請(qǐng)求方扰藕,向服務(wù)器A或B發(fā)送請(qǐng)求,當(dāng)接收信息回傳芳撒,透明代理再根據(jù)自身的設(shè)置把允許的報(bào)文發(fā)回至用戶A或B邓深,如上圖,如果透明代理設(shè)置不允許訪問(wèn)服務(wù)器B笔刹,那么用戶A或者用戶B就不會(huì)得到服務(wù)器B的數(shù)據(jù)芥备。