Đã đăng vào thg 6 15, 7:32 SA 4 phút đọc
gRPC
Chúng ta có thể tìm hiểu về gRPC và Golang ở những topic trước của mình hoặc bàng các từ khóa trên mạng[gRPC thì nên search trên mạng để có góc nhìn sâu hơn nhe, mình ko chuyên gRPC cho lắm].
Tiếp theo là các package của Go dành cho grpc và protocol.
go get -u github.com/golang/protobuf/protoc-gen-go
go get -u google.golang.org/grpc
Được rồi giờ vào setup code nào. Ở đây mình sẽ setup 1 chương trình chạy các tính toán đơn giản nhé:
Các bạn tạo cho mình file .proto với đường dẫn như sau
calculator/calculatorpb/calculator.proto
Sau đó trong file .proto ta có:
protoc calculator/calculatorpb/calculator.proto --go-grpc_out=.
protoc calculator/calculatorpb/calculator.proto --go_out=.
Sau đó ta sẽ thấy một thư mục mới với 2 file là calculator_grpc.pb.go và calculator.pb.go
Và Client với đường dẫn là client/client.go:
func callMax[c calculatorpb.CalculatorServiceClient] {
log.Println["callMax is running"]
stream, err := c.Max[context.Background[]]
if err != nil {
log.Fatalf["call max err %v", err]
}
waitc := make[chan struct{}]
go func[] {
////send requests
listReq := []calculatorpb.MaxRequest{
{
Num: 5,
},
{
Num: 10,
},
{
Num: 15,
},
{
Num: 20,
},
{
Num: 50,
},
}
for _, req := range listReq {
err := stream.Send[&req]
if err != nil {
log.Fatalf["sned find max request err %v", err]
}
time.Sleep[1000 * time.Millisecond]
}
stream.CloseSend[]
}[]
go func[] {
for {
resp, err := stream.Recv[]
if err == io.EOF {
log.Println["ending find max api..."]
break
}
if err != nil {
log.Fatalf["recv find max err %v", err]
break
}
log.Printf["max: %v\n", resp.GetMax[]]
}
close[waitc]
}[]