2015-04-06 150 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帶有在調用之前記錄的功能,如果需要記錄日誌。