Go Academy · レッスン

Unary gRPCサービスの実装

grpc-goによるサーバーとクライアント

レッスン 2/413 ステップ

「Unary gRPCサービスの実装」はCoddyKit上の無料Go Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはGo Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Go Academyコースには全4レッスンが含まれています。

unary RPCとは

unary RPCは最も単純なgRPCのパターンです。クライアントが1つのリクエストを送信し、1つのレスポンスを受け取ります。ネットワーク越しに通常の関数を呼び出す場合と似ています。

サーバーの実装

生成されたインターフェースを実装します。前方互換性を確保するため、Unimplemented*Server構造体を埋め込みます:

type userServer struct {
    pb.UnimplementedUserServiceServer
    db *sql.DB
}

func (s *userServer) GetUser(ctx context.Context, req *pb.GetUserRequest) (*pb.User, error) {
    // query DB
    return &pb.User{Id: req.Id, Name: "Alice"}, nil
}

サーバーの起動

gRPCサーバーを作成し、実装を登録して、TCPポートで待ち受けます:

lis, _ := net.Listen("tcp", ":50051")
grpcSrv := grpc.NewServer()
pb.RegisterUserServiceServer(grpcSrv, &userServer{})
log.Fatal(grpcSrv.Serve(lis))

クライアント接続

サーバーにダイヤルし、クライアントスタブを作成します:

conn, err := grpc.NewClient("localhost:50051", grpc.WithTransportCredentials(insecure.NewCredentials()))
if err != nil { log.Fatal(err) }
defer conn.Close()
client := pb.NewUserServiceClient(conn)

unary呼び出しの実行

ローカル関数であるかのように、クライアントスタブ上のRPCメソッドを呼び出します:

ctx, cancel := context.WithTimeout(context.Background(), time.Second)
defer cancel()
user, err := client.GetUser(ctx, &pb.GetUserRequest{Id: 42})
if err != nil { log.Fatalf("error: %v", err) }
fmt.Println(user.Name)

エラー処理

gRPCではステータスコードを使用します。status.Errorfでエラーを返し、status.Code(err)で確認します:

import "google.golang.org/grpc/status"
import "google.golang.org/grpc/codes"

// Server:
return nil, status.Errorf(codes.NotFound, "user %d not found", req.Id)
// Client:
if status.Code(err) == codes.NotFound { /* handle */ }

コンテキストの伝播

クライアントのRPC呼び出しに渡したコンテキストは、デッドラインとキャンセルをサーバーに伝播します。サーバーでは、そのコンテキストを下流の呼び出し(DBや他のRPC)にも渡す必要があります。

本番環境向けのTLS

本番環境では、安全でない認証情報をTLSに置き換えます:

creds, _ := credentials.NewServerTLSFromFile("cert.pem", "key.pem")
grpcSrv := grpc.NewServer(grpc.Creds(creds))

UnimplementedServer

pb.UnimplementedXxxServerを埋め込むと、すべてのRPCメソッドに対してUnimplementedステータスを返すスタブ実装が提供されます。これにより、実装前の新しいRPCをprotoに追加しても、サーバーをコンパイルできます。

grpc.Dialとgrpc.NewClient

grpc.Dialは新しいバージョンでは非推奨です。接続をすぐには確立せず、最初のRPC呼び出し時に遅延して確立するgrpc.NewClientを使用してください。

リフレクションサービス

gRPCリフレクションサービスを登録すると、.protoファイルがなくてもgrpcurlなどのツールで利用可能なサービスを調べられるようになります:

reflection.Register(grpcSrv)

クイックチェック

gRPCサーバーの構造体にpb.UnimplementedXxxServerを埋め込む目的は何ですか?

復習:unary gRPC

重要なポイント:

  • 生成されたインターフェースを実装し、UnimplementedServerを埋め込みます
  • grpc.NewServer()でサーバーを作成し、TCPリスナーに登録してServeします
  • クライアントではgrpc.NewClientと生成されたNewXxxClientを使用します
  • gRPCのエラー処理にはstatus.Errorf/status.Codeを使用します
無料で開始

AI チューターと学ぶ Go — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
51
レッスン
203

よくある質問

「Unary gRPCサービスの実装」レッスンは無料ですか?

はい。「Unary gRPCサービスの実装」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Go Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Go Academyコースには全4レッスンが含まれています。

「Unary gRPCサービスの実装」で何を学びますか?

grpc-goによるサーバーとクライアント ブラウザで直接実行するハンズオンコードでGo Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Go Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのGo Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「Unary gRPCサービスの実装」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このGo Academyレッスンでコードを書いて実行できますか?

はい。すべてのGo Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Protocol Buffersと.protoファイル
  2. Unary gRPCサービスの実装
  3. サーバーストリーミングとクライアントストリーミング
  4. gRPCインターセプターとメタデータ
← Go Academyに戻る