「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > gRPC と Go: 高性能 Web サービスの構築

gRPC と Go: 高性能 Web サービスの構築

2024 年 11 月 17 日に公開
ブラウズ:317

gRPC and Go: Building High-Performance Web Services

導入

マイクロサービスと分散システムの世界では、サービス間の効率的な通信が非常に重要です。ここで、Google が開発した高性能 RPC (Remote Procedure Call) フレームワークである gRPC が登場します。シンプルさと効率性を追求して設計された静的に型付けされ、コンパイルされたプログラミング言語である Go と組み合わせると、gRPC は堅牢でスケーラブルな Web サービスの構築に役立ちます。

gRPC とは何ですか?

gRPC は、google Remote Procedure Call の略です。これは、トランスポートに HTTP/2 を使用し、インターフェース記述言語としてプロトコル バッファーを使用し、認証、負荷分散などの機能を提供するオープンソース フレームワークです。 gRPC を使用すると、.proto ファイルでサービス メソッドとメッセージ タイプを定義でき、これを使用して複数の言語でクライアント コードとサーバー コードを生成できます。

Go で gRPC を使用する理由

  1. パフォーマンス: gRPC は HTTP/2 を使用します。これにより、単一の接続上で複数のリクエストを多重化し、遅延を削減し、パフォーマンスを向上させることができます。
  2. コード生成: プロトコル バッファーを使用すると、サービスを一度定義すれば、Go でクライアント コードとサーバー コードを生成できるため、一貫性が確保され、定型コードが削減されます。
  3. ストリーミング: gRPC はクライアント側、サーバー側、双方向のストリーミングをサポートしているため、リアルタイム アプリケーションに最適です。
  4. 相互運用性: gRPC サービスは、さまざまな言語で記述されたクライアントで利用できるため、多言語環境にとって多用途の選択肢となります。

Go で gRPC を始める

  • ### 前提条件

    開始する前に、以下がインストールされていることを確認してください:

    • Go (最新の 2 つのメジャー リリースのいずれか)
    • プロトコル バッファ コンパイラ (protoc)
    • プロトコル バッファー コンパイラー用の Go プラグイン

    次のコマンドを使用して Go プラグインをインストールできます:

    go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
    go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
    

    protoc コンパイラーがプラグインを見つけられるように PATH を更新します:

    export PATH="$PATH:$(go env GOPATH)/bin"
    

    ターミナルを開いて次のように入力して、protoc がシステムにインストールされ構成されていることを確認します:

    protoc --version
    

    次のような出力が表示されるはずです

    C:\Users\Guest>protoc --version
    ~ libprotoc 27.3
    

    protoc コマンドが認識されない場合は、Windows 用 Chocolatey を使用してプロトコル バッファをインストールできます:

    choco install protoc
    

    これに当てはまらない場合、chocolatey がインストールされていない場合、または別の OS を使用している場合は、ここで公式のインストール ドキュメントを参照してください。

    サービスの定義

    gRPC サービスを定義する .proto ファイルを作成します。例えば:

    helloworld.proto

    syntax = "proto3";
    package helloworld;
    
    message HelloRequest {
        string name = 1;
    }
    message HelloResponse {
        string message = 1;
    }
    
    service Greeter {
        rpc SayHello (HelloRequest) returns (HelloResponse) {}
    }
    

    コードの生成

    .proto ファイルから Go コードを生成します:

    protoc --go_out=. --go-grpc_out=. helloworld.proto
    

    サーバーの実装

    Go でサーバーを作成する:

    server.go

    package main
    
    import (
        "context"
        "log"
        "net"
    
        "google.golang.org/grpc"
        pb "path/to/your/proto"
    )
    
    type server struct {
        pb.GreeterServer
    }
    
    func main() {
        lis, err := net.Listen("tcp", ":8080")
        if err != nil {
            log.Fatalf("failed to listen: %v", err)
        }
    
        log.Printf("Server started at %v", lis.Addr())
    
        grpcServer := grpc.NewServer()
        pb.RegisterGreeterServer(grpcServer, &server{})
        if err := grpcServer.Serve(lis); err != nil {
            log.Fatalf("failed to serve: %v", err)
        }
    }
    
    // SayHello name should be the same RPC name as defined in your proto file
    func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloResponse, error) {
        return &pb.HelloResponse{Message: "Hello "   in.Name}, nil
    }
    

    クライアントの作成

    Go でクライアントを作成する:

    client.go

    package main
    
    import (
        "context"
        "log"
        "os"
        "time"
    
        "google.golang.org/grpc"
        pb "path/to/your/proto"
    )
    
    func main() {
        conn, err := grpc.NewClient("localhost:8080", grpc.WithTransportCredentials(insecure.NewCredentials()))
        if err != nil {
            log.Fatalf("did not connect: %v", err)
        }
        defer conn.Close()
        client := pb.NewGreeterClient(conn)
    
        name := "John Doe"
        if len(os.Args) > 1 {
            name = os.Args[1]
        }
    
        callSayHello( client, name )
    }
    
    func callSayHello(client pb.GrpcServiceClient, name string) {
        ctx, cancel := context.WithTimeout(context.Background(), time.Second)
        defer cancel()
    
        res, err := client.SayHello(ctx, &pb.HelloRequest{Name: name})
        if err != nil {
            log.Fatalf("Failed to called: %v", err)
        }
        log.Printf("%v", res)
    }
    

結論

gRPC と Go は、高性能でスケーラブルな Web サービスを構築するための強力な組み合わせを提供します。両方の長所を活用することで、保守と拡張が簡単な、効率的で信頼性の高いアプリケーションを作成できます。

デモ リポジトリへのリンク: Github.com

リリースステートメント この記事は次の場所に転載されています: https://dev.to/amarjit/grpc-and-go-building-high-performance-web-services-5ea6?1 侵害がある場合は、削除するために[email protected]に連絡してください。それ
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3