“Yeah It’s on. ”
gRPC实践
1. gRPC依赖安装
- 首先需要安装protoc 安装地址:https://github.com/protocolbuffers/protobuf/releases
下载xxxwin64.zip,解压,将bin目录添加到Path环境变量
- 安装生成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目录
-
通过以下命令将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)
}