ProtoRPC 是一种基于 Google 的 Protocol Buffers(Protobuf)技术的 RPC(远程过程调用)框架,它允许你定义服务接口和消息格式,并生成客户端和服务器端的代码。在 Go 语言中,ProtoRPC 可以通过 protoc-gen-goprotoc-gen-go-grpc 插件来实现。

以下是使用 ProtoRPC 在 Go 语言中构建 RPC 服务的基本步骤:

  1. 定义服务和消息:首先,你需要定义一个 .proto 文件,其中包含了你的服务接口和消息类型。例如:
syntax = "proto3";
package pb;

message SquareRequest {
    int num = 1;
}
message SquareResponse {
    int num = 1;
    int ans = 2;
}
service CalService {
    rpc Square (SquareRequest) returns (SquareResponse);
}
  1. 生成 Go 代码:使用 protoc 编译器和 Go 插件来生成 Go 代码。命令如下:
protoc --go_out=. --go-grpc_out=. your_proto_file.proto

这将生成两个文件:一个包含消息类型的 .pb.go 文件和一个包含服务定义的 .pb.go 文件。

  1. 实现服务:在 Go 中实现 .proto 文件中定义的服务接口。
type server struct {
    pb.UnimplementedCalServiceServer
}

func (s *server) Square(ctx context.Context, req *pb.SquareRequest) (*pb.SquareResponse, error) {
    return &pb.SquareResponse{Num: req.Num, Ans: req.Num * req.Num}, nil
}
  1. 启动服务器:创建并启动 gRPC 服务器,注册你的服务。
func main() {
    lis, err := net.Listen("tcp", ":50051")
    if err != nil {
        log.Fatalf("failed to listen: %v", err)
    }
    s := grpc.NewServer()
    pb.RegisterCalServiceServer(s, &server{})
    if err := s.Serve(lis); err != nil {
        log.Fatalf("failed to serve: %v", err)
    }
}
  1. 创建客户端:在客户端,使用生成的客户端代码来创建 RPC 调用。
conn, err := grpc.Dial(address, grpc.WithInsecure())
if err != nil {
    log.Fatalf("did not connect: %v", err)
}
defer conn.Close()
c := pb.NewCalServiceClient(conn)
response, err := c.Square(context.Background(), &pb.SquareRequest{Num: 5})
if err != nil {
    log.Fatalf("could not square number: %v", err)
}
fmt.Println("Square of 5: ", response.Ans)

这样,你就使用 ProtoRPC 在 Go 语言中创建了一个简单的 RPC 服务。你可以根据自己的需求来扩展服务和消息类型。