目录
- 1、背景
- 2、正题
- 3、源码
- 4、配置
- 5、效果
1、背景
运维和我提到这个需求的时候,我先是一愣,第一时间想到的是nginx,然后运维说nginx没有这个功能……之所以选择用gopython语言,主要两点:
- 静态语言性能够用
- 不用部署其它包,可以直接丢一个可执行程序和一个配置上去就能运行。
2、正题
这种东西,一看就肯定有前辈做过,于是自行github上找了一圈,果然有答案:
https://github.com/vulcand/oxy于是用了,上述这个包,写程序调用一下即可。
该包引用了其它开源的包哈(也可以用go mod哈,就不用自己去下载包啦~):
https://github.com/gorilla/编程客栈websockethttps://github.com/mailgun/timetoolshttps://github.com/sirupsen/logrushttps://github.com/golang/sys
https://github.com/go-mgo/mgo/tree/v23、源码
/** * 2020 5 21 - sha zhen yu */ package main import( "log" "strings" "net/http" "io/ioutil" "encoding/json" "github.com/vulcand/oxy/forward" "github.com/vulcand/oxy/te编程客栈stutils" ) type Rule struct{ Domain string `json:Domain` Address string `json:Address` } type Setting struct{ MainPort string `json:MainPort` Rules []Rule `json:Rules` } var setting Setting var fwd *forward.Forwarder func redirectHandle(w http.ResponseWriter, r *http.Request){ address := getAddress(r.Host) if address != "" { r.URL = testutils.ParseURI("http://"+address) log.Println("Info: "+r.Host+" => "+address) fwd.ServeHTTP(w, r) } else { w.WriteHeader(500) } } func getAddress(host string) string { for _,v := range setting.Rules { if strings.Compare(host,v.Domain) == 0 { return v.Address } } return "" } func Init(){ log.Println("Init: start") var Data,err = ioutil.ReadFile("setting.json") if err != nil{ log.Fatal("Read Config File Error!") return } err = json.Unmarshal(Data,&setting) if err != nil{ log.Fatal("Read Config JSwww.devze.comON Error!Please Check!") return } log.Println("Main Port: "+setting.MainPort) for i:=0;i<len(setting.Rules);i++{ log.Println("Import Rule: "+setting.Rules[i].Domain+" <----> "+setting.Rules[i].Address) } log.Println("Init: end") } func main(){ Init() fwd, _ = forward.New() redirect := http.HandlerFunc(redirectHandle) s := &http.Server{ Addr: ":"+setting.MainPort, Handler: redirect, } log.Println("Info: Listening port "+s.Addr) s.ListenAndServe() }
4、配置
{ "name": "HttpProxyForwarding", "version": "1.0.0", "MainPort": "80", "Rules": [ { "Domain":"test1.shazhenyu.com", "Address":"193.207.2android42.129:81" }, { "Domain":"test2.shazhenyu.com", "Address":"193.207.242.129:82" } ] }
5、效果
以上就是Go语言实现单端口转发到多个端口的详细内容,更多关于Go单端口转多端口的资料请关注编程客栈(www.devze.com)其它相关文章!
精彩评论