1. 程式人生 > >使用go實現反向代理

使用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 進行程式碼的管理.

好了,今天就寫這麼多.