首页 > 其他分享 >Go开发 之 单端口转发到多个端口

Go开发 之 单端口转发到多个端口

时间:2022-10-31 18:01:35浏览次数:109  
标签:github log Rules 端口 json setting 转发 Go com


文章目录

  • ​​1、背景​​
  • ​​2、正题​​
  • ​​3、源码​​
  • ​​4、配置​​
  • ​​5、效果​​

1、背景

运维和我提到这个需求的时候,我先是一愣,第一时间想到的是nginx,然后运维说nginx没有这个功能……之所以选择用go语言,主要两点:

  • 静态语言性能够用
  • 不用部署其它包,可以直接丢一个可执行程序和一个配置上去就能运行。

2、正题

这种东西,一看就肯定有前辈做过,于是自行github上找了一圈,果然有答案:
​​​https://github.com/vulcand/oxy​

于是用了,上述这个包,写程序调用一下即可。

该包引用了其它开源的包哈(也可以用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开发 之 单端口转发到多个端口_github


标签:github,log,Rules,端口,json,setting,转发,Go,com
From: https://blog.51cto.com/u_15854865/5810738

相关文章

  • Centos7虚拟机,共享主机文件夹挂载,运行go中带c的程序
    md由于不会用java去转c写的加密,就必须用公司原来的加密方法,原来的是c写的,然后跟go结合着用,问题就是在windows上装了c的环境还是不能跑加密的,所以只能先试试用Linux的系统能......
  • allure报告定制logo
    1.allure安装目录下找到config文件,修改allure.yml,增加 -custom-logo-plugin 2.将logo图片放到allure-2.14.0\plugins\custom-logo-plugin\static目录下,修改styles.cs......
  • 【 云原生 | kubernetes 】- Argo CD Gitlab身份验证及SSO单点登录
    :zap:前言:了解OAuth协议。OAuth是一种授权协议,它可以用来保证第三方只有当获得授权的时候,才能访问授权者的权限我们之前文章已经大概了解了ArgoCD的作用和一些用法。在......
  • mongo常用查询
    条件查询select*fromtable1whereaa=value1,bb=value2;1.单条件查询语法db.getCollection('文档名').find({字段名:"字段值"})例如db.getCollection('assets_inf......
  • Go语言对比跳表和Map
    最近学习一个GO语言写的开源项目Lotusdb,https://github.com/flower-corp/lotusdb,其中使用跳表作为数据结构来缓存Key-Value,产生了疑惑为什么不直接用Map而要自己写个跳......
  • 【THM】Nmap Post Port Scans(Nmap端口扫描后期工作)-学习
    本文相关的TryHackMe实验房间链接:https://tryhackme.com/room/nmap04通过学习相关知识点:了解如何利用Nmap进行服务和操作系统检测,使用Nmap脚本引擎(NSE)并保存扫描结......
  • windows:查看端口占用情况相关命令
    一、通过命令行查找端口被谁占用1、window+R组合键,调出命令窗口2、查看被占用端口对应的PID,输入命令:netstat-ano|findstr端口,回车,记录最后一位数字,即pid3、继续输......
  • OJ周赛第一次——Good morning
    Goodmorning 问题描述一天,小马在A点过B分准时起床(24小时制),而小亮在C点过D分1秒准时起床。 输入 输入4个整数A,B,C,D0≤A≤230≤B≤590≤C≤230≤D≤5......
  • CentOS7 linux查看端口号的
    文章目录​​1.查看已开放的端口​​​​firewall-cmd--list-ports​​​​2.查询端口号8080是否开启​​​​firewall-cmd--query-port=8080/tcp​​​​3.开放端口(开放......
  • go-gin实现文件上传
    见代码packagemainimport( "fmt" "github.com/gin-gonic/gin" "net/http")funcmain(){ server:=gin.Default() gin.SetMode(gin.DebugMode) fmt.Printl......