gRPC là gì ?
gRPC (gRPC Remote Procedure Calls) là một RPC Framework mã nguồn mở, hiệu suất cao được phát triển ban đầu bởi Google. Như tên gọi , nó giúp chúng ta thực hiện những lời gọi hàm từ xa . Nghĩa là từ service này gọi đến function được thiết lập ở service khác. Hệt như cách chúng ta gọi để thực thi các hàm trong các package khác nhau trong cùng 1 bộ source code
Có 4 loại RPC , gồm:
- Unary RPC
- Server streaming RPC
- Client streaming RPC
- Bidirectional streaming RPC
Đầu tiên, cần thực hiện một vài setting source để mô phòng từng loại trên

Tiến hành cài đặt các package cần thiết
// Cài đặt protocol buffer compiler
// Tùy thuộc vào OS đang sử dụng , cài đặt complier tương ứng tại https://github.com/protocolbuffers/protobuf/releases
go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.28
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.2
go get google.golang.org/grpc
go get google.golang.org/protobuf
go get google.golang.org/genprotoCốt lõi của gRPC chính là proto file , nơi chúng ta định nghĩa interface các function dùng để gọi-trả về dữ liệu giữa các service
Tạo file có tên greet.proto tại thư mục proto có nội dung như bên dưới
syntax="proto3";
option go_package="./proto";
package greet_service;
//protoc --go_out=. --go-grpc_out=. proto/greet.proto
service GreetService {
rpc SayHelloUnary(HelloRequest) returns (HelloResponse);
rpc SayHelloServerStreaming(HelloRequest) returns (stream HelloResponse);
rpc SayHelloClientStreaming(stream HelloRequest) returns (HelloResponse);
rpc SayHelloClientBidirectionalStreaming(stream HelloRequest) returns (stream HelloResponse);
}
message HelloRequest {
string Msg = 1;
}
message HelloResponse {
string Msg = 1;
}Trong đó:
syntax="proto3";Câu lệnh này chỉ định phiên bản cú pháp của Protocol Buffers sẽ sử dụng. Protocol Buffers có hai phiên bản cú pháp: proto2 và proto3. Cú pháp proto3 là phiên bản mới nhất và cung cấp một số cải tiến so với proto2option go_package="./proto";Câu lệnh này đặt một tùy chọn cho Code Go được tạo. Nó chỉ định tên Package Go và tùy chọn import path cho code được tạo. Điều này giúp đảm bảo rằng Code Go được tạo có thể được import chính xác. ./protochỉ định đường dẫn thư mục tương đối nơi code Go được tạo sẽ tồn tại.package greet_service;Câu lệnh này xác định tên package cho các protobuf message và service trong tệp .proto này. Tên này được sử dụng để ngăn xung đột đặt tên giữa các tệp .proto khác nhau. Khi code được tạo, tên gói sẽ giúp tổ chức các lớp và interface được tạo. Các file proto trong cùng 1 dự án cần đặt cùng tên package bởi vì code được sinh ra bởi các file proto sẽ định nghĩa các service , message bằng cấu trúc ví dụ"/greet_service.ConsumerService/VerifyUser"
Sau đó, chạy câu lệnh bên dưới để sinh ra 2 file greet.pb.go và greet_grpc.pb.go. Để chạy câu lệnh protoc cần cài đặt các package tại link sau (https://grpc.io/docs/languages/go/quickstart/)
protoc --go_out=. --go-grpc_out=. proto/greet.protoTạo 1 file main.go trong thư mục server , nơi sẽ run 1 server implement các function được định nghĩa trong file proto trước đó . Từ đó , các service khác có thể gọi đến nó.
package main
import (
"fmt"
"google.golang.org/grpc"
pb "greet/proto"
"log"
"net"
)
const port = "8080"
type Server struct {
pb.GreetServiceServer
}
func main() {
lis, err := net.Listen("tcp", fmt.Sprintf(":%s", port))
if err != nil {
log.Fatalf("Listen port fail %v", err)
}
grpcServer := grpc.NewServer()
pb.RegisterGreetServiceServer(grpcServer, &Server{})
if err := grpcServer.Serve(lis); err != nil {
log.Fatalf("start server fail %v", err)
}
}Trong đoạn code trên , để start 1 grpc server , chúng ta cần 3 yếu tố
- 1 struct implement interface GreetServiceServer (Là interface bao gồm các function được define trước đó trong file proto) tại file greet_grpc.pb.go
- 1 new instance của grpc Server được tạo bởi
grpc.NewServer() - 1 Listener lắng nghe các thông tin đến port
Tiếp theo đăng kí 2 yếu tố trên
pb.RegisterGreetServiceServer(grpcServer , &Server{})Và cuối cùng , start grpc server tại port 8080
grpcServer.Serve(lis)Từ bài sau , chúng ta đi vào mô phỏng từng loại gRPC và xem xét cách từng loại hoạt động