Go で GRPC を使用するにはどうすればよいですか?

王林
リリース: 2023-05-10 14:03:06
転載
2544 人が閲覧しました

最新のアプリケーションの継続的な開発に伴い、高いパフォーマンスとスケーラビリティに対する要件もますます高まっているため、これらのニーズを満たすために、RPC プロトコルに基づく分散アーキテクチャが存在します。 GRPC は、Google の内部 StuB をベースにしたオープンソース フレームワークです。 GRPC は、アプリケーション間の標準化された通信を効率的に管理するように設計された、プログラミング言語間での通信のための拡張性の高いメカニズムを提供します。

この記事では、Go で GRPC を使用する方法を紹介します。GRPC の概念、GRPC を使用して通信する手順、Go での簡単な GRPC サービスの実装例について説明します。

GRPC

GRPC は、デフォルトのデータシリアル化メソッドとして protobuf を使用する、HTTP/2 に基づく RPC フレームワークです。これは、異なる言語間での通信を簡単に実現できることを意味します (生成されたコードと grpc によって提供されるミドルウェアを活用する)。

拡張性: GRPC は、コード ストリームと接続層で単純および複雑な認証および認可ロジックを実装でき、Kubernetes などの最新のコンピューティング プラットフォームと連携できます。

GRPC を使用した通信

このセクションでは、GRPC を使用して通信するための詳細な手順を紹介します。この記事では、Go 言語を使用して簡単な GRPC サービスを実装します。

ステップ 1: protobuf ファイルを定義する

まず、インターフェイスを宣言するために protobuf ファイルを定義する必要があります。この例では、2 つの数値を加算する単純なサービスを定義します。 .proto ファイルの内容は次のとおりです。

syntax = "proto3";

option go_package = ".;main";

package calculator;

message AddRequest {
    int32 x = 1;
    int32 y = 2;
}

message AddResponse {
    int32 result = 1;
}

service Calculator {
    rpc Add(AddRequest) returns (AddResponse);
}
ログイン後にコピー

この protobuf ファイルでは、AddRequest と AddResponse という 2 つのメッセージと、引数として 2 つの数値を受け取る Add メソッドを提供するサービス インターフェイス Calculator を定義します。そしてそれらの合計を返します。

ステップ 2: GO コードを生成する

次に、protoc ツールを使用して GO コードを生成する必要があります。次の方法でコードを生成できます。

protoc --go_out=plugins=grpc:. *.proto
ログイン後にコピー
ログイン後にコピー

このコマンドは、定義したサービスとメッセージの GO コードを含む calculator.pb.go ファイルを生成します。

ステップ 3: サーバー側の実装

サーバー側では、定義したインターフェイスのサービスを実装する必要があります。私たちの場合、サービスは 2 つの数値を加算してその合計を返す単純な加算サービスです。以下はサーバー コードです:

package main

import (
    "context"
    "net"
    "google.golang.org/grpc"
    pb "github.com/calculator"
)

type server struct{}

func (s *server) Add(ctx context.Context, req *pb.AddRequest) (*pb.AddResponse, error) {
    result := req.X + req.Y
    return &pb.AddResponse{Result:result}, nil
}

func main() {
    l, err := net.Listen("tcp", ":8080")
    if err != nil {
        panic(err)
    }
    s := grpc.NewServer()

    pb.RegisterCalculatorServer(s, &server{})

    err = s.Serve(l)
    if err != nil {
        panic(err)
    }
}
ログイン後にコピー

最初に「server」という名前の構造体を定義し、それに Add メソッドを追加します。このメソッドは 2 つの数値 x と y を受け取り、それらの合計を計算し、応答オブジェクトとして AddResponse を返します。

また、新しい grpc サービスを作成し、それをポート 8080 のローカル アドレスにバインドする main 関数も定義します。また、定義したサービスを grpc サーバーに挿入し、grpc サーバーを起動します。

ステップ 4: クライアントを実装する

最後に、サーバーにリクエストを送信し、レスポンスを受信できるクライアント コードを作成する必要があります。クライアント側コードとサーバー側コードの .proto ファイルは一致する必要があることに注意してください。以下はクライアント コードです:

package main

import (
    "context"
    "fmt"
    "google.golang.org/grpc"
    pb "github.com/calculator"
)

func main() {
    conn, err := grpc.Dial(":8080", grpc.WithInsecure())
    if err != nil {
        panic(err)
    }

    client := pb.NewCalculatorClient(conn)

    req := pb.AddRequest{X:2, Y:3}
    resp, err := client.Add(context.Background(), &req)
    if err != nil {
        panic(err)
    }

    fmt.Printf("Result: %d", resp.Result)
}
ログイン後にコピー

このクライアント コードでは、まず GRPC サーバーへの接続を作成し、次にこの接続を使用して新しいクライアントを作成します。次に、AddRequest を作成し、その値を 2 と 3 に設定して、リクエストをサーバーに送信します。最後に、サーバーの応答を受信して​​出力します。

サンプル コードの実行方法

サンプル コードを実行するには、まず Go 開発環境をセットアップし、関連する依存関係をインストールする必要があります。コード パッケージの名前が main であるとします。サンプル コードをローカルで実行するには、最初に次のコマンドを実行する必要があります:

go get -u google.golang.org/grpc
go get -u github.com/golang/protobuf/protoc-gen-go
ログイン後にコピー

次に、protoc コマンドを実行して go コードを生成します:

protoc --go_out=plugins=grpc:. *.proto
ログイン後にコピー
ログイン後にコピー

次に、サービスとクライアントのコードをコンパイルし、コンパイルします。それぞれを開始します:

go build server.go
go build client.go
./server
./client
ログイン後にコピー

すべてがうまくいけば、クライアントは追加リクエストを GRPC サーバーに送信し、結果が 5 として表示されます。

結論

この記事では、Go 言語で GRPC を使用する方法を紹介します。最初に GRPC の概念について説明し、次に protobuf を使用してインターフェイス仕様を定義する方法、GO コードを生成する方法、および単純な GRPC サービスを実装する方法を示しました。これらの手順を使用すると、Go で GRPC の使用を開始し、高性能でスケーラブルな分散システムを実装できます。

以上がGo で GRPC を使用するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート