新聞中心
golang 反向代理實例
首先解釋一下反向代理,所謂的反向代理就是代理服務(wù)器,充當(dāng)Web服務(wù)器網(wǎng)關(guān)的代理服務(wù)器。當(dāng)請求發(fā)送到使用反向代理的Web服務(wù)器時,他們將先轉(zhuǎn)到反向代理,由該代理將確定是將其路由到制定的Web服務(wù)器。
網(wǎng)站建設(shè)公司,為您提供網(wǎng)站建設(shè),網(wǎng)站制作,網(wǎng)頁設(shè)計及定制網(wǎng)站建設(shè)服務(wù),專注于成都定制網(wǎng)頁設(shè)計,高端網(wǎng)頁制作,對樓梯護欄等多個行業(yè)擁有豐富的網(wǎng)站建設(shè)經(jīng)驗的網(wǎng)站建設(shè)公司。專業(yè)網(wǎng)站設(shè)計,網(wǎng)站優(yōu)化推廣哪家好,專業(yè)成都網(wǎng)站營銷優(yōu)化,H5建站,響應(yīng)式網(wǎng)站。
這個程序是將 本地的8086 端口作為代理服務(wù)器,代理上篇 golang HTTP實例 里面的8090端口
核心只有一個函數(shù) httputil.NewSingleHostReverseProxy
兩個服務(wù)同時運行
效果如下:
代理服務(wù)器訪問 8086端口時候
訪問原始的端口8090時候
[golang] fasthttp 使用http代理
golang net/http標(biāo)準(zhǔn)庫的client是可以配置各種代理的,http/https/sock5等,不過fasthttp僅支持配置sock5代理,通過定義fasthttp dialfunc實現(xiàn):
項目中碰到的問題是,ops只提供了用squid搭建的http代理,所以是想重新定義一個http代理的dialfunc,找了fasthttp github倉庫的issue,作者提供了一個dialFunc
經(jīng)測試,訪問https的站點是OK的,訪問http的站點不行,代理連接不上。先說一下http/https代理的區(qū)別,再說原因。
使用代理訪問https網(wǎng)站時,會先發(fā)CONNECT請求,讓代理與目標(biāo)站點建立一個http tunnel,之后在這個tunnel基礎(chǔ)上進行傳輸,對應(yīng)到上面的dialFunc過程就是:
可以看到http站點是不需要發(fā)CONNECT請求的,而是直接將目標(biāo)站點的url作為path 填寫在http請求頭中。
為何上面的dialfunc訪問http站點不行呢,查了squid代理的文檔,發(fā)現(xiàn)squid默認(rèn)會禁止非https站點通過CONNECT方法建立通道,自己搭了個squid代理去掉配置項,發(fā)現(xiàn)上面的dialfunc是可以訪問http、https站點的,就是說http,https都先建立通過,再請求。
看了fasthttp的源碼,沒辦法在請求前修改request header中的path為目標(biāo)站點url,所以如果需要通過fasthttp使用http代理,那么可以使用上面的dialfunc,同時代理需要允許非443端口的站點可以建立通道。如果做不到這一點,那么還是建議使用標(biāo)準(zhǔn)庫net/http的client,會更方便一點。
Go語言HTTPServer開發(fā)的六種實現(xiàn)
學(xué)完了 net/http 和 fasthttp 兩個HTTP協(xié)議接口的客戶端實現(xiàn),接下來就要開始Server的開發(fā),不學(xué)不知道一學(xué)嚇一跳,居然這兩個庫還支持Server的開發(fā),太方便了。
相比于Java的HTTPServer開發(fā)基本上都是使用Spring或者Springboot框架,總是要配置各種配置類,各種 handle 對象。Golang的Server開發(fā)顯得非常簡單,就是因為特別簡單,或者說沒有形成特別統(tǒng)一的規(guī)范或者框架,我發(fā)現(xiàn)了很多實現(xiàn)方式,HTTP協(xié)議基于還是 net/http 和 fasthttp ,但是 handle 語法就多種多樣了。
先復(fù)習(xí)一下: Golang語言HTTP客戶端實踐 、 Golang fasthttp實踐 。
在Golang語言方面,實現(xiàn)某個功能的庫可能會比較多,有機會還是要多跟同行交流,指不定就發(fā)現(xiàn)了更好用的庫。下面我分享我學(xué)到的六種Server開發(fā)的實現(xiàn)Demo。
基于 net/http 實現(xiàn),這是一種比較基礎(chǔ)的,對于接口和 handle 映射關(guān)系處理并不優(yōu)雅,不推薦使用。
第二種也是基于 net/http ,這種編寫語法可以很好地解決第一種的問題,handle和path有了類似配置的語法,可讀性提高了很多。
第三個基于 net/http 和 github.com/labstack/echo ,后者主要提供了 Echo 對象用來處理各類配置包括接口和handle映射,功能很豐富,可讀性最佳。
第四種依然基于 net/http 實現(xiàn),引入了 github.com/gin-gonic/gin 的路由,看起來接口和 handle 映射關(guān)系比較明晰了。
第五種基于 fasthttp 開發(fā),使用都是 fasthttp 提供的API,可讀性尚可,handle配置倒是更像Java了。
第六種依然基于 fasthttp ,用到了 github.com/buaazp/fasthttprouter ,有點奇怪兩個居然不在一個GitHub倉庫里。使用語法跟第三種方式有點類似,比較有條理,有利于閱讀。
網(wǎng)頁名稱:go語言http代理的簡單介紹
分享鏈接:http://www.dlmjj.cn/article/dodoojs.html