proto文件是服务端和客户端的共用的服务定义文件,

举个最简单的小例子

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
syntax = "proto3";
option go_package = "linchen2chris.github.io/grpc-server;user_service";
package user_service; // Optional package declaration

message UserIdRequest {
  int32 user_id = 1; // The ID of the user to retrieve
}

message UserResponse {
  string name = 1; // The name of the user
  int32 id = 2;    // The ID of the user
}

service GetUser {
  rpc GetUserById (UserIdRequest) returns (UserResponse);
}

要用新版 protoc 生成 pb文件

1
protoc --go_out=. --go-grpc_out=. -I proto product_info.proto

这里-I 是如何你的proto引用了别的proto才需要, 本文这个简单的小例子不需要用

这样这里会生成 2 个 pb 文件,product_info.pb.go 和 product_info_grpc.pb.go

  1. pb.go 相当于 entity, 处理的都是 req resp 数据结构

  2. _grpc.pb.go 相当于 handler, 处理的都是服务调用的

    同一个proto生成的文件会完全相同, client/server不必引用相同的生成文件, 完全可以把proto 拷过来, 自己生成自己的文件

2个pb文件怎么用呢

1 client

有了自己的pb文件之后如何接上? 3 steps

  1. conn = grpc.Dail(address, options…)
  2. client = pb.NewClient(conn)
  3. client.CallYourMethod

2 server

有了自己的pb的文件之后如何创建服务? 4 steps

  1. listener = net.listen(address)
  2. server = grpc.NewServer()
  3. pb.RegisterYourServer(server)
  4. server.Serve(listener)