AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當(dāng)前位置:首頁 > 科技  > 軟件

Go語言如何實(shí)現(xiàn)HTTP代理和反向代理

來源: 責(zé)編: 時(shí)間:2024-04-28 09:02:39 160觀看
導(dǎo)讀代理的核心功能可以用一句話概括:接受客戶端的請求,轉(zhuǎn)發(fā)到后端服務(wù)器,獲得應(yīng)答之后返回給客戶端。代理的功能有很多,事實(shí)上整個(gè)互聯(lián)網(wǎng)到處都充斥著代理服務(wù)器。如果所有的 HTTP 訪問都是客戶端和服務(wù)器端直接進(jìn)行的話,我們

代理的核心功能可以用一句話概括:接受客戶端的請求,轉(zhuǎn)發(fā)到后端服務(wù)器,獲得應(yīng)答之后返回給客戶端。FTh28資訊網(wǎng)——每日最新資訊28at.com

代理的功能有很多,事實(shí)上整個(gè)互聯(lián)網(wǎng)到處都充斥著代理服務(wù)器。如果所有的 HTTP 訪問都是客戶端和服務(wù)器端直接進(jìn)行的話,我們的網(wǎng)絡(luò)不僅會(huì)變得緩慢,而且性能會(huì)大打折扣。FTh28資訊網(wǎng)——每日最新資訊28at.com

代理服務(wù)器根據(jù)不同的配置和使用,可能會(huì)有不同的功能,這些功能主要包括:FTh28資訊網(wǎng)——每日最新資訊28at.com

  • 內(nèi)容過濾:代理可以根據(jù)一定的規(guī)則限制某些請求的連接。比如有些公司會(huì)設(shè)置內(nèi)部網(wǎng)絡(luò)無法訪問某些購物、游戲網(wǎng)站,或者學(xué)校的網(wǎng)絡(luò)不讓學(xué)生訪問色情暴力的網(wǎng)站等
  • 節(jié)省成本:代理服務(wù)器可以作為緩存使用,對于某些資源只需要第一次訪問的時(shí)候去下載,以后代理直接把緩存的結(jié)果返回給客戶端,節(jié)約網(wǎng)絡(luò)帶寬的開銷。
  • 提高性能:通過代理服務(wù)器的緩存(比如 CDN)和負(fù)載均衡(比如 nginx lb)功能,服務(wù)器端可以加速請求的訪問,在更快的時(shí)間內(nèi)返回結(jié)果)。
  • 增加安全性:公司可以在內(nèi)網(wǎng)和外網(wǎng)之間通過代理進(jìn)行轉(zhuǎn)發(fā),這樣不僅對外隱藏了實(shí)現(xiàn)的細(xì)節(jié),而且可以在代理層對爬蟲、病毒性請求進(jìn)行過濾,保護(hù)內(nèi)部服務(wù)。

所有的這些功能的實(shí)現(xiàn)都依賴于代理的特性,它可以在客戶端和服務(wù)器端做一些事情,根據(jù)代理做的事情不同,它的角色和功能也就不同。FTh28資訊網(wǎng)——每日最新資訊28at.com

那么,代理具體可以做哪些事情呢?比如:FTh28資訊網(wǎng)——每日最新資訊28at.com

修改 HTTP 請求:url、header、bodyFTh28資訊網(wǎng)——每日最新資訊28at.com

過濾請求:根據(jù)一定的規(guī)則丟棄、過濾請求FTh28資訊網(wǎng)——每日最新資訊28at.com

決定轉(zhuǎn)發(fā)到哪個(gè)后端(可以是靜態(tài)定義的,也可以是動(dòng)態(tài)決定)FTh28資訊網(wǎng)——每日最新資訊28at.com

保存服務(wù)器的應(yīng)答,后續(xù)的請求可以直接使用保存的應(yīng)答FTh28資訊網(wǎng)——每日最新資訊28at.com

修改應(yīng)答:對應(yīng)答做一些格式的轉(zhuǎn)換,修改數(shù)據(jù),甚至返回完全不一樣的應(yīng)答數(shù)據(jù)FTh28資訊網(wǎng)——每日最新資訊28at.com

重試機(jī)制,如果后端服務(wù)器暫時(shí)無法響應(yīng),隔一段時(shí)間重試FTh28資訊網(wǎng)——每日最新資訊28at.com

正向代理和反向代理

代理可以分為正向代理和反向代理兩種。FTh28資訊網(wǎng)——每日最新資訊28at.com

