先起一个目标服务
package main import ( "fmt" "io" "log" "net/http" "os" "os/signal" "syscall" "time" ) func main() { rs1 := &RealServer{Addr: "127.0.0.1:2003"} rs1.Run() rs2 := &RealServer{Addr: "127.0.0.1:2004"} rs2.Run() //监听关闭信号 quit := make(chan os.Signal) signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM) <-quit } type RealServer struct { Addr string } func (r *RealServer) Run() { log.Println("Starting httpserver at " + r.Addr) mux := http.NewServeMux() mux.HandleFunc("/", r.HelloHandler) mux.HandleFunc("/base/error", r.ErrorHandler) mux.HandleFunc("/test_http_string/test_http_string/aaa", r.TimeoutHandler) server := &http.Server{ Addr: r.Addr, WriteTimeout: time.Second * 3, Handler: mux, } go func() { log.Fatal(server.ListenAndServe()) }() } func (r *RealServer) HelloHandler(w http.ResponseWriter, req *http.Request) { //127.0.0.1:8008/abc?sdsdsa=11 //r.Addr=127.0.0.1:8008 //req.URL.Path=/abc //fmt.Println(req.Host) upath := fmt.Sprintf("http://%s%s\n\n", r.Addr, req.URL.Path) realIP := fmt.Sprintf("RemoteAddr=%s,X-Forwarded-For=%v,X-Real-Ip=%v\n\n", req.RemoteAddr, req.Header.Get("X-Forwarded-For"), req.Header.Get("X-Real-Ip")) header:=fmt.Sprintf("headers =%v\n\n",req.Header) io.WriteString(w, upath) io.WriteString(w, realIP) io.WriteString(w, header) } func (r *RealServer) ErrorHandler(w http.ResponseWriter, req *http.Request) { upath := "error handler" w.WriteHeader(500) io.WriteString(w, upath) } func (r *RealServer) TimeoutHandler(w http.ResponseWriter, req *http.Request) { time.Sleep(2*time.Second) upath := "timeout handler" w.WriteHeader(200) io.WriteString(w, upath) }
下边是我们编辑的代理
这里边只是简单代理转发 错误处理,负载等等 均没有实现
package main import ( "bufio" "fmt" "log" "net/http" "net/url" ) var ( proxy_addr = "http://127.0.0.1:2003/111" port = "2002" ) func handler(w http.ResponseWriter, r *http.Request) { //step 1 解析代理地址,并更改请求体的协议和主机 proxy, err := url.Parse(proxy_addr) fmt.Println("proxy",proxy) r.URL.Scheme = proxy.Scheme r.URL.Host = proxy.Host fmt.Println("URL",r.URL.Scheme) //step 2 请求下游 transport := http.DefaultTransport resp, err := transport.RoundTrip(r) if err != nil { log.Print(err) return } //step 3 把下游请求内容返回给上游 for k, vv := range resp.Header { for _, v := range vv { w.Header().Add(k, v) } } defer resp.Body.Close() bufio.NewReader(resp.Body).WriteTo(w) } func main() { http.HandleFunc("/", handler) log.Println("Start serving on port " + port) err := http.ListenAndServe(":"+port, nil) if err != nil { log.Fatal(err) } }
程序员,产品
6.7
PHP Go 前端
JwCode
渐悟分享