gRPC
https://grpc.io/favicons/apple-touch-icon.png
Google が開発した 高性能なRPC (リモートプロシージャコール) フレームワーク。 ロードバランシングやトレース、ヘルスチェックの他認証機構のプラグインのサポートが有る。デバイスやモバイルの他ブラウザをバックエンドサービスに接続できる。
gRPCを使うと何が嬉しいのか
.proto によるスキームファーストな設計を強制され、Protocol Buffer のメリットを得られる
仕様がまず確定することによるドキュメントの自動生成対応
RPC なので REST のように URL設計に悩みにくいかもしれない
HTTP/2 が強制されることで、高速な通信ができる
gRPC の課題点
フロントエンドとバックエンド (BFF) との通信に使うにはハードルが高い
しかしながらそれでもフロントエンドからの通信に使うことは RESTに比較して難しいし、コストを掛けて得られるメリットが少ない
ゲームのAPIサーバなど速度が求められるようなシーンなど、内部ネットワークのバックエンドのサービス間の通信にはバッチリ用途が噛み合うと思われる
gRPC の開発方法の例
開発する際にはまず インターフェース定義言語 (IDL) を使用する。具体的には .proto という拡張子のファイルを作成し、APIの期待する入力形式、出力形式を定義する。 https://www.grpc.io/img/landing-2.svg
例として下記のような .proto を公式から拝借してくる。
code:sample.proto
syntax = "proto3";
service Greeter {
rpc SayHello (HelloRequest) returns (HelloReply) {}
}
message HelloRequest {
string name = 1;
}
message HelloReply {
string message = 1;
}
macの場合は事前に brew で protobuf と protobuf-gen-go をインストールしておく。
実行するコマンドは以下。
code:bash
protoc sample.proto --go_out=.
すると以下のようにデータ構造や、Setter/Getter などの関数が .proto の定義に応じて生成される。
code:sample.proto.go
package sample
// 中略
type HelloRequest struct {
Name string protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"
XXX_NoUnkeyedLiteral struct{} json:"-"
XXX_unrecognized []byte json:"-"
XXX_sizecache int32 json:"-"
}
func (m *HelloRequest) Reset() { *m = HelloRequest{} }
func (m *HelloRequest) String() string { return proto.CompactTextString(m) }
func (*HelloRequest) ProtoMessage() {}
func (*HelloRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_2141552de9bf11d0, []int{0}
}
// 以下省略
参考
関連