golang protobuf grpc

发布时间:2024-12-23 03:23:41

Protobuf是Google提供的一种数据交换格式,它能够将结构化数据序列化为二进制格式,支持语言无关、平台无关,并且能够自动生成代码,提供更高效的数据传输与存储。而gRPC是基于Protobuf的一种高性能远程过程调用(RPC)框架,能够实现跨语言的服务端和客户端通信。本文将介绍如何使用golang进行Protobuf和gRPC的开发。

安装和配置

首先,我们需要在本地安装golang和相应的protobuf编译器protoc。

安装golang:

$ wget https://golang.org/dl/go1.17.linux-amd64.tar.gz $ sudo tar -C /usr/local -xzf go1.17.linux-amd64.tar.gz $ export PATH=$PATH:/usr/local/go/bin

安装protoc:

$ wget https://github.com/protocolbuffers/protobuf/releases/download/v3.17.3/protobuf-all-3.17.3.tar.gz $ tar -zxvf protobuf-all-3.17.3.tar.gz $ cd protobuf-3.17.3 $ ./configure $ make $ sudo make install $ export PATH=$PATH:/usr/local/protobuf/bin

安装完成后,我们还需要安装golang的protobuf插件:

$ go get github.com/golang/protobuf/protoc-gen-go

定义Protobuf消息

在开始开发之前,我们需要先定义消息的结构。

新建一个.proto文件,例如"message.proto",并编辑如下内容:

syntax = "proto3"; package example; message User { string id = 1; string name = 2; }

上述代码定义了一个名为User的消息,包含了id和name两个字段,类型为字符串。

生成golang代码

接下来,我们使用protoc编译器生成golang的消息代码。

运行以下命令:

$ protoc --go_out=. message.proto

执行以上命令后,将在当前目录下生成一个名为"message.pb.go"的文件,该文件包含了自动生成的golang消息代码。

创建gRPC服务

现在,我们可以开始编写golang的gRPC服务。

首先,导入必要的包:

import ( "context" "log" "net" "github.com/golang/protobuf/proto" "github.com/golang/protobuf/ptypes/empty" "google.golang.org/grpc" )

然后,定义一个结构体来实现gRPC服务接口:

type server struct { users []*example.User }

接着,实现gRPC服务接口的方法:

func (s *server) GetUser(ctx context.Context, id *example.GetUserID) (*example.User, error) { for _, user := range s.users { if user.Id == id.Id { return user, nil } } return nil, grpc.Errorf(codes.NotFound, "User not found") } func (s *server) AddUser(ctx context.Context, user *example.User) (*example.User, error) { s.users = append(s.users, user) return user, nil } func (s *server) DeleteUser(ctx context.Context, id *example.GetUserID) (*empty.Empty, error) { for i, user := range s.users { if user.Id == id.Id { s.users = append(s.users[:i], s.users[i+1:]...) break } } return &empty.Empty{}, nil }

最后,创建并启动gRPC服务器:

func main() { lis, err := net.Listen("tcp", ":50051") if err != nil { log.Fatalf("failed to listen: %v", err) } s := grpc.NewServer() example.RegisterUserServiceServer(s, &server{}) log.Println("gRPC server started") if err := s.Serve(lis); err != nil { log.Fatalf("failed to serve: %v", err) } }

至此,我们已经完成了一个基本的golang gRPC服务的开发。你可以根据需要对其进行扩展,增加更多的方法和功能。

相关推荐