Go語(yǔ)言實(shí)現(xiàn)單端口轉(zhuǎn)發(fā)到多個(gè)端口
1、背景
運(yùn)維和我提到這個(gè)需求的時(shí)候,我先是一愣,第一時(shí)間想到的是nginx,然后運(yùn)維說(shuō)nginx沒(méi)有這個(gè)功能……之所以選擇用go語(yǔ)言,主要兩點(diǎn):
- 靜態(tài)語(yǔ)言性能夠用
- 不用部署其它包,可以直接丟一個(gè)可執(zhí)行程序和一個(gè)配置上去就能運(yùn)行。
2、正題
這種東西,一看就肯定有前輩做過(guò),于是自行g(shù)ithub上找了一圈,果然有答案:
https://github.com/vulcand/oxy
于是用了,上述這個(gè)包,寫(xiě)程序調(diào)用一下即可。
該包引用了其它開(kāi)源的包哈(也可以用go mod哈,就不用自己去下載包啦~):
https://github.com/gorilla/websocket
https://github.com/mailgun/timetools
https://github.com/sirupsen/logrus
https://github.com/golang/sys
https://github.com/go-mgo/mgo/tree/v2
3、源碼
/**
* 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/testutils"
)
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 JSON 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.242.129:81"
},
{
"Domain":"test2.shazhenyu.com",
"Address":"193.207.242.129:82"
}
]
}
5、效果

以上就是Go語(yǔ)言實(shí)現(xiàn)單端口轉(zhuǎn)發(fā)到多個(gè)端口的詳細(xì)內(nèi)容,更多關(guān)于Go單端口轉(zhuǎn)多端口的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
使用Go實(shí)現(xiàn)TLS服務(wù)器和客戶(hù)端的示例
本文主要介紹了Go實(shí)現(xiàn)TLS服務(wù)器和客戶(hù)端的示例,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12
GO語(yǔ)言實(shí)現(xiàn)串口簡(jiǎn)單通訊
本文分享了使用Go語(yǔ)言進(jìn)行串口通訊的實(shí)踐過(guò)程,詳細(xì)介紹了串口配置、數(shù)據(jù)發(fā)送與接收的代碼實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-11-11
Go 語(yǔ)言 IDE 中的 VSCode 配置使用教程
Gogland 是 JetBrains 公司推出的Go語(yǔ)言集成開(kāi)發(fā)環(huán)境。這篇文章主要介紹了Go 語(yǔ)言 IDE 中的 VSCode 配置使用教程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05
golang變量uint、int大小溢出后的結(jié)果方式
在Go語(yǔ)言中,變量的大小溢出后,`uint`類(lèi)型會(huì)回繞到最小值,而`int`類(lèi)型會(huì)回繞到最大值的相反數(shù),例如,`uint8`溢出后會(huì)變成0,`int64`溢出后會(huì)變成最小的負(fù)數(shù)2024-12-12

