使用go實現反向代理
今天讓大家看看用go寫了一個反向代理,真的非常的簡單,比用java寫的簡單多了,而且非常好理解,感覺go確實非常適用寫各種中介軟體.好了,大家看程式碼.
package main
import (
_ "fmt"
"io"
_ "log"
"net/http"
"net/http/httputil"
"net/url"
_ "strings"
)
func main() {
/*localHost := "127.0.0.1:9293"
targetHost := "127.0.0.1:29383"
httpsServer(localHost, targetHost)
var err error = nil*/
http.HandleFunc("/", ServeHTTP)
// http.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) {
// if req.RequestURI == "/favicon.ico" {
// io.WriteString(w, "Request path Error")
// return
// }
// fmt.Println(req.RequestURI)
// fmt.Fprintf(w, req.RequestURI)
// })
http.ListenAndServe(":8085", nil)
}
func ServeHTTP(w http.ResponseWriter, r *http.Request) {
if r.RequestURI == "/favicon.ico" {
io.WriteString(w, "Request path Error")
return
}
remote, err := url.Parse("http://" + "127.0.0.1:80")
if err != nil {
panic(err)
}
proxy := httputil.NewSingleHostReverseProxy(remote)
proxy.ServeHTTP(w, r)
}
就是這麼的簡單,首先監聽本機的8085埠,然後分發請求到本機的80埠上面去,就完成了代理的過程,只需要啟動這個go程式就夠了.
這個程式的下一步優化就是怎麼根據服務進行伺服器的ip(127.0.0.1:80),埠號的獲取了,不能這樣固定的寫死,就能做到靈活的進行配置了.就是相當於進行服務的註冊,當然下面還有很大的優化的空間.
這是我正在學習go的同事陳磊大大寫的,我寫的就是一個簡單的web伺服器,多個請求的統一處理,以後再分享出來.
因為之前的JetBrains GoLand 過期了,就換了一個IDE,安利一下 國人做的go的編輯器把,LiteIDE,俺用了這麼多年的英文的IDE,終於見到了一個漢字的,還有點不習慣,哈哈.還是很方便的.一些功能也有待加強,例如Git的整合,直接在IDE 進行程式碼的管理.
好了,今天就寫這麼多.