const http = require('http');
let svr = http.createServer((req, resp)=>{
resp.writeHead(200, {"Content-Type":"text/plain"});
resp.end("bienvinido\n");
});
svr.listen(9092); //或者9091
反向圈圈
package main
import (
"math/rand"
"net/http"
"net/http/httputil"
"net/url"
)
func NewMulti(targets []*url.URL) *httputil.ReverseProxy {
director := func(req *http.Request) {
target := targets[rand.Intn(len(targets))]
req.URL.Scheme = target.Scheme
req.URL.Host = target.Host
req.URL.Path = target.Path
}
return &httputil.ReverseProxy{Director: director}
}
func main() {
proxy := NewMulti([]*url.URL{
{
Scheme: "http",
Host: "localhost:9092",
},
{
Scheme: "http",
Host: "localhost:9091",
},
})
http.ListenAndServe(":9090", proxy)
}
有了反向圈圈之後, 可以將一個正向圈圈寫得更簡單:
package main
import (
"fmt"
"log"
"net/http"
"net/http/httputil"
"time"
)
func main() {
rProxy := httputil.ReverseProxy{
Director: func(req *http.Request) {
log.Printf("request for %v", req.URL)
},
}
mux := http.NewServeMux()
mux.HandleFunc("/", func(rw http.ResponseWriter, req *http.Request) {
rProxy.ServeHTTP(rw, req)
})
svr := http.Server{
Addr: ":8080",
Handler: mux,
ReadTimeout: 10 * time.Second,
WriteTimeout: 10 * time.Second,
}
res := svr.ListenAndServe()
fmt.Printf("\n%v\n", res)
}
Director的作用就是重寫填寫Scheme/Host/Path. 如果什麼都不改, 那就退化爲最簡單的圈圈.