개인 메모: GRPC
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())
}
시작 및 실행 결과
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())
}
시작 및 실행 결과
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())
}
시작 및 실행 결과
syntax = "proto3";
package myproto;
// サービスを定義
service CircleArea {
// 円の面積取得サービス
rpc CalculateCircleArea (CircleAreaReq) returns (CircleAreaRes) {
}
}
// クライアント→サーバ
message CircleAreaReq {
float round = 1;
}
// サーバ→クライアント
message CircleAreaRes {
float area = 1;
}
protoc --go_out=plugins=grpc:. circle.proto
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)
}
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
Reference
이 문제에 관하여(개인 메모: GRPC), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/gangzhun/items/6a9de682b168ba8ceb30텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)