正向代理需要客戶端來配置,一般來說我們會(huì)通過瀏覽器或者操作系統(tǒng)提供的工具或者界面來配置。FTh28資訊網(wǎng)——每日最新資訊28at.com

這個(gè)時(shí)候,代理對客戶端不是透明的,客戶端需要知道代理的地址并且手動(dòng)配置。配置了代理,瀏覽器在發(fā)送請求的時(shí)候會(huì)對報(bào)文做特殊的修改。FTh28資訊網(wǎng)——每日最新資訊28at.com

反向代理對客戶端是透明的,也就是說客戶端一般不知道代理的存在,認(rèn)為自己是直接和服務(wù)器通信。FTh28資訊網(wǎng)——每日最新資訊28at.com

我們大部分訪問的網(wǎng)站就是反向代理服務(wù)器,反向代理服務(wù)器會(huì)轉(zhuǎn)發(fā)到真正的服務(wù)器,一般在反向代理這一層實(shí)現(xiàn)負(fù)載均衡和高可用的功能。而且這里也可以看到,客戶端是不會(huì)知道真正服務(wù)器端的 ip 地址和端口的,這在一定程度上起到了安全保護(hù)的作用。FTh28資訊網(wǎng)——每日最新資訊28at.com

代理服務(wù)器怎么知道目的服務(wù)器的地址?

在反向代理中,代理服務(wù)器要轉(zhuǎn)發(fā)的服務(wù)器地址都是事先知道的(包括靜態(tài)配置和動(dòng)態(tài)配置)。比如 使用 nginx 來配置負(fù)載均衡 。
FTh28資訊網(wǎng)——每日最新資訊28at.com

而對于正向代理來說,客戶端可能訪問的服務(wù)器地址是無法事先知道的。因?yàn)镠TTP 協(xié)議活動(dòng)在應(yīng)用層,它無法獲取網(wǎng)絡(luò)層(IP層)信息,那么該協(xié)議要有一個(gè)地方可以拿到這個(gè)信息。FTh28資訊網(wǎng)——每日最新資訊28at.com

HTTP 中可能保存這個(gè)信息的地方有兩個(gè):URL 和 header。默認(rèn)情況下,HTTP 請求的 status line 有三部分組成:方法、uri 和協(xié)議版本,比如:FTh28資訊網(wǎng)——每日最新資訊28at.com

GET /index.html HTTP/1.0User-Agent: gohttp 1.0

如果客戶端(比如瀏覽器)知道自己在通過正向代理進(jìn)行報(bào)文傳輸,那么它會(huì)在 status line 加上要訪問服務(wù)器的真實(shí)地址。這個(gè)時(shí)候發(fā)送的報(bào)文是:FTh28資訊網(wǎng)——每日最新資訊28at.com

GET http://www.marys-antiques.com/index.html HTTP/1.0User-Agent: gohttp 1.0

代理路徑客戶端不管是通過代理服務(wù)器,還是直接訪問后端服務(wù)器對于最終的結(jié)果是沒有區(qū)別的,也就是說大多數(shù)情況下客戶端根本不關(guān)心它訪問的到底是什么,只需要(準(zhǔn)確快速地)拿到想要的信息就夠了。FTh28資訊網(wǎng)——每日最新資訊28at.com

但是有時(shí)候,我們還是希望知道請求到底在中間經(jīng)歷了哪些代理,比如用來調(diào)試網(wǎng)絡(luò)異常,或者做數(shù)據(jù)統(tǒng)計(jì),而 HTTP 協(xié)議也提供了響應(yīng)的功能。FTh28資訊網(wǎng)——每日最新資訊28at.com

雖然 RFC 2616 定義了 Via 頭部字段來跟蹤 HTTP 請求經(jīng)過的代理路徑,但在實(shí)際中用的更多的還是 X-Forwarded-For 字段, X-Forwarded-For 是 Squid 緩存代理服務(wù)軟件引入的,目前已經(jīng)在規(guī)范化在 RFC 7239 文檔。FTh28資訊網(wǎng)——每日最新資訊28at.com

X-Forwarded-For 頭部格式也比較簡單,比如某個(gè)服務(wù)器接受到請求的對應(yīng)頭部可能是:FTh28資訊網(wǎng)——每日最新資訊28at.com

X-Forwarded-For: client, proxy1, proxy2FTh28資訊網(wǎng)——每日最新資訊28at.com

