文章目录

  • 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开发 之 单端口转发到多个端口相关推荐

  1. nginx监听80端口转发到tomcat 8080端口

    nginx的配置目录:/etc/nginx下 因为nginx会自动导入sites-available/default的文件和conf.d文件夹下的conf文件,我选择通过第二种方式倒入配置: 1.cd ...

  2. ssh远程端口转发到本地_Linux SSH隧道或端口转发本地和远程端口的示例?

    ssh远程端口转发到本地 Ssh protocol secures remote connections which are shell or terminal-based to the remote ...

  3. mysql端口转发_SSH做MySQL端口转发

    端口映射其实就是将其中一台网络设备(一个路由器.一台电脑或服务器)的某一个端口转换到另一个网络设备上,其实际上是NAT地址转换的一种. linux下的ssh连结命令实现的端口转发功能,在讲解端口转发前 ...

  4. ip以及端口转发数据、根据端口转发显示内网的web的方法介绍

    一.ip和端口都转发(跨机器) 将140.207.3.110(内网是192.168.0.139)服务器 端口为11450的数据转发到 192.168.0.138的1145端口上面去. 1.部署服务器1 ...

  5. linux下最简单的端口转发工具rinetd实现端口转发

    在Linux系统中大多数情况选择用iptables来实现端口转发,iptables虽然强大,但配置不便,而且新手容易出错.在此分享另一个TCP/UDP端口转发工具rinetd,rinetd体积小巧,配 ...

  6. Windows配置端口转发绕过samba 445端口限制共享linux磁盘

    概述 Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件.SMB(Server Messages Block,信息服务块)是一种在局域网上共享文件和打印机的一种通信协议,它为局域网内 ...

  7. nginx实现ip端口转发_nginx 怎么做端口转发

    问题描述 前端本地mook数据,前端项目在http://127.0.0.1:3000/ Mook数据的node服务在 http://127.0.0.1:4003/ 所有的跨域请求接口类似这种 http ...

  8. linux查看端口转发配置文件,Linux配置端口转发

    开启IP转发 首先开启IP转发功能,默认是关闭的. 临时修改: # echo 1 >/proc/sys/net/ipv4/ip_forward 修改过后就马上生效,但如果系统重启后则又恢复为默认 ...

  9. linux远程ipv6端口,SSH端口转发笔记(ipv6 与 端口映射)

    端口转发概念 端口转发或隧道,是一种通过SSH转发本来不安全的TCP通信的安全保护罩.您可以保护例如POP3,SMTP和HTTP连接,否则可能是不安全的.网络上什么人都有! 有两种类型的端口转发:本地 ...

  10. 什么是端口转发?什么是端口映射?如何设置端口映射?

    转载自:https://www.toutiao.com/a6717497107122487811/?app=news_article_lite&is_hit_share_recommend=0 ...

最新文章

  1. hdu 2295 Radar 重复覆盖+二分
  2. Don‘t support broadcast for binaryOp,
  3. vscode里好用的html插件_知乎口碑最好的六大PPT插件分享!用好插件,效率倍增...
  4. 【渝粤教育】广东开放大学 嵌入式数据库 形成性考核 (48)
  5. mysql查询结果每条记录两个字段求和_MYSQL实现将两个结果集合并,并且按照时间字段分组,其他字段的值求和...
  6. Linux并发程序课程设计报告,网络操作系统课程设计--进程机制与并发程序设计-linux下生产者与消费者的问题实现.doc...
  7. OSSIM中主动与被动探测工具(arpwatch+p0f+pads)组合应用
  8. Oracle之Union与Union all的区别
  9. pytorch损失函数(正在更新中,勿点进来看)
  10. windows安装多个maven_全网最容易理解的Maven安装、配置、集成演示
  11. Javascript之旅——第十站:为什么都说闭包难理解呢?
  12. MySQL主从同步(三)——M-S-S架构配置实战
  13. SpringBoot 整合 JPA
  14. 田彩蝶(帮别人名字作诗)
  15. Uva 12563 - Jin Ge Jin Qu(01背包)
  16. PWM驱动sg90电机
  17. Axure RP7.0学习记录
  18. 【微信小程序|Demo】订单结算页面
  19. PVE系列教程(十三)、安装黑苹果MacOS(Catalina版本)
  20. iOS 火星坐标相关整理及解决方案汇总

热门文章

  1. 计算机开机长响一声,电脑开机一声长响三声短响是什么原因?
  2. python counter转换为列表_Python标准库---collections.counter
  3. 洛谷:P5520 [yLOI2019] 青原樱(数学,普及/提高-)
  4. 你小子代码写成这样,老夫也无可奈何
  5. 评估电源质量20M带宽限制的问题
  6. 野人岛java游戏,生存战争之独闯野人岛
  7. Usability Testing Demystified
  8. 网站metro风格正式发布
  9. Windows Sever(修改计算机名并加入工作组)
  10. ASP.NET 安全认证(转自:寒羽枫cityhunter172)