gRPC 本地实践
在 Windows 上配置并实现 Go 服务
gRPC 依赖安装
-
从 Protocol Buffers Releases 下载 Windows 64 位压缩包。解压后,将
bin目录加入Path环境变量。 -
安装用于生成 Go 代码的插件:
go get github.com/golang/protobuf/protoc-gen-go
go install github.com/golang/protobuf/protoc-gen-go@latest
go get google.golang.org/grpc/cmd/protoc-gen-go-grpc
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc
go get 会将依赖安装到 GOPATH 下的 pkg 目录,go install 会编译并在 GOPATH/bin 中生成可执行文件。
- 通过以下命令将 proto 文件转换为 Go 文件:
protoc --go_out=./grpc --go-grpc_out=./grpc --proto_path=./grpc/idl student_service.proto
go mod tidy
gRPC 实践
完整代码见 gRPC_demo。
执行上述命令后,代码中会生成 my_proto 文件夹,其中包含 proto message 和 service 的定义。服务端实现如下:
type StudentServer struct {
student_service.UnimplementedStudentServiceServer
}
func (StudentServer) GetStuInfo(ctx context.Context, in *student_service.Request) (*student_service.Student, error) {
defer func() {
err := recover()
if err != nil {
fmt.Printf("%v", err)
}
}()
if len(in.StudentId) == 0 {
return nil, errors.New("id is null")
}
return &student_service.Student{
Name: "zhangsan",
Age: 28,
Height: 1.75,
}, nil
}
StudentServer 需要嵌入 student_service.UnimplementedStudentServiceServer。
监听方式如下:
func main() {
lis, err := net.Listen("tcp", "127.0.0.1:1234")
if err != nil {
panic(err)
}
server := grpc.NewServer()
student_service.RegisterStudentServiceServer(server, &StudentServer{})
err = server.Serve(lis)
if err != nil {
panic(err)
}
}
调用方式如下:
func TestGrpc(t *testing.T) {
conn, err := grpc.NewClient(
"127.0.0.1:1234",
grpc.WithTransportCredentials(insecure.NewCredentials()),
)
if err != nil {
t.Fatal(err)
}
client := student_service.NewStudentServiceClient(conn)
info, err := client.GetStuInfo(context.Background(), &student_service.Request{StudentId: "1"})
if err != nil {
t.Fatal(err)
}
fmt.Println(info)
}