1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

個人メモ:GRPC

Last updated at Posted at 2019-10-06

protobufとrpc勉強後の、gRPCを勉強~

GRPCとは

HTTPより良いモノ

(HTTP/2を標準でサポートしたRPCフレームワーク
 HTTP/2による通信
 ProtocolBufferデフォルト対応
 ...
 )

GRPCで、protocol buffers使用

gRPCは、デフォルトでprotoBufを使っている

grpc-protocolBuffers.png

上記、
サーバは、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
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?