2015-04-06 194 views
5

我一直在搜索整个互联网如何做到这一点,但我一直没能找到它。我正尝试使用Go和Martini为我的系统构建一个简单的API网关,该系统包含几个运行REST接口的微服务。例如,我有192.168.2.8:8000运行我users服务,我想通过/users去简单的API网关代理

访问呢?所以我的API网关会是这个样子:

package main 

import (
    "github.com/codegangsta/martini" 
    "net/http" 
) 

func main(){ 
    app := martini.Classic() 
    app.Get("https://stackoverflow.com/users/:resource", func(req *http.Request, res http.ResponseWriter){ 
     //proxy to http://192.168.2.8:8000/:resource 
    }) 
    app.Run() 
} 


编辑


我有一些工作,但我看到的是[vhost v2] release 2.2.5

package main 

import(
    "net/url" 
    "net/http" 
    "net/http/httputil" 
    "github.com/codegangsta/martini" 
    "fmt" 
) 

func main() { 
    remote, err := url.Parse("http://127.0.0.1:3000") 
    if err != nil { 
     panic(err) 
    } 

    proxy := httputil.NewSingleHostReverseProxy(remote) 
    app := martini.Classic() 
    app.Get("https://stackoverflow.com/users/**", handler(proxy)) 
    app.RunOnAddr(":4000") 
} 

func handler(p *httputil.ReverseProxy) func(http.ResponseWriter, *http.Request, martini.Params) { 
    return func(w http.ResponseWriter, r *http.Request, params martini.Params) { 
     fmt.Println(params) 
     r.URL.Path = "/authorize" 
     p.ServeHTTP(w, r) 
    } 
} 


编辑2


这似乎只直接使用通过浏览器,XMLHttpRequest作品就好了,当它成为一个问题

+3

用户马提尼的任何理由......你可以用net/http包做所有的事情。 –

+0

我知道,但它也必须做一些静态文件服务和其他事情,网关只是应用程序的一部分 – Dirk

回答

5

STDLIB版本

package main 

import (
    "log" 
    "net/http" 
    "net/http/httputil" 
    "net/url" 
) 

func main() { 
    target, err := url.Parse("http://192.168.2.8:8000") 
    if err != nil { 
     log.Fatal(err) 
    } 
    http.Handle("https://stackoverflow.com/users/", http.StripPrefix("https://stackoverflow.com/users/", httputil.NewSingleHostReverseProxy(target))) 
    http.Handle("/public/", http.StripPrefix("/public/", http.FileServer(http.Dir("./Documents")))) 
    log.Fatal(http.ListenAndServe(":8080", nil)) 
} 

Wrap http.StripPrefix带有在调用之前记录的功能,如果需要记录日志。