對應(yīng)的值有多個(gè)字段,每個(gè)字段代表中間的一個(gè)節(jié)點(diǎn),它們之間由逗號和空格隔開,從左到右距離當(dāng)前節(jié)點(diǎn)越來越近。FTh28資訊網(wǎng)——每日最新資訊28at.com

每個(gè)代理服務(wù)器會(huì)在 X-Forwarded-For 頭部填上前一個(gè)節(jié)點(diǎn)的 ip 地址,這個(gè)地址可以通過 TCP 請求的 remote address 獲取。為什么每個(gè)代理服務(wù)器不填寫自己的 ip 地址呢?FTh28資訊網(wǎng)——每日最新資訊28at.com

有兩個(gè)原因,如果由代理服務(wù)器填寫自己的 ip 地址,那么代理可以很簡單地偽造這個(gè)地址,而上一個(gè)節(jié)點(diǎn)的 remote address 是根據(jù) TCP 連接獲取的(如果不建立正確的 TCP 連接是無法進(jìn)行 HTTP 通信的);另外一個(gè)原因是如果由當(dāng)前節(jié)點(diǎn)填寫 X-Forwarded-For ,那么很多情況客戶端無法判斷自己是否會(huì)通過代理的。FTh28資訊網(wǎng)——每日最新資訊28at.com

NOTE:FTh28資訊網(wǎng)——每日最新資訊28at.com

1、最終客戶端或者服務(wù)器端接受的請求,X-Forwarded-For 是沒有最鄰近節(jié)點(diǎn)的 ip 地址的,而這個(gè)地址可以通過 remote address 獲取FTh28資訊網(wǎng)——每日最新資訊28at.com

2、每個(gè)節(jié)點(diǎn)(不管是客戶端、代理服務(wù)器、真實(shí)服務(wù)器)都可以隨便更改 X-Forwarded-For 的值,因此這個(gè)字段只能作為參考FTh28資訊網(wǎng)——每日最新資訊28at.com

代理服務(wù)器實(shí)現(xiàn)這個(gè)部分我們會(huì)介紹如何用 golang 來實(shí)現(xiàn) HTTP 代理服務(wù)器,需要讀者了解一些 HTTP 服務(wù)器端編程的知識(shí)。FTh28資訊網(wǎng)——每日最新資訊28at.com

正向代理按照我們之前介紹的代理原理,我們可以編寫出這樣的代碼:FTh28資訊網(wǎng)——每日最新資訊28at.com

package mainimport (    "fmt"    "io"    "net"    "net/http"    "strings")type Pxy struct {}func (p *Pxy) ServeHTTP(rw http.ResponseWriter, req *http.Request) {    fmt.Printf("Received request %s %s %s/n", req.Method, req.Host, req.RemoteAddr)    transport :=  http.DefaultTransport    // step 1    outReq := new(http.Request)    *outReq = *req // this only does shallow copies of maps    if clientIP, _, err := net.SplitHostPort(req.RemoteAddr); err == nil {        if prior, ok := outReq.Header["X-Forwarded-For"]; ok {            clientIP = strings.Join(prior, ", ") + ", " + clientIP        }        outReq.Header.Set("X-Forwarded-For", clientIP)    }    // step 2    res, err := transport.RoundTrip(outReq)    if err != nil {        rw.WriteHeader(http.StatusBadGateway)        return    }    // step 3    for key, value := range res.Header {        for _, v := range value {            rw.Header().Add(key, v)        }    }    rw.WriteHeader(res.StatusCode)    io.Copy(rw, res.Body)    res.Body.Close()}func main() {    fmt.Println("Serve on :8080")    http.Handle("/", &Pxy{})    http.ListenAndServe("0.0.0.0:8080", nil)}

這段代碼比較直觀,只包含了最核心的代碼邏輯,完全按照最上面的代理圖例進(jìn)行組織。一共分成幾個(gè)步驟:FTh28資訊網(wǎng)——每日最新資訊28at.com

1、代理接收到客戶端的請求,復(fù)制了原來的請求對象,并根據(jù)數(shù)據(jù)配置新請求的各種參數(shù)(添加上 X-Forward-For 頭部等)FTh28資訊網(wǎng)——每日最新資訊28at.com

2、把新請求發(fā)送到服務(wù)器端,并接收到服務(wù)器端返回的響應(yīng)FTh28資訊網(wǎng)——每日最新資訊28at.com

3、代理服務(wù)器對響應(yīng)做一些處理,然后返回給客戶端FTh28資訊網(wǎng)——每日最新資訊28at.com

上面的代碼運(yùn)行之后,會(huì)在本地的 8080 端口啟動(dòng)代理服務(wù)。修改瀏覽器的代理為 127.0.0.1::8080 再訪問網(wǎng)站,可以驗(yàn)證代理正常工作,也能看到它在終端打印出所有的請求信息。FTh28資訊網(wǎng)——每日最新資訊28at.com

雖然這段代碼非常簡短,但是你可以添加更多的邏輯實(shí)現(xiàn)非常有用的功能。比如在請求發(fā)送之前進(jìn)行過濾,根據(jù)一定的規(guī)則直接阻止某些請求的訪問;或者對請求進(jìn)行限流,某個(gè)客戶端在一定的時(shí)間里執(zhí)行的請求有最大限額;統(tǒng)計(jì)請求的數(shù)據(jù)進(jìn)行分析等等。FTh28資訊網(wǎng)——每日最新資訊28at.com

這個(gè)代理目前不支持 HTTPS 協(xié)議,因?yàn)樗惶峁┝?HTTP 請求的轉(zhuǎn)發(fā)功能,并沒有處理證書和認(rèn)證有關(guān)的內(nèi)容。FTh28資訊網(wǎng)——每日最新資訊28at.com

