国产精品夜色视频一级区_hh99m福利毛片_国产一区二区成人久久免费影院_伊人久久大香线蕉综合影院75_国产精品久久果冻传媒

您的位置:首頁(yè) >聚焦 >

【世界時(shí)快訊】Go語(yǔ)言正/反向代理的姿勢(shì)

2022-11-09 16:19:51    來(lái)源:程序員客棧

先重溫一下什么叫反向代理,正向代理。

鵝廠二面,nginx回憶錄[1]


(資料圖)

所謂正向,反向代理取決于代理的是出站請(qǐng)求,還是入站請(qǐng)求。

正向代理:代理的出站請(qǐng)求, 客戶端能感知到代理程序,架構(gòu)上距離客戶端更近。反向代理:代理的是入站請(qǐng)求,客戶端認(rèn)為代理程序就是服務(wù)器,客戶端感知不到代理邏輯,架構(gòu)上距離服務(wù)端更近。


前幾天利用golang實(shí)現(xiàn)反向代理程序[2],引出了Host請(qǐng)求頭在反代中的關(guān)鍵作用。

代理程序預(yù)置upstream, 將節(jié)點(diǎn)對(duì)proxy.com的請(qǐng)求,轉(zhuǎn)發(fā)給upstream service。

packagemainimport("fmt""log""net/http""net/http/httputil")// 將對(duì)proxy.com/xxx/yyy的請(qǐng)求轉(zhuǎn)發(fā)到 www.baidu.com/xxx/yyyfuncReverseProxyHandler(whttp.ResponseWriter,r*http.Request){fmt.Println("receivearequestfrom:",r.RemoteAddr,r.Header)target:="www.baidu.com"director:=func(req*http.Request){req.URL.Scheme="https"req.URL.Host=targetreq.Host=target}proxy:=&httputil.ReverseProxy{Director:director}proxy.ServeHTTP(w,r)}funcmain(){fmt.Printf("Startingserveratport8080\n")iferr:=http.ListenAndServe(":8080",http.HandlerFunc(ReverseProxyHandler));err!=nil{log.Fatal(err)}}

以上訪問(wèn)localhost:8080, 在瀏覽器會(huì)顯示www.baidu.com的內(nèi)容。

--------------------------------------------------------

這幾天剛好遇到了一個(gè)正向代理的case, 簡(jiǎn)單記錄一下。

name.com集群通過(guò)prxoy.com 代理程序請(qǐng)求外部節(jié)點(diǎn)。

packagemainimport("fmt""log""net/http""net/http/httputil")// 集群請(qǐng)求外部節(jié)點(diǎn),通過(guò)代理funcProxyHandler(whttp.ResponseWriter,r*http.Request){fmt.Printf("receivearequestfrom{0}{1}:\n",r.RemoteAddr,r.Header)ifr.Host!="localhost:8080"{director:=func(req*http.Request){req.URL.Scheme="http"req.URL.Host=r.Hostreq.Host=r.Host}proxy:=&httputil.ReverseProxy{Director:director}proxy.ServeHTTP(w,r)}else{http.NotFound(w,r)}}funcmain(){iferr:=http.ListenAndServe(":8080",http.HandlerFunc(ProxyHandler));err!=nil{log.Fatal(err)}}

其中要注意的就是,正向代理式要規(guī)避死循環(huán)代理。

使用該服務(wù)作為代理程序,將可以出站訪問(wèn)任何地址( curl -x 指令后面代理地址)。

使用時(shí),針對(duì)httpclient 設(shè)置proxy。

//addingtheproxysettingstotheTransportobjecttransport:=&http.Transport{Proxy:http.ProxyURL(proxyURL),}//addingtheTransportobjecttothehttpClientclient:=&http.Client{Transport:transport,}

下面使用curl指令快速驗(yàn)證: curl -x 127.0.0.1:8080 www.baidu.com

引用鏈接

[1]鵝廠二面,nginx回憶錄:https://www.cnblogs.com/JulianHuang/p/14504892.html[2]golang實(shí)現(xiàn)反向代理程序:https://www.cnblogs.com/JulianHuang/p/16639016.html

本文文字和制圖均為原創(chuàng),鄙人會(huì)不時(shí)更正認(rèn)知、修正理解,鑒于公眾號(hào)編輯次數(shù)受限,請(qǐng)不時(shí)關(guān)注左下角永久更新地址, 也歡迎斧正;如果對(duì)您有所幫助,一鍵三連,甚是欣慰。

關(guān)鍵詞: 反向代理 外部節(jié)點(diǎn) 注意的就是

相關(guān)閱讀