最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go語(yǔ)言實(shí)現(xiàn)單端口轉(zhuǎn)發(fā)到多個(gè)端口

 更新時(shí)間:2024年02月20日 10:16:29   作者:沙振宇  
這篇文章主要為大家詳細(xì)介紹了Go語(yǔ)言實(shí)現(xiàn)單端口轉(zhuǎn)發(fā)到多個(gè)端口,文中的示例代碼講解詳細(xì),具有一定的參考價(jià)值,對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的小伙伴可以了解下

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)文章

  • 深入理解GoLang并發(fā)與并行

    深入理解GoLang并發(fā)與并行

    本文主要介紹了GoLang并發(fā)與并行,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2026-03-03
  • 使用Go實(shí)現(xiàn)TLS服務(wù)器和客戶(hù)端的示例

    使用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ǔ)言實(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
  • 在goland中讀取tpl文件的圖文操作

    在goland中讀取tpl文件的圖文操作

    這篇文章主要介紹了在goland中讀取tpl文件的圖文操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • 使用go讀取gzip格式的壓縮包的操作

    使用go讀取gzip格式的壓縮包的操作

    這篇文章主要介紹了使用go讀取gzip格式的壓縮包的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • Go 語(yǔ)言 IDE 中的 VSCode 配置使用教程

    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é)果方式

    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
  • Go命令行參數(shù)解析flag 包使用示例詳解

    Go命令行參數(shù)解析flag 包使用示例詳解

    這篇文章主要介紹了Go命令行參數(shù)解析flag 包使用,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2024-01-01
  • Go語(yǔ)言的接口詳解

    Go語(yǔ)言的接口詳解

    這篇文章主要介紹了go語(yǔ)言的接口,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧,希望能夠給你帶來(lái)幫助
    2021-10-10
  • Go字符串查找的20種實(shí)現(xiàn)方式

    Go字符串查找的20種實(shí)現(xiàn)方式

    本文總結(jié)了Go語(yǔ)言中20種字符串查找方法,從標(biāo)準(zhǔn)庫(kù)API到經(jīng)典高效算法,再到數(shù)據(jù)結(jié)構(gòu)輔助和高級(jí)技巧,覆蓋了從單次查找、多個(gè)模式查找、前綴查詢(xún)到模糊匹配等場(chǎng)景,每種方法都有其適用場(chǎng)景和時(shí)間空間復(fù)雜度,并提供了詳細(xì)的應(yīng)用建議,需要的朋友可以參考下
    2026-05-05

最新評(píng)論

寿阳县| 会东县| 绥中县| 大丰市| 旅游| 托克托县| 桂东县| 遂平县| 开封市| 铜山县| 镇江市| 梓潼县| 依安县| 乐安县| 昌吉市| 武鸣县| 建德市| 新民市| 留坝县| 阿荣旗| 宾川县| 鱼台县| 温宿县| 天长市| 汉寿县| 榆社县| 乌什县| 松阳县| 崇义县| 武穴市| 金川县| 察隅县| 永宁县| 珲春市| 静安区| 乐陵市| 青铜峡市| 罗源县| 福海县| 班玛县| 芜湖市|