如果了解 HTTPS 協(xié)議的話,你會(huì)明白這種模式下是無法完成 HTTPS 握手的,雖然代理可以和真正的服務(wù)器建立連接(知道了對方的公鑰和證書),但是代理無法代表服務(wù)器和客戶端建立連接,因?yàn)榇矸?wù)器無法知道真正服務(wù)器的私鑰。FTh28資訊網(wǎng)——每日最新資訊28at.com

反向代理編寫反向代理按照上面的思路當(dāng)然沒有問題,只需要在第二步的時(shí)候,根據(jù)之前的配置修改 outReq 的 URL Host 地址可以了。FTh28資訊網(wǎng)——每日最新資訊28at.com

不過 Golang 已經(jīng)給我們提供了編寫代理的框架:httputil.ReverseProxy 。我們可以用非常簡短的代碼來實(shí)現(xiàn)自己的代理,而且內(nèi)部的細(xì)節(jié)問題都已經(jīng)被很好地處理了。FTh28資訊網(wǎng)——每日最新資訊28at.com

這部分我們會(huì)實(shí)現(xiàn)一個(gè)簡單的反向代理,它能夠?qū)φ埱髮?shí)現(xiàn)負(fù)載均衡,隨機(jī)地把請求發(fā)送給某些配置好的后端服務(wù)器。使用 httputil.ReverseProxy 編寫反向代理最重要的就是實(shí)現(xiàn)自己的 Director 對象,這是 GoDoc 對它的介紹:FTh28資訊網(wǎng)——每日最新資訊28at.com

看代碼:FTh28資訊網(wǎng)——每日最新資訊28at.com

package mainimport (        "log"        "math/rand"        "net/http"        "net/http/httputil"        "net/url")func NewMultipleHostsReverseProxy(targets []*url.URL) *httputil.ReverseProxy {        director := func(req *http.Request) {                target := targets[rand.Int()%len(targets)]                req.URL.Scheme = target.Scheme                req.URL.Host = target.Host                req.URL.Path = target.Path        }        return &httputil.ReverseProxy{Director: director}}func main() {        proxy := NewMultipleHostsReverseProxy([]*url.URL{                {                        Scheme: "http",                        Host:   "localhost:9091",                },                {                        Scheme: "http",                        Host:   "localhost:9092",                },        })        log.Fatal(http.ListenAndServe(":9090", proxy))}

我們讓代理監(jiān)聽在 9090 端口,在后端啟動(dòng)兩個(gè)返回不同響應(yīng)的服務(wù)器分別監(jiān)聽在 9091 和 9092 端口,通過 curl 訪問,可以看到多次請求會(huì)返回不同的結(jié)果。FTh28資訊網(wǎng)——每日最新資訊28at.com

?  curl http://127.0.0.1:9090116064a9eb83?  curl http://127.0.0.1:90908f7ccc11718f

