返回文章

gRPC 本地实践

在 Windows 上配置并实现 Go 服务

gRPC 依赖安装

  1. Protocol Buffers Releases 下载 Windows 64 位压缩包。解压后,将 bin 目录加入 Path 环境变量。

  2. 安装用于生成 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 中生成可执行文件。

  1. 通过以下命令将 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)
}