ZBLOG

grpc搭配protobuf使用例子

下面是一个使用 gRPC 和 Protocol Buffers(protobuf)的基本示例,包括定义服务、生成代码以及实现服务器和客户端。

1. 安装必要的工具

确保你已安装以下工具:

  • Go(或其他语言,gRPC 支持多种语言)
  • Protobuf 编译器 (protoc)
  • gRPC 的相关库

对于 Go 用户,你可以通过以下命令安装 gRPC 和 protobuf 库:

  1. go get google.golang.org/grpc
  2. go get google.golang.org/protobuf

2. 定义 Proto 文件

首先,创建一个名为 example.proto 的文件,用于定义我们的服务和消息格式:

  1. syntax = "proto3";
  2. package example;
  3. // 定义请求消息
  4. message SayHelloRequest {
  5. string name = 1;
  6. }
  7. // 定义响应消息
  8. message SayHelloResponse {
  9. string message = 1;
  10. }
  11. // 定义 HelloService 服务
  12. service HelloService {
  13. rpc SayHello(SayHelloRequest) returns (SayHelloResponse);
  14. }

3. 编译 Proto 文件

使用 protoc 命令编译 proto 文件,以生成相应的代码。对于 Go,可以运行以下命令:

  1. protoc --go_out=. --go-grpc_out=. example.proto

这将生成 example.pb.goexample_grpc.pb.go 文件。

4. 实现服务器端

接下来,创建一个名为 server.go 的文件,实现 gRPC 服务器:

  1. package main
  2. import (
  3. "context"
  4. "log"
  5. "net"
  6. pb "path/to/your/generated/proto/package" // 导入生成的包
  7. "google.golang.org/grpc"
  8. )
  9. type server struct {
  10. pb.UnimplementedHelloServiceServer // 必须嵌入未实现的服务器类型,以便自动实现该方法。
  11. }
  12. func (s *server) SayHello(ctx context.Context, req *pb.SayHelloRequest) (*pb.SayHelloResponse, error) {
  13. return &pb.SayHelloResponse{
  14. Message: "Hello " + req.Name,
  15. }, nil
  16. }
  17. func main() {
  18. lis, err := net.Listen("tcp", ":50051")
  19. if err != nil {
  20. log.Fatalf("failed to listen: %v", err)
  21. }
  22. s := grpc.NewServer()
  23. pb.RegisterHelloServiceServer(s, &server{})
  24. log.Println("Server is running at :50051")
  25. if err := s.Serve(lis); err != nil {
  26. log.Fatalf("failed to serve: %v", err)
  27. }
  28. }

5. 实现客户端

然后创建一个名为 client.go 的文件来实现客户端:

  1. package main
  2. import (
  3. "context"
  4. "log"
  5. "time"
  6. pb "path/to/your/generated/proto/package" // 导入生成的包
  7. "google.golang.org/grpc"
  8. )
  9. func main() {
  10. conn, err := grpc.Dial("localhost:50051", grpc.WithInsecure())
  11. if err != nil {
  12. log.Fatalf("did not connect: %v", err)
  13. }
  14. defer conn.Close()
  15. client := pb.NewHelloServiceClient(conn)
  16. ctx, cancel := context.WithTimeout(context.Background(), time.Second)
  17. defer cancel()
  18. resp, err := client.SayHello(ctx, &pb.SayHelloRequest{Name: "World"})
  19. if err != nil {
  20. log.Fatalf("could not greet: %v", err)
  21. }
  22. log.Printf("Greeting: %s", resp.Message)
  23. }

6. 启动服务与客户端

在不同的终端中,启动服务器和客户端:

  1. 启动 gRPC 服务器:
  1. go run server.go
  1. 在另一个终端中,运行客户端:
  1. go run client.go

你应该会看到类似以下输出,从而说明调用成功了:

  1. Greeting: Hello World

这个示例展示了如何使用 gRPC 和 Protocol Buffers 创建简单的远程过程调用。在实际应用中,你可以根据需求扩展服务和消息结构。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=19677

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?