Skip to content

GRPC

gRPC Connect

bufbuild/connect-go: Simple, reliable, interoperable. A better gRPC.

テスト用にgRPCのサーバーが欲しかったので、使ってみた。

READMEに書いてあるサンプルのように作ったら、grpcurlでリフレクションのエラーになったので、次世代gRPC?『connect-go』やってみたを参考にリフレクションを入れたら動いた。

ついでにクライアントもConnectで書いてみた。

サーバーの指定をプロトコル込み(http://~/)で指定しないといけないのと、RequestとResponceにMsgを挟まないといけないので少しハマったけど、おおむね問題なさそう。

Read more

runnでgRPCのテスト2

runnのコマンドライン実行でうまく動かない件、オプション--grpc-no-tlsを指定したら解消した。

デバッグ用に詳細オプションないかなーってコマンドラインヘルプ見ていて見つけた。

マニュアルはちゃんと読みましょう(今年何度目かの反省

runnでgRPCのテスト

gRPCサーバーをテストするのに、fullstorydev/grpcurl: Like cURL, but for gRPC: Command-line tool for interacting with gRPC serversを使っていたのだけど、自動化するのに良いものはないかと探して、k1LoW/runn: runn is a package/tool for running operations following a scenario.を試してみた。

go testから使うのは何となくできたような気がするけど、runnコマンドで実行するのがうまくいかない。

go testから使うのもだいぶハマって、tls: falseを入れないとポート番号80以外で起動したときに常にTLS接続になって、応答がなくなってしまう。

Read more

proto

proto定義何もわからない。。

REST用のパスを定義するために

    option (google.api.http) = {
      get : "/example-messages/{id}"
    };

といった定義が必要で、これを使うには

import "google/api/annotations.proto";

が必要らしいという理解なのだけど、これをビルドしようとすると

event.proto:6:1: Import "google/api/annotations.proto" was not found or had errors.

というエラーが出てしまう。

こういうところで躓くの嫌すぎる。

protoをマスターにする

protoをAPIスキーマのマスターにしようとした場合、既存のOpenAPIで用意していたUIとかどうしよう、ということになるけれど、OpenAPI->gRPCとは違って逆の変換はたくさんツールがあることは調査済み。

全体の作りとしてはgrpc-gatewayでgRPCとREST両対応のサーバを作る | フューチャー技術ブログこんな感じにするのが良さそう。

ということでまずはマネするところからやっていきたい。

Read more

OpenAPIからgRPCへの移行

今あるOpenAPI用の定義yamlファイルからgRPC用のprotoファイルが生成できないかなと思い、検索したら良さそうなものが見つかった。

https://github.com/umemak/eventsite_go/blob/main/openapi.yml でやってみた。

$ go install github.com/NYTimes/openapi2proto/cmd/openapi2proto
$ openapi2proto -spec openapi.yml -annotate
syntax = "proto3";

package eventsite;

import "google/api/annotations.proto";
import "google/protobuf/empty.proto";

service EventsiteService {
    // Get all events.
    rpc GetEvents(google.protobuf.Empty) returns (google.protobuf.Empty) {
        option (google.api.http) = {
            get: "/events"
        };
    }

    // Create event.
    rpc PostEvents(google.protobuf.Empty) returns (google.protobuf.Empty) {
        option (google.api.http) = {
            post: "/events"
        };
    }
}

serviceは作られているけど、messageは作ってくれてないっぽい。

Read more

gRPCを触ってみる

gRPCを触ってみたくなったので、gRPCがフロントエンド通信の第一の選択肢になる時代がやってきたかも? | フューチャー技術ブログをやってみる。

frontendでnpm installするところでgitエラーになってしまう。

$ npm install --save-dev bufbuild/protoc-gen-connect-web bufbuild/protoc-gen-es
npm ERR! code 128
npm ERR! An unknown git error occurred
npm ERR! command git --no-replace-objects ls-remote ssh://git@github.com/bufbuild/protoc-gen-connect-web.git
npm ERR! git@github.com: Permission denied (publickey).
npm ERR! fatal: Could not read from remote repository.
npm ERR! 
npm ERR! Please make sure you have the correct access rights
npm ERR! and the repository exists.

とりあえず置いておいて先に進めるが、結局buf generateするところで出力先がないのでエラーになってしまった。

Read more