gRPC入門Taiga Sakaguchi1
View Slide
Sakaguchi Taiga教員→Webエンジニア歴3年バックエンドエンジニア都内メガベンチャーに勤務2
gRPCとはGoogleによって開発されたRPCフレームワーク3
RPCとはRemote Procedure Callの頭字語(遠隔手続き呼び出し)ネットワークを通じて別のコンピュータ上で動作するソフトウェアの関数を呼び出すための仕様4
一般的な関数呼び出し5
RPCにおける関数呼び出し6
RPCの何が嬉しいのかローカルの関数かリモートの関数かを意識せずにコードを書くことができる7
type Server struct {}type User struct{ID string}func (s *Server) GetUser(id string) *User {}type Client struct {}func (c *Client)DoSomething() {u := c.GetUser("userid")}8
RESTだったらtype Server struct {}func main() {r := gin.Default()r.GET("/user/:id", getUser)r.Run()}func getUser(c *gin.Context) {}type Client struct {}func (c *Client) DoSomething() {resp, err := http.Get("http://user/1")}9
https://grpc.io/docs/what-is-grpc/introduction/10
Protocol BuffersGoogleにより開発IDL(インターフェース定義言語)通信や永続化での利用を目的としたシリアライズフォーマットコードやDocsなど自動生成できる11
syntax = "proto3";service User {rpc GetUser(GetUserRequest) returns (GetUserResponse) {}}message GetUserRequest {string id = 1;}message GetUserResponse {string id = 1;string name = 2;}12
サーバー用の生成コード// ...type UserServer interface {GetUser(context.Context, *GetUserRequest) (*GetUserResponse, error)mustEmbedUnimplementedUserServer()}// ...13
クライアント用の生成コード// ...type UserClient interface {GetUser(ctx context.Context, in *GetUserRequest, opts ...grpc.CallOption) (*GetUserResponse, error)}func NewUserClient(cc grpc.ClientConnInterface) UserClient {return &userClient{cc}}// ...14
ここでクイズgRPCの「g」の意味はなんでしょうか?1. Google2. Good3. Great4. Game15
ここでクイズgRPCの「g」の意味はなんでしょうか?1. Google2. Good3. Great4. Game16
gRPCの「g」はバージョンごとに意味がかわるらしいhttps://github.com/grpc/grpc/blob/master/doc/g_stands_for.md17
gRPCのメリットHTTP/2で通信Protocol Buffersによるシリアライズストリーミング処理多くの言語に対応(Go, Java, Kotlin, Node, PHP, Python, Ruby,...)18
4つの通信方式Unary RPCServer streaming RPCClient streaming RPCBidirectional streaming PRC19
Unary RPC1 Request - 1 Response20
Server streaming RPC1 Request - N Response例)push通知など21
Client streaming RPCN Request - 1 Response例)データを分割して複数回に分けてアップロード22
Bidirectional streaming PRCWebSocketのような双方向通例)チャット23
gRPCのデメリットPRCの設計に気をつけないと破綻する実装に時間がかかるブラウザでのサポートが十分でない24
gRPCが向いているケースMicroserviceプライベートなAPIモバイル、IoT25
ブラウザ-サーバー間で導入するにはgrpc-webgrpc-gatewayconnect26
grpc-web27
grpc-gateway28
connecthttps://connect.build/29
connect30
参考https://grpc.io/https://zenn.dev/hsaki/books/golang-grpc-startinghttps://christina04.hatenablog.com/entry/2017/11/13/190000https://qiita.com/gold-kou/items/a1cc2be6045723e242eb31
32