マイクロサービス アーキテクチャの人気に伴い、異なるサービス間の通信が非常に重要な問題になっています。マイクロサービス アーキテクチャの安定した動作を保証するには、マイクロサービス アーキテクチャ間の通信を制御および管理するための適切な方法が必要です。 API ゲートウェイは、マイクロサービス間の通信を制御および管理するために使用される重要なコンポーネントです。
API ゲートウェイは、すべての API リクエストを対応するマイクロサービス インスタンスにルーティングすることで、サービス機能の公開と通信制御を実装するマイクロサービス アーキテクチャのパターンです。 API ゲートウェイは、セキュリティ、プロトコル変換、負荷分散、アクセス制御、その他の機能をリクエストと応答に追加することで、マイクロサービス アーキテクチャのセキュリティと信頼性を強化することもできます。実際のアプリケーションでは、API ゲートウェイは通常クラウド上にデプロイされ、分散システムを構築するための重要なツールです。
Golang は、高性能、高同時実行性、高効率、そしてメンテナンスの容易さという特徴を持つ優れたプログラミング言語です。マイクロサービス アーキテクチャでは、golang のプログラミング モデルはサービス間の通信と一致しているため、golang を使用して独自の API ゲートウェイを実装する企業が増えています。この記事では、golangを使って簡単なAPIゲートウェイを実装する方法を紹介します。
API ゲートウェイを実装する前に、API ゲートウェイの基本アーキテクチャを理解する必要があります。 API ゲートウェイの基本的なアーキテクチャは次のとおりです。
API ゲートウェイには次のコンポーネントが含まれています。
次に、golang を使用して API ゲートウェイ コードを実装する方法を見てみましょう。 gin フレームワークを使用して、API ゲートウェイの基本機能を実装します。まず、gin フレームワークをインストールする必要があります:
go get -u github.com/gin-gonic/gin
次に、gin フレームワークを通じて API ゲートウェイの基本的なルーティング制御を実装するための最初のサンプル コードを作成します:
package main import ( "net/http" "github.com/gin-gonic/gin" ) func main() { router := gin.Default() router.GET("/", func(c *gin.Context) { c.JSON(http.StatusOK, gin.H{ "message": "Hello, world!", }) }) router.Run(":8080") }
コード 次に、http://localhost:8080/ にアクセスして、コードが正しく動作することを確認します。次に、API ゲートウェイのルーティング制御を実装するためのより複雑なコードを記述してみましょう。この例では、受信リクエストを別のマイクロサービス インスタンスにルーティングする方法を示します。
package main import ( "net/http" "net/http/httputil" "net/url" "github.com/gin-gonic/gin" ) func main() { router := gin.Default() api1 := router.Group("/api1") api1.GET("/user/:id", func(c *gin.Context) { director := func(req *http.Request) { url, _ := url.Parse("http://user-service:8080") req.URL.Scheme = url.Scheme req.URL.Host = url.Host req.URL.Path = "/user/" + c.Param("id") } proxy := &httputil.ReverseProxy{Director: director} proxy.ServeHTTP(c.Writer, c.Request) }) api2 := router.Group("/api2") api2.GET("/order/:id", func(c *gin.Context) { director := func(req *http.Request) { url, _ := url.Parse("http://order-service:8080") req.URL.Scheme = url.Scheme req.URL.Host = url.Host req.URL.Path = "/order/" + c.Param("id") } proxy := &httputil.ReverseProxy{Director: director} proxy.ServeHTTP(c.Writer, c.Request) }) router.Run(":8080") }
この例では、それぞれが異なる API リクエストに対応する 2 つのルーターを作成しました。各ルーターで、パラメーターを使用して GET リクエストを定義します。これらのリクエストが呼び出されると、最初にルーター内でルーティングされ、次に対応するマイクロサービス インスタンスにリダイレクトされます。リダイレクトする前に、ReverseProxy を使用してリクエスト内の URL をマイクロサービス インスタンスの URL にリダイレクトする必要があることに注意してください。
API ゲートウェイのもう 1 つの非常に重要なコンポーネントはロード バランサーです。ロード バランサーはリクエストを複数のマイクロサービス インスタンスに分散できるため、システム全体の信頼性とパフォーマンスが向上します。以下は、golang を使用して単純なロード バランサーを実装する方法のコード例です。
まず、Consul と Consul API をインストールする必要があります:
go get github.com/hashicorp/consul/api
これで、Consul と Consul API を使用して、すべてのマイクロサービス インスタンスのステータスを定期的にチェックし、動的にチェックする Consul クライアントを作成できるようになります。負荷状況に基づいてロードバランサーを選択します。以下は、Consul および Consul API を使用してクライアントを作成するコード例です。
package main import ( "fmt" "log" "net/http" "net/http/httputil" "net/url" "sync" "github.com/gin-gonic/gin" "github.com/hashicorp/consul/api" ) type ServiceEndpoints struct { Urls []string } type LoadBalance struct { Services map[string]ServiceEndpoints Current map[string]int Mutex sync.Mutex } func NewLoadBalance(consulAddress string) (*LoadBalance, error) { lb := &LoadBalance{ Services: make(map[string]ServiceEndpoints), Current: make(map[string]int), } conf := api.DefaultConfig() conf.Address = consulAddress client, err := api.NewClient(conf) if err != nil { return nil, err } services, _, err := client.Health().Service("user-service", "", true, nil) if err != nil { return nil, err } for _, svc := range services { serviceUrl := fmt.Sprintf("%v:%v", svc.Service.Address, svc.Service.Port) lb.Services["user-service"] = ServiceEndpoints{ Urls: append(lb.Services["user-service"].Urls, serviceUrl), } } return lb, nil } func (lb *LoadBalance) NextEndpoint(serviceName string) string { lb.Mutex.Lock() defer lb.Mutex.Unlock() endpoints := lb.Services[serviceName] currentIndex := lb.Current[serviceName] nextIndex := (currentIndex + 1) % len(endpoints.Urls) lb.Current[serviceName] = nextIndex return endpoints.Urls[nextIndex] } func main() { router := gin.Default() lb, err := NewLoadBalance("localhost:8500") if err != nil { log.Fatal(err) } api1 := router.Group("/api1") api1.GET("/user/:id", func(c *gin.Context) { director := func(req *http.Request) { urlStr := lb.NextEndpoint("user-service") url, _ := url.Parse(urlStr) req.URL.Scheme = url.Scheme req.URL.Host = url.Host req.URL.Path = "/user/" + c.Param("id") } proxy := &httputil.ReverseProxy{Director: director} proxy.ServeHTTP(c.Writer, c.Request) }) router.Run(":8080") }
この例では、まず Consul API を使用して、コンストラクター内のすべてのマイクロサービス インスタンスのステータスを NextEndpoint 関数を通じて定期的に取得します。 LoadBalance では、負荷を順番に分散します。 LoadBalance 構造とその関連機能を、API ゲートウェイの異なるルート間で共有される独立したモジュールとして定義していることに注意してください。 API のルーティングでは、LoadBalance 構造で返された URL にリクエストをリダイレクトします。
概要
この記事を通じて、API ゲートウェイにおける golang の基本的なアプリケーションをすでに理解しているはずです。私たちはインフラストラクチャから始めて、ルーティング制御、負荷分散、セキュリティ管理、および API ゲートウェイのその他の機能を示すいくつかの単純な golang コードをデモンストレーションしました。このコンテンツが、マイクロサービス アーキテクチャにおける golang のアプリケーションをより深く理解し、プロジェクトに役立つことを願っています。
以上がgolang は API ゲートウェイを実装しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。