- 隱藏服務(wù)器真實(shí)IP:使用反向代理叛本,可以對(duì)客戶(hù)端隱藏服務(wù)器的IP地址。
- 負(fù)載均衡:反向代理服務(wù)器可以做負(fù)載均衡攘已,根據(jù)所有真實(shí)服務(wù)器的負(fù)載情況炮赦,將客戶(hù)端請(qǐng)求分發(fā)到不同的真實(shí)服務(wù)器上。
- 提高訪問(wèn)速度:反向代理服務(wù)器可以對(duì)于靜態(tài)內(nèi)容及短時(shí)間內(nèi)有大量訪問(wèn)請(qǐng)求的動(dòng)態(tài)內(nèi)容提供緩存服務(wù)样勃,提高訪問(wèn)速度吠勘。
- 提供安全保障:反向代理服務(wù)器可以作為應(yīng)用層防火墻,為網(wǎng)站提供對(duì)基于Web的攻擊行為(例如DoS/DDoS)的防護(hù)峡眶,更容易排查惡意軟件等剧防。還可以為后端服務(wù)器統(tǒng)一提供加密和SSL加速(如SSL終端代理),提供HTTP訪問(wèn)認(rèn)證等辫樱。
代理模式(Proxy Pattern) :給某一個(gè)對(duì)象提供一個(gè)代理峭拘,并由代理對(duì)象控制對(duì)原目標(biāo)對(duì)象的引用。
在某些情況下狮暑,一個(gè)客戶(hù)不想或者不能直接引用一個(gè)對(duì)象鸡挠,此時(shí)可以通過(guò)一個(gè)稱(chēng)之為“代理”的第三者來(lái)實(shí)現(xiàn)間接引用。
代理對(duì)象可以在客戶(hù)端和目標(biāo)對(duì)象之間起到中介的作用搬男,并且可以通過(guò)代理對(duì)象去掉客戶(hù)不能看到的內(nèi)容和服務(wù)或者添加客戶(hù)需要的額外服務(wù)拣展。
所以,靜態(tài)代理和動(dòng)態(tài)代理的主要區(qū)別就是代理類(lèi)創(chuàng)建的時(shí)間不同缔逛。
靜態(tài)代理類(lèi):由程序員創(chuàng)建或由特定工具自動(dòng)生成源代碼备埃,再對(duì)其編譯。在程序運(yùn)行前褐奴,代理類(lèi)的.class文件就已經(jīng)存在了按脚。
動(dòng)態(tài)代理類(lèi):在程序運(yùn)行時(shí),運(yùn)用反射機(jī)制動(dòng)態(tài)創(chuàng)建而成敦冬。
靜態(tài)代理通常只代理一個(gè)類(lèi)辅搬,動(dòng)態(tài)代理是代理一個(gè)接口下的多個(gè)實(shí)現(xiàn)類(lèi)。靜態(tài)代理事先知道要代理的是什么脖旱,而動(dòng)態(tài)代理不知道要代理什么東西伞辛,只有在運(yùn)行時(shí)才知道烂翰。
使用靜態(tài)代理模式需要程序員手寫(xiě)很多代碼,這個(gè)過(guò)程是比較浪費(fèi)時(shí)間和精力的蚤氏。
一旦需要代理的類(lèi)中方法比較多甘耿,或者需要同時(shí)代理多個(gè)對(duì)象的時(shí)候,這無(wú)疑會(huì)增加很大的復(fù)雜度竿滨。
JDK動(dòng)態(tài)代理:java.lang.reflect 包中的Proxy類(lèi)和InvocationHandler接口提供了生成動(dòng)態(tài)代理類(lèi)的能力佳恬。
Cglib動(dòng)態(tài)代理:Cglib (Code Generation Library )是一個(gè)第三方代碼生成類(lèi)庫(kù),運(yùn)行時(shí)在內(nèi)存中動(dòng)態(tài)生成一個(gè)子類(lèi)對(duì)象從而實(shí)現(xiàn)對(duì)目標(biāo)對(duì)象功能的擴(kuò)展于游。
JDK的動(dòng)態(tài)代理有一個(gè)限制毁葱,就是使用動(dòng)態(tài)代理的對(duì)象必須實(shí)現(xiàn)一個(gè)或多個(gè)接口。如果想代理沒(méi)有實(shí)現(xiàn)接口的類(lèi)贰剥,就可以使用CGLIB實(shí)現(xiàn)倾剿。
使用JDK動(dòng)態(tài)代理的對(duì)象必須實(shí)現(xiàn)一個(gè)或多個(gè)接口
使用cglib代理的對(duì)象則無(wú)需實(shí)現(xiàn)接口,達(dá)到代理類(lèi)無(wú)侵入蚌成。
Cglib是一個(gè)強(qiáng)大的高性能的代碼生成包前痘,它可以在運(yùn)行期擴(kuò)展Java類(lèi)與實(shí)現(xiàn)Java接口。它廣泛的被許多AOP的框架使用担忧,例如Spring AOP和dynaop芹缔,為他們提供方法的interception(攔截)。
Cglib包的底層是通過(guò)使用一個(gè)小而快的字節(jié)碼處理框架ASM瓶盛,來(lái)轉(zhuǎn)換字節(jié)碼并生成新的類(lèi)最欠。不鼓勵(lì)直接使用ASM,因?yàn)樗枰銓?duì)JVM內(nèi)部結(jié)構(gòu)包括class文件的格式和指令集都很熟悉惩猫。
哪里能看到AOP的身手芝硬?
Java的動(dòng)態(tài)代理的最主要的用途就是應(yīng)用在各種框架中。因?yàn)?strong>使用動(dòng)態(tài)代理可以很方便的運(yùn)行期生成代理類(lèi)轧房,通過(guò)代理類(lèi)可以做很多事情拌阴,比如AOP,比如過(guò)濾器锯厢、攔截器等皮官。
在我們平時(shí)使用的框架中脯倒,像servlet的filter实辑、包括spring提供的aop以及struts2的攔截器都使用了動(dòng)態(tài)代理功能。我們?nèi)粘藻丢?吹降膍ybatis分頁(yè)插件剪撬,以及日志攔截、事務(wù)攔截悠反、權(quán)限攔截這些幾乎全部由動(dòng)態(tài)代理的身影残黑。