ProtoBuf简易使用

Protocol Buffers 简介

在学习gRPC时了解到了ProtoBuf,写篇博客记录一下protobuf的简单使用。

Protocol Buffers(简称 protobuf)是 Google 于 2008 年开源的一种语言无关、平台无关、可扩展的序列化结构化数据的机制。它主要用于数据存储和通信协议,特别是在 RPC(远程过程调用)系统中,如 gRPC。protobuf 的设计目标是提供一种比 XML 和 JSON 更高效、更简单的数据交换格式。

protobuf 的优势

  • 高效性:protobuf 的序列化和反序列化速度非常快,生成的二进制数据比 XML 和 JSON 更小,适合在带宽有限的环境中使用。
  • 跨语言支持:protobuf 支持多种编程语言,包括 C++、Java、Python、Go 等,使得不同语言编写的系统可以轻松地进行数据交换。
  • 可扩展性:protobuf 支持向后兼容和向前兼容的协议扩展,可以在不破坏现有代码的情况下添加新的字段。

protobuf 的使用场景

  • RPC 通信:protobuf 常用于 RPC 系统中,如 gRPC,作为数据传输的序列化机制。
  • 数据存储:protobuf 可以用于将结构化数据序列化后存储到文件或数据库中。
  • 配置文件:protobuf 可以用于定义和解析配置文件,提供比 XML 和 JSON 更高效的解析方式。

protobuf 的基本使用

定义消息格式

protobuf 使用 .proto 文件定义数据结构。以下是一个简单的 .proto 文件示例:

//协议版本
syntax = "proto3";

//结构体
message Person {
  string name = 1;
  int32 id = 2;
  string email = 3;
}

生成代码

使用 protobuf 编译器 protoc 可以将 .proto 文件编译成目标语言的代码。例如,生成 Go 代码的命令如下:

protoc --go_out=. person.proto

 --语言_out 的参数就是指定的生成路径,.表示的就是当前路径 。

序列化和反序列化

在 Go 语言中,可以使用生成的代码进行序列化和反序列化操作:

package main

import (
    "fmt"
    "log"
    "github.com/golang/protobuf/proto"
    "example.com/person" // 假设生成的代码在 example.com/person 包中
)

func main() {
    p := &person.Person{
        Name:  "John Doe",
        Id:    1234,
        Email: "johndoe@example.com",
    }

    // 序列化
    data, err := proto.Marshal(p)
    if err != nil {
        log.Fatal("marshaling error: ", err)
    }

    // 反序列化
    newP := &person.Person{}
    err = proto.Unmarshal(data, newP)
    if err != nil {
        log.Fatal("unmarshaling error: ", err)
    }

    fmt.Println("Name:", newP.GetName())
    fmt.Println("ID:", newP.GetId())
    fmt.Println("Email:", newP.GetEmail())
}

protobuf 与 gRPC

gRPC 是 Google 开发的一个高性能、开源的通用 RPC 框架,它默认使用 protobuf 作为接口定义语言(IDL)和数据序列化格式。通过 protobuf,gRPC 可以生成客户端和服务器端的代码,简化了跨语言 RPC 服务的开发。

定义 gRPC 服务

以下是一个简单的 gRPC 服务定义示例:

//协议版本
syntax = "proto3";

//gRPC服务接口
service HelloService {
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}

//请求结构体
message HelloRequest {
  string name = 1;
}

//响应结构体
message HelloReply {
  string message = 1;
}

生成 gRPC 代码

使用 protoc 生成 gRPC 代码的命令如下:

protoc --go_out=. --go-grpc_out=. helloService.proto

实现 gRPC 服务

在 Go 语言中,可以实现 gRPC 服务如下:

package main

import (
    "context"
    "log"
    "net"
    "google.golang.org/grpc"
    pb "example.com/greeter" // 假设生成的代码在 example.com/greeter 包中
)

type server struct {
    pb.UnimplementedGreeterServer
}

func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {
    return &pb.HelloReply{Message: "Hello " + in.GetName()}, nil
}

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

总结

Protocol Buffers 是一种高效、跨语言、可扩展的序列化机制,广泛应用于 RPC 通信、数据存储和配置文件等领域。特别是在 Go 语言中,protobuf 与 gRPC 的结合为开发高性能的分布式系统提供了强大的支持。通过定义 .proto 文件并生成相应的代码,开发者可以轻松地在不同语言之间进行数据交换和 RPC 调用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值