Go开发 之 单端口转发到多个端口
文章目录
- 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 mainimport("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.Forwarderfunc 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开发 之 单端口转发到多个端口相关推荐
- nginx监听80端口转发到tomcat 8080端口
nginx的配置目录:/etc/nginx下 因为nginx会自动导入sites-available/default的文件和conf.d文件夹下的conf文件,我选择通过第二种方式倒入配置: 1.cd ...
- ssh远程端口转发到本地_Linux SSH隧道或端口转发本地和远程端口的示例?
ssh远程端口转发到本地 Ssh protocol secures remote connections which are shell or terminal-based to the remote ...
- mysql端口转发_SSH做MySQL端口转发
端口映射其实就是将其中一台网络设备(一个路由器.一台电脑或服务器)的某一个端口转换到另一个网络设备上,其实际上是NAT地址转换的一种. linux下的ssh连结命令实现的端口转发功能,在讲解端口转发前 ...
- ip以及端口转发数据、根据端口转发显示内网的web的方法介绍
一.ip和端口都转发(跨机器) 将140.207.3.110(内网是192.168.0.139)服务器 端口为11450的数据转发到 192.168.0.138的1145端口上面去. 1.部署服务器1 ...
- linux下最简单的端口转发工具rinetd实现端口转发
在Linux系统中大多数情况选择用iptables来实现端口转发,iptables虽然强大,但配置不便,而且新手容易出错.在此分享另一个TCP/UDP端口转发工具rinetd,rinetd体积小巧,配 ...
- Windows配置端口转发绕过samba 445端口限制共享linux磁盘
概述 Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件.SMB(Server Messages Block,信息服务块)是一种在局域网上共享文件和打印机的一种通信协议,它为局域网内 ...
- nginx实现ip端口转发_nginx 怎么做端口转发
问题描述 前端本地mook数据,前端项目在http://127.0.0.1:3000/ Mook数据的node服务在 http://127.0.0.1:4003/ 所有的跨域请求接口类似这种 http ...
- linux查看端口转发配置文件,Linux配置端口转发
开启IP转发 首先开启IP转发功能,默认是关闭的. 临时修改: # echo 1 >/proc/sys/net/ipv4/ip_forward 修改过后就马上生效,但如果系统重启后则又恢复为默认 ...
- linux远程ipv6端口,SSH端口转发笔记(ipv6 与 端口映射)
端口转发概念 端口转发或隧道,是一种通过SSH转发本来不安全的TCP通信的安全保护罩.您可以保护例如POP3,SMTP和HTTP连接,否则可能是不安全的.网络上什么人都有! 有两种类型的端口转发:本地 ...
- 什么是端口转发?什么是端口映射?如何设置端口映射?
转载自:https://www.toutiao.com/a6717497107122487811/?app=news_article_lite&is_hit_share_recommend=0 ...
最新文章
- hdu 2295 Radar 重复覆盖+二分
- Don‘t support broadcast for binaryOp,
- vscode里好用的html插件_知乎口碑最好的六大PPT插件分享!用好插件,效率倍增...
- 【渝粤教育】广东开放大学 嵌入式数据库 形成性考核 (48)
- mysql查询结果每条记录两个字段求和_MYSQL实现将两个结果集合并,并且按照时间字段分组,其他字段的值求和...
- Linux并发程序课程设计报告,网络操作系统课程设计--进程机制与并发程序设计-linux下生产者与消费者的问题实现.doc...
- OSSIM中主动与被动探测工具(arpwatch+p0f+pads)组合应用
- Oracle之Union与Union all的区别
- pytorch损失函数(正在更新中,勿点进来看)
- windows安装多个maven_全网最容易理解的Maven安装、配置、集成演示
- Javascript之旅——第十站:为什么都说闭包难理解呢?
- MySQL主从同步(三)——M-S-S架构配置实战
- SpringBoot 整合 JPA
- 田彩蝶(帮别人名字作诗)
- Uva 12563 - Jin Ge Jin Qu(01背包)
- PWM驱动sg90电机
- Axure RP7.0学习记录
- 【微信小程序|Demo】订单结算页面
- PVE系列教程(十三)、安装黑苹果MacOS(Catalina版本)
- iOS 火星坐标相关整理及解决方案汇总
热门文章
- 计算机开机长响一声,电脑开机一声长响三声短响是什么原因?
- python counter转换为列表_Python标准库---collections.counter
- 洛谷:P5520 [yLOI2019] 青原樱(数学,普及/提高-)
- 你小子代码写成这样,老夫也无可奈何
- 评估电源质量20M带宽限制的问题
- 野人岛java游戏,生存战争之独闯野人岛
- Usability Testing Demystified
- 网站metro风格正式发布
- Windows Sever(修改计算机名并加入工作组)
- ASP.NET 安全认证(转自:寒羽枫cityhunter172)