• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

[Go]基于Go语言的Web路由转发,多个网站共享一个端口(新版本,支持WebSocket) ...

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

之前编写过一个Web路由转发,可以参考我之前的博客

之前的版本具有很多问题,所前段时间一直很忙,在做我的新东西和实习,所以就一直没更新

今天忙里偷闲,就更新一下Web路由

主要解决的还是多语言Web开发时,整合至一个端口的问题

当然除了这个功能,还有很多有趣的用法,比如网站镜像,绕过备案等玩法

废话不说直接上代码

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(){
    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)
    }
}

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()
}

下面是配置文件

{
    "MainPort": "80",
    "Rules": [
        {
            "Domain":"bt.onlinecode.cn",
            "Address":"123.207.241.119:88"
        },
        {
            "Domain":"test.onlinecode.cn",
            "Address":"123.207.241.119"
        }
    ]
}

MainPort:监听的主端口

Rules:就是定义的相关规则,Domain是绑定的IP或域名,Address就是真实的地址

下面是运行输出

下面是项目地址:

https://github.com/leeli73/WebRouter

包括Windows x64和Linux x64的几个release


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Go语言实现列出排列组合发布时间:2022-07-10
下一篇:
带你十天轻松搞定 Go 微服务系列(六)发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap