ホームページ  >  記事  >  バックエンド開発  >  golang は API ゲートウェイを実装します

golang は API ゲートウェイを実装します

WBOY
WBOYオリジナル
2023-05-10 09:09:06763ブラウズ

マイクロサービス アーキテクチャの人気に伴い、異なるサービス間の通信が非常に重要な問題になっています。マイクロサービス アーキテクチャの安定した動作を保証するには、マイクロサービス アーキテクチャ間の通信を制御および管理するための適切な方法が必要です。 API ゲートウェイは、マイクロサービス間の通信を制御および管理するために使用される重要なコンポーネントです。

API ゲートウェイは、すべての API リクエストを対応するマイクロサービス インスタンスにルーティングすることで、サービス機能の公開と通信制御を実装するマイクロサービス アーキテクチャのパターンです。 API ゲートウェイは、セキュリティ、プロトコル変換、負荷分散、アクセス制御、その他の機能をリクエストと応答に追加することで、マイクロサービス アーキテクチャのセキュリティと信頼性を強化することもできます。実際のアプリケーションでは、API ゲートウェイは通常クラウド上にデプロイされ、分散システムを構築するための重要なツールです。

Golang は、高性能、高同時実行性、高効率、そしてメンテナンスの容易さという特徴を持つ優れたプログラミング言語です。マイクロサービス アーキテクチャでは、golang のプログラミング モデルはサービス間の通信と一致しているため、golang を使用して独自の API ゲートウェイを実装する企業が増えています。この記事では、golangを使って簡単なAPIゲートウェイを実装する方法を紹介します。

  1. API ゲートウェイのアーキテクチャを理解する

API ゲートウェイを実装する前に、API ゲートウェイの基本アーキテクチャを理解する必要があります。 API ゲートウェイの基本的なアーキテクチャは次のとおりです。

golang は API ゲートウェイを実装します

API ゲートウェイには次のコンポーネントが含まれています。

  • ルーター: 受信リクエストのルーティングを担当します。 ルート異なるマイクロサービス インスタンスに。
  • ロード バランサー: さまざまなマイクロサービス インスタンスにリクエストを分散する役割を果たします。
  • セキュリティ マネージャー (セキュリティ マネージャー): API ゲートウェイのセキュリティを管理して、ネットワーク リソースが不正なユニットによってアクセスされないようにします。
  • Validator (検証者): API 呼び出し元の身元を確認する責任を負います。
  • キャッシュ マネージャー (キャッシュ マネージャー): API 応答のキャッシュを管理し、マイクロサービスへの負荷を軽減します。
  • 管理者パネル (管理パネル): API ゲートウェイとマイクロサービスの視覚的なコントロール パネルを管理者に提供します。
  1. 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 にリダイレクトする必要があることに注意してください。

  1. ロード バランシング機能の追加

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。