Files
ginx/main.go
T
2019-02-01 18:18:33 +08:00

71 lines
1.4 KiB
Go

package main
import (
"encoding/json"
"net/http"
"net/url"
"net/http/httputil"
"log"
"flag"
"fmt"
"io/ioutil"
"os"
)
type Config struct {
Server string `json:"server"`
Upstream []string `json:"upstream"`
}
var loadBalancer = NewWeightedRR(RR_NGINX)
type handle struct {
addrs []string
}
func (this *handle) ServeHTTP(w http.ResponseWriter, r *http.Request) {
addr := loadBalancer.Next().(string)
remote, err := url.Parse("http://" + addr)
if err != nil {
panic(err)
}
proxy := httputil.NewSingleHostReverseProxy(remote)
proxy.ServeHTTP(w, r)
}
func startServer(server string, upstream []string) {
//被代理的服务器host和port
h := &handle{}
h.addrs = upstream
w := 1
for _, e := range h.addrs {
loadBalancer.Add(e, w)
w++
}
err := http.ListenAndServe(server, h)
if err != nil {
log.Fatalln("ListenAndServe: ", err)
}
}
func main() {
server := flag.String("server", ":9999", "Your server")
upstream := flag.String("upstream", "127.0.0.1:3000", "upstream server")
flag.Parse()
fmt.Println(*server)
fmt.Println(*upstream)
file, err := ioutil.ReadFile("./config.json")
if err != nil {
fmt.Printf("File error: %v\n", err)
os.Exit(1)
}
var config Config
json.Unmarshal(file, &config)
// startServer(*server, *upstream)
startServer(config.Server, config.Upstream)
}