9

これを行う方法をインターネット全体で検索してきましたが、見つけることができませんでした。Go と Martini を使用して、REST インターフェイスが実行されているいくつかのマイクロサービスを備えたシステム用に単純な API ゲートウェイを構築しようとしています。たとえば、usersサービスを で実行していて192.168.2.8:8000、 からアクセスしたいとします。/users

したがって、私の API ゲートウェイは次のようになります。

package main

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

func main(){
    app := martini.Classic()
    app.Get("/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("/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動作します

4

1 に答える 1

12

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("/users/", http.StripPrefix("/users/", httputil.NewSingleHostReverseProxy(target)))
    http.Handle("/public/", http.StripPrefix("/public/", http.FileServer(http.Dir("./Documents"))))
    log.Fatal(http.ListenAndServe(":8080", nil))
}

http.StripPrefixログが必要な場合は、呼び出す前にログを記録する関数でラップします。

于 2015-04-08T01:55:47.683 に答える