gRPC本地实践

win环境下的gRPC实践

Posted by Zenkai on August 4, 2025

“Yeah It’s on. ”

gRPC实践

1. gRPC依赖安装

  1. 首先需要安装protoc 安装地址:https://github.com/protocolbuffers/protobuf/releases

​ 下载xxxwin64.zip,解压,将bin目录添加到Path环境变量

  1. 安装生成go代码的插件
1
2
3
4
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 build是编译对应依赖并生成可执行文件,位于GOPATH下的bin目录

  1. 通过以下命令将proto文件转为go文件:

    1
    2
    
    protoc --go_out=./grpc --go-grpc_out=./grpc --proto_path=./grpc/idl student_service.proto
    go mod tidy
    

2. gRPC实践

代码参考:https://github.com/ZenKaiii/gRPC_demo

利用上述命令后,代码中会生成一个my_proto文件夹,此为我们的proto message和service的定义,其中StudentServiceClient接口,需要我们自行实现。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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

监听方式如下

1
2
3
4
5
6
7
8
9
10
11
12
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)
	}
}

调用方式如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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)
}