Golangチュートリアルですコラム Golang で簡単な API ゲートウェイを実装する方法を紹介します。
最近のプロジェクトでは、マイクロサービス アーキテクチャ-go-kit がバックエンド開発に使用されました。マイクロサービス アーキテクチャ スタイルでは、大規模なアプリケーションが複数の小さなサービス システムに分割されます。これらの小さなシステムは自己完結型にすることができます。つまり、これらの小さなシステムは独自のデータベース、フレームワーク、さらには言語を持つことができます。そのため、
API Gateway (API Gataway). 実際、インターネット上には既製の実装フレームワークが多数存在しますが、このプロジェクトの要件は比較的単純であるため、Golang を使用します。それは自分自身です。
API ゲートウェイはサーバーであり、システムへの唯一の入り口です。オブジェクト指向設計の観点から見ると、これはファサード パターンに似ています。 API ゲートウェイはシステムの内部アーキテクチャをカプセル化し、各クライアントにカスタマイズされた API を提供します。また、認証、監視、ロード バランシング、キャッシュ、リクエストのシャーディングと管理、静的応答の処理などの他の役割も担う場合があります。API ゲートウェイの実装には多くのテクノロジが使用されており、大まかに次のカテゴリに分類されます:
、
Haproxy,…
,
Servlet,…
,
Zuul,
Zuul2,...
net/http/httputil パッケージの
ReverseProxy タイプに基づいて、単純なリバース プロキシを実装します。リバース プロキシの実装には、主に
func NewSingleHostReverseProxy(target *url.URL) *ReverseProxy と
type ReverseProxy が含まれます。
func NewSingleHostReverseProxy(target *url.URL) *ReverseProxy
// NewSingleHostReverseProxy returns a new ReverseProxy that routes// URLs to the scheme, host, and base path provided in target. If the// target's path is "/base" and the incoming request was for "/dir",// the target request will be for /base/dir.// NewSingleHostReverseProxy does not rewrite the Host header.// To rewrite Host headers, use ReverseProxy directly with a custom// Director policy.func NewSingleHostReverseProxy(target *url.URL) *ReverseProxy { targetQuery := target.RawQuery director := func(req *http.Request) { req.URL.Scheme = target.Scheme req.URL.Host = target.Host req.URL.Path = singleJoiningSlash(target.Path, req.URL.Path) if targetQuery == "" || req.URL.RawQuery == "" { req.URL.RawQuery = targetQuery + req.URL.RawQuery } else { req.URL.RawQuery = targetQuery + "&" + req.URL.RawQuery } if _, ok := req.Header["User-Agent"]; !ok { // explicitly disable User-Agent so it's not set to default value req.Header.Set("User-Agent", "") } } return &ReverseProxy{Director: director}}
NewSingleHostReverseProxy
URLs リクエストを
target スキーム#の指定された
にルーティングする新しい ReverseProxy
を返します。 ##、ホスト
、ベースパス
。 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">// ReverseProxy is an HTTP Handler that takes an incoming request and// sends it to another server, proxying the response back to the// client.type ReverseProxy struct {
// Director must be a function which modifies
// the request into a new request to be sent
// using Transport. Its response is then copied
// back to the original client unmodified.
// Director must not access the provided Request
// after returning.
Director func(*http.Request)
Transport http.RoundTripper
FlushInterval time.Duration
ErrorLog *log.Logger
BufferPool BufferPool // ModifyResponse is an optional function that modifies the
// Response from the backend. It is called if the backend
// returns a response at all, with any HTTP status code.
// If the backend is unreachable, the optional ErrorHandler is
// called without any call to ModifyResponse.
//
// If ModifyResponse returns an error, ErrorHandler is called
// with its error value. If ErrorHandler is nil, its default
// implementation is used.
ModifyResponse func(*http.Response) error
ErrorHandler func(http.ResponseWriter, *http.Request, error)}</pre><div class="contentsignin">ログイン後にコピー</div></div></p>ReverseProxy<p> タイプには、<code>Director
と ModifyResponse
という 2 つの重要な属性があり、どちらも関数タイプです。の場合、ServeHTTP
関数は、最初に Director
関数を呼び出して、受信したリクエスト本文を変更 (リクエストのターゲット アドレス、リクエスト ヘッダーなどを変更するなど) し、その後、変更されたリクエスト本文を使用して、新しいリクエストを受信し、レスポンスを受信し、ModifyResponse
関数を呼び出してレスポンスを変更し、最後に変更されたレスポンスボディをコピーしてクライアントに応答することで、リバース プロキシ プロセス全体が実現されます。
では、ソース コードが受信 URLs
を解析し、Director
の変更を完了しました。必要なのは を呼び出すだけです。 NewSingleHostReverseProxy
関数を渡し、対象サーバーの URL を渡すと、単純なリバース プロキシが完成します。 コード
userモジュールと
auth
モジュールのみが含まれています。一部の部分は変更できます実際のニーズに応じて。
以上がGolang で単純な API ゲートウェイを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。