protobufとrpc勉強後の、gRPCを勉強~
GRPCとは
HTTPより良いモノ
(HTTP/2を標準でサポートしたRPCフレームワーク
HTTP/2による通信
ProtocolBufferデフォルト対応
...
)
GRPCで、protocol buffers使用
gRPCは、デフォルトでprotoBufを使っている
上記、
サーバは、c++
クライアントは、Rubyとかjavaなどの、で構築
これを、Protoで通信することで、cross platform、実現。
gRPCのインストール
go get -u google.golang.org/grpc
rpcでの例をgrpcで作ってみる
RPC例:円の半径を計算する関数を、別の端末での呼び出しを想定
フォルダ構成
grpc_CircleArea
|-- 0_myproto
| -- circle.proto
| -- circle.pb.go
|-- 1_server
| -- main.go
|-- 2_client
| -- main.go
proto作成:0_myproto/circle.proto
syntax = "proto3";
package myproto;
// サービスを定義
service CircleArea {
// 円の面積取得サービス
rpc CalculateCircleArea (CircleAreaReq) returns (CircleAreaRes) {
}
}
// クライアント→サーバ
message CircleAreaReq {
float round = 1;
}
// サーバ→クライアント
message CircleAreaRes {
float area = 1;
}
コンパイルし、circle.pb.goを作成
protoc --go_out=plugins=grpc:. circle.proto
ちなみに、前で学んだrpc用のコンパイルは、サービスなど作成しない
protoc --go_out=./ circle.proto
サーバ側:1_server/main.go
package main
import (
"grpc_CircleArea/0_myproto"
"context"
"google.golang.org/grpc"
"math"
"net"
)
type CalculateCircleArea struct{}
// 円面積計算method
func (c *CalculateCircleArea) CalculateCircleArea(ctx context.Context, in *myproto.CircleAreaReq) (out *myproto.CircleAreaRes, err error) {
area := in.Round * in.Round * math.Pi
return &myproto.CircleAreaRes{Area: area}, nil
}
func main() {
// 1 grpcサービス作成
srv := grpc.NewServer()
// 2 円面積計算サービス登録
myproto.RegisterCircleAreaServer(srv, &CalculateCircleArea{})
// 3 サービスを、ポート8001で監視(err判断省略)
litsen, _ := net.Listen("tcp", ":8001")
srv.Serve(litsen)
}
クライアント側:2_client/main.go
package main
import (
"grpc_CircleArea/0_myproto"
"context"
"fmt"
"google.golang.org/grpc"
)
func main() {
// 1 クライアントが接続先サーバ定義(err判断省略)
conn, _ := grpc.Dial("127.0.0.1:8001", grpc.WithInsecure())
defer conn.Close()
// 2 grpcクライアント定義
client := myproto.NewCircleAreaClient(conn)
// 3 半径の値を入力
var round float32
fmt.Printf("円の半径入力 --> ")
fmt.Scanln(&round)
res, _ := client.CalculateCircleArea(context.Background(), &myproto.CircleAreaReq{Round: round})
fmt.Println("円の面積:", res.GetArea())
}
起動&実行結果
- サーバ起動:
1_server>go run main.go
- クライアント起動:
2_client>go run main.go
円の半径入力 --> 3
円の面積: 28.274334