同樣的,這段代碼也只是一個(gè) demo,存在著很多問題,比如沒有錯(cuò)誤處理機(jī)制,如果后端某個(gè)服務(wù)器掛了,代理會(huì)返回 502 錯(cuò)誤,更好的做法是把請求轉(zhuǎn)發(fā)到另外的可用服務(wù)器。當(dāng)然也可以添加更多的特性讓它更好用,比如動(dòng)態(tài)地添加后端服務(wù)器列表;根據(jù)后端服務(wù)器的負(fù)載情況進(jìn)行負(fù)載轉(zhuǎn)發(fā)等等。FTh28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-86067-0.htmlGo語言如何實(shí)現(xiàn)HTTP代理和反向代理

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: C#隊(duì)列(Queue)的基本使用,一文全掌握

下一篇: 虛擬現(xiàn)實(shí)(VR)將如何改變建筑行業(yè)?

標(biāo)簽:
  • 熱門焦點(diǎn)
  • 石頭智能洗地機(jī)A10 Plus體驗(yàn):雙向自清潔治好了我的懶癌

    一、前言和介紹專為家庭請假懶人而生的石頭科技在近日又帶來了自己的全新旗艦新品,石頭智能洗地機(jī)A10 Plus。從這個(gè)產(chǎn)品名上就不難看出,這次石頭推出的并不是常見的掃地機(jī)器
  • 7月安卓手機(jī)性能榜:紅魔8S Pro再奪榜首

    7月份的手機(jī)市場風(fēng)平浪靜,除了紅魔和努比亞帶來了兩款搭載驍龍8Gen2領(lǐng)先版處理器的新機(jī)之外,別的也想不到有什么新品了,這也正常,通常6月7月都是手機(jī)廠商修整的時(shí)間,進(jìn)入8月份之
  • 一年經(jīng)驗(yàn)在二線城市面試后端的經(jīng)驗(yàn)分享

    忠告這篇文章只適合2年內(nèi)工作經(jīng)驗(yàn)、甚至沒有工作經(jīng)驗(yàn)的朋友閱讀。如果你是2年以上工作經(jīng)驗(yàn),請果斷劃走,對你沒啥幫助~主人公這篇文章內(nèi)容來自 「升職加薪」星球星友 的投稿,坐
  • 學(xué)習(xí)JavaScript的10個(gè)理由...

    作者 | Simplilearn編譯 | 王瑞平當(dāng)你決心學(xué)習(xí)一門語言的時(shí)候,很難選擇到底應(yīng)該學(xué)習(xí)哪一門,常用的語言有Python、Java、JavaScript、C/CPP、PHP、Swift、C#、Ruby、Objective-
  • 小紅書1周漲粉49W+,我總結(jié)了小白可以用的N條漲粉筆記

    作者:黃河懂運(yùn)營一條性教育視頻,被54萬人“珍藏”是什么體驗(yàn)?最近,情感博主@公主是用鮮花做的,火了!僅僅憑借一條視頻,光小紅書就有超過128萬人,為她瘋狂點(diǎn)贊!更瘋狂的是,這
  • 拼多多APP上線本地生活入口,群雄逐鹿萬億市場

    Tech星球(微信ID:tech618)文 | 陳橋輝 Tech星球獨(dú)家獲悉,拼多多在其APP內(nèi)上線了“本地生活”入口,位置較深,位于首頁的“充值中心”內(nèi),目前主要售賣美食相關(guān)的
  • 大廠卷向扁平化

    來源:新熵作者丨南枝 編輯丨月見大廠職級不香了。俗話說,兵無常勢,水無常形,互聯(lián)網(wǎng)企業(yè)調(diào)整職級體系并不稀奇。7月13日,淘寶天貓集團(tuán)啟動(dòng)了近年來最大的人力制度改革,目前已形成一
  • Meta盲目擴(kuò)張致超萬人被裁,重金押注元宇宙而前景未明

    圖片來源:圖蟲創(chuàng)意日前,Meta創(chuàng)始人兼CEO 馬克·扎克伯發(fā)布公開信,宣布Meta計(jì)劃裁員超11000人,占其員工總數(shù)13%。他公開承認(rèn)了自己的預(yù)判失誤:“不僅
  • 中關(guān)村論壇11月25日開幕,15位諾獎(jiǎng)級大咖將發(fā)表演講

    11月18日,記者從2022中關(guān)村論壇新聞發(fā)布會(huì)上獲悉,中關(guān)村論壇將于11月25至30日在京舉行。本屆中關(guān)村論壇由科學(xué)技術(shù)部、國家發(fā)展改革委、工業(yè)和信息化部、國務(wù)
Top