2015-04-06 22 views
5

İnternetten araştırdım, ancak bunu bulamadım. REST arayüzleri çalıştıran birkaç mikroservisine sahip sistemim için Go ve Martini'yi kullanarak basit bir API ağ geçidi oluşturmaya çalışıyorum. Örneğin, benim users hizmet 192.168.2.8:8000 üzerinde çalışan var ve ben Yani benim API geçidi böyle bir şey olmazdı /usersBasit API Ağ Geçidi proxy'sine gidin

aracılığıyla erişmek istediğiniz:

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


düzenlemeyi


Çalıştığım bir şey var, ancak görebildiğim tek şey [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) 
    } 
} 


düzenlemek 2


Bu yalnızca, XMLHttpRequest inşaat iyi tarayıcı aracılığıyla doğrudan kullanırken bir sorunla gibi görünüyor

+3

Kullanıcı martini'nin herhangi bir sebebi ... net/http paketi ile yapabilirsiniz. –

+0

Biliyorum, ama aynı zamanda bazı statik dosya sunumları ve diğer şeyler yapmak zorunda olacak, ağ geçidi uygulamanın sadece bir parçası – Dirk

cevap

5

stdlib versiyonu

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

Sarma http.StripPrefix, günlüğe kaydetmeniz gerekiyorsa çağırmadan önce oturum açan bir işlevle.

İlgili konular