ホームページ >バックエンド開発 >Golang >Golang で単純な API ゲートウェイを実装する方法

Golang で単純な API ゲートウェイを実装する方法

藏色散人
藏色散人転載
2020-08-31 17:06:313731ブラウズ

次は

Golangチュートリアルですコラム Golang で簡単な API ゲートウェイを実装する方法を紹介します。

Golang で単純な API ゲートウェイを実装する方法

最近のプロジェクトでは、マイクロサービス アーキテクチャ-

go-kit がバックエンド開発に使用されました。マイクロサービス アーキテクチャ スタイルでは、大規模なアプリケーションが複数の小さなサービス システムに分割されます。これらの小さなシステムは自己完結型にすることができます。つまり、これらの小さなシステムは独自のデータベース、フレームワーク、さらには言語を持つことができます。そのため、 API Gateway (API Gataway). 実際、インターネット上には既製の実装フレームワークが多数存在しますが、このプロジェクトの要件は比較的単純であるため、Golang を使用します。それは自分自身です。

実装

API ゲートウェイはサーバーであり、システムへの唯一の入り口です。オブジェクト指向設計の観点から見ると、これはファサード パターンに似ています。 API ゲートウェイはシステムの内部アーキテクチャをカプセル化し、各クライアントにカスタマイズされた API を提供します。また、認証、監視、ロード バランシング、キャッシュ、リクエストのシャーディングと管理、静的応答の処理などの他の役割も担う場合があります。

API ゲートウェイの実装には多くのテクノロジが使用されており、大まかに次のカテゴリに分類されます:

    ユニバーサル リバース プロキシ:
  • NginxHaproxy,…
  • ネットワーク プログラミング フレームワーク:
  • Netty, Servlet,…
  • API ゲートウェイ フレームワーク:
  • Spring Cloud Gateway, Zuul, Zuul2,...
API ゲートウェイの最も基本的な機能は、リバース プロキシです。実装方法は多数ありますが、この記事では、標準ライブラリ

net/http/httputil パッケージの ReverseProxy タイプに基づいて、単純なリバース プロキシを実装します。リバース プロキシの実装には、主に func NewSingleHostReverseProxy(target *url.URL) *ReverseProxytype 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 を返します。 ##、ホストベースパス<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>

ReverseProxy

タイプには、DirectorModifyResponse という 2 つの重要な属性があり、どちらも関数タイプです。の場合、ServeHTTP 関数は、最初に Director 関数を呼び出して、受信したリクエスト本文を変更 (リクエストのターゲット アドレス、リクエスト ヘッダーなどを変更するなど) し、その後、変更されたリクエスト本文を使用して、新しいリクエストを受信し、レスポンスを受信し、ModifyResponse 関数を呼び出してレスポンスを変更し、最後に変更されたレスポンスボディをコピーしてクライアントに応答することで、リバース プロキシ プロセス全体が実現されます。

NewSingleHostReverseProxy

では、ソース コードが受信 URLs を解析し、Director の変更を完了しました。必要なのは を呼び出すだけです。 NewSingleHostReverseProxy 関数を渡し、対象サーバーの URL を渡すと、単純なリバース プロキシが完成します。 コード

サンプル コードには、マイクロサービスの
user

モジュールと auth モジュールのみが含まれています。一部の部分は変更できます 実際のニーズに応じて。

以上がGolang で単純な API ゲートウェイを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。