欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Go語言實現(xiàn)單端口轉(zhuǎn)發(fā)到多個端口

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

1、背景

運維和我提到這個需求的時候,我先是一愣,第一時間想到的是nginx,然后運維說nginx沒有這個功能……之所以選擇用go語言,主要兩點:

  • 靜態(tài)語言性能夠用
  • 不用部署其它包,可以直接丟一個可執(zhí)行程序和一個配置上去就能運行。

2、正題

這種東西,一看就肯定有前輩做過,于是自行g(shù)ithub上找了一圈,果然有答案:
https://github.com/vulcand/oxy

于是用了,上述這個包,寫程序調(diào)用一下即可。

該包引用了其它開源的包哈(也可以用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語言實現(xiàn)單端口轉(zhuǎn)發(fā)到多個端口的詳細內(nèi)容,更多關(guān)于Go單端口轉(zhuǎn)多端口的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 如何使用go實現(xiàn)創(chuàng)建WebSocket服務器

    如何使用go實現(xiàn)創(chuàng)建WebSocket服務器

    文章介紹了如何使用Go語言和gorilla/websocket庫創(chuàng)建一個簡單的WebSocket服務器,并實現(xiàn)商品信息的實時廣播,感興趣的朋友一起看看吧
    2024-11-11
  • Golang切片Slice功能操作詳情

    Golang切片Slice功能操作詳情

    這篇文章主要介紹了Golang切片功能操作詳情,切片是一個擁有相同類型元素的可變長度的序列。它是基于數(shù)組類型做的一層封,切片是一個引用類型,它的內(nèi)部結(jié)構(gòu)包含地址、長度和容量
    2022-09-09
  • Go?mod包管理工具詳解

    Go?mod包管理工具詳解

    Go?mod作為Go語言的官方包管理工具,可以幫助開發(fā)者更好地管理包和依賴,提高開發(fā)效率和項目可維護性,本文將介紹Go語言的包和依賴管理,以及Go?mod的作用和優(yōu)勢,需要的朋友可以參考下
    2023-05-05
  • Golang標準庫unsafe源碼解讀

    Golang標準庫unsafe源碼解讀

    這篇文章主要為大家介紹了Golang標準庫unsafe源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • Golang內(nèi)存管理之垃圾收集器詳解

    Golang內(nèi)存管理之垃圾收集器詳解

    這篇文章我們主要介紹垃圾收集器的設計原理以及Golang垃圾收集器的實現(xiàn)原理,文中有詳細的代碼示例及圖文介紹,感興趣的小伙伴跟著小編一起來學習吧
    2023-06-06
  • Go語言實現(xiàn)AES加密并編寫一個命令行應用程序

    Go語言實現(xiàn)AES加密并編寫一個命令行應用程序

    密碼學中的高級加密標準(Advanced Encryption Standard,AES),又稱Rijndael加密法,是經(jīng)常采用的一種區(qū)塊加密標準。本文就來用Go語言實現(xiàn)AES加密算法,需要的可以參考一下
    2023-02-02
  • Go語言context上下文管理的使用

    Go語言context上下文管理的使用

    本文主要介紹了Go語言context上下文管理的使用,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Go 1.22中的for循環(huán)新特性詳解

    Go 1.22中的for循環(huán)新特性詳解

    在 Go 語言中,for 循環(huán)是實現(xiàn)迭代的主要方式,Go 中的 for 循環(huán)非常靈活,有多種使用方式,本文將給大家詳細的介紹一下Go 1.22中的for循環(huán)新特性,感興趣的朋友可以參考下
    2024-02-02
  • 全面解析Go語言中crypto/sha1庫

    全面解析Go語言中crypto/sha1庫

    crypto/sha1在Go語言標準庫中是一個強大且實用的工具,適用于多種應用場景,本文就詳細的介紹了Go語言中crypto/sha1庫,具有一定的參考價值,感興趣的可以了解一下
    2024-02-02
  • golang實現(xiàn)簡單rpc調(diào)用過程解析

    golang實現(xiàn)簡單rpc調(diào)用過程解析

    這篇文章主要介紹了golang實現(xiàn)簡單rpc調(diào)用,包括RPC具體實現(xiàn)結(jié)合實例代碼給大家講解的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05

最新評論