這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
翻閱golang包手冊的時候看到net/http/httputil有一個type ReverseProxy,這個不是反向 Proxy嗎!golang內建反向 Proxy功能?好奇就試了一下,確實非常簡單,沒有幾行代碼就實現了一個簡易的反向 Proxy服務。
關於反向 Proxy百度百科上說的非常詳細了,這裡摘錄一下定義:
反向 Proxy(Reverse Proxy)方式是指以Proxy 伺服器來接受internet上的串連請求,然後將請求轉寄給內部網路上的伺服器,並將從伺服器上得到的結果返回給internet上請求串連的用戶端,此時Proxy 伺服器對外就表現為一個反向 Proxy伺服器。
golang實現代碼
package mainimport ("log""net/http""net/http/httputil""net/url")type handle struct {host stringport string}func (this *handle) ServeHTTP(w http.ResponseWriter, r *http.Request) {remote, err := url.Parse("http://" + this.host + ":" + this.port)if err != nil {panic(err)}proxy := httputil.NewSingleHostReverseProxy(remote)proxy.ServeHTTP(w, r)}func startServer() {//被代理的伺服器host和porth := &handle{host: "127.0.0.1", port: "80"}err := http.ListenAndServe(":8888", h)if err != nil {log.Fatalln("ListenAndServe: ", err)}}func main() {startServer()}
關鍵的代碼就是NewSingleHostReverseProxy這個方法,查看源碼的話不難看出該方法返回了一個ReverseProxy對象,在ReverseProxy中的ServeHTTP方法實現了這個具體的過程,主要是對源http包頭進行重新封裝,而後發送到後端伺服器。