개인 메모: GRPC

8840 단어 5protobufgRPC

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
    

    좋은 웹페이지 즐겨찾기