本文介紹golang中如何進行反向代理。
下面例子中,
proxy server接收client 的 http request,轉發給true server,並把 true server的返回結果再發送給client。
1.proxy server
proxyServer.go代碼如下所示。
// proxyServer.go
package main
import (
"log"
"net/http"
"net/http/httputil"
"net/url"
)
//將request轉發給 http://127.0.0.1:2003
func helloHandler(w http.ResponseWriter, r *http.Request) {
trueServer := "http://127.0.0.1:2003"
url, err := url.Parse(trueServer)
if err != nil {
log.Println(err)
return
}
proxy := httputil.NewSingleHostReverseProxy(url)
proxy.ServeHTTP(w, r)
}
func main() {
http.HandleFunc("/hello", helloHandler)
log.Fatal(http.ListenAndServe(":2002", nil))
}
proxyServer監聽端口2002,提供HTTP request "/hello" 的轉發服務。
其中,
func NewSingleHostReverseProxy
func NewSingleHostReverseProxy(target *url.URL) *ReverseProxy
NewSingleHostReverseProxy 返回一個新的 ReverseProxy, 將URLs 請求路由到targe的指定的scheme, host, base path 。
如果target的path是"/base" ,client請求的URL是 "/dir", 則target 最后轉發的請求就是 /base/dir。
type ReverseProxy
ReverseProxy 是 HTTP Handler, 接收client的 request,將其發送給另一個server, 並將server 返回的response轉發給client。
2.true server
trueServer.go代碼如下所示。
// trueServer.go
package main
import (
"io"
"net/http"
"log"
)
func helloHandler(w http.ResponseWriter, req *http.Request) {
io.WriteString(w, "hello, world!\n")
}
func main() {
http.HandleFunc("/hello", helloHandler)
log.Fatal(http.ListenAndServe(":2003", nil))
}
trueServer 作為一個HTTP server,監聽端口2003,提供"/hello"的實際處理。
3.client
client代碼如下
$ curl http://127.0.0.1:2002/hello
hello, world!