首页 > 其他分享 >GRPC: 理解Protocol Buffers和gRPC的基本概念和使用方法

GRPC: 理解Protocol Buffers和gRPC的基本概念和使用方法

时间:2024-07-28 20:24:11浏览次数:13  
标签:Protocol err proto GRPC gRPC 序列化 Buffers

什么是Protocol Buffers?

Protocol Buffers(简称protobuf)是由Google开发的一种灵活、高效的结构化数据序列化方法。它类似于XML或JSON,但具备更小、更快、更简单的特点。protobuf主要用于定义数据的结构,然后生成用于解析和序列化数据的代码。这些代码可以用于各种编程语言,如Java、C++、Python、Go等。
在这里插入图片描述

Protocol Buffers的工作原理
  1. 定义消息结构:首先需要编写一个.proto文件来定义消息的结构。在这个文件中,定义了消息的类型和每个字段的类型。
  2. 编译.proto文件:使用protobuf编译器(protoc)将.proto文件编译成目标语言的代码,这些代码可以用于序列化和反序列化数据。
  3. 序列化和反序列化数据:使用生成的代码,可以轻松地将数据序列化为二进制格式(或其他格式),并且可以将二进制数据反序列化为原始的结构化数据。

以下是一个简单的示例.proto文件:

syntax = "proto3";

message Person {
  string name = 1;
  int32 id = 2;
  string email = 3;
}

这个示例定义了一个Person消息,其中包含三个字段:nameidemail。每个字段都有一个唯一的编号,这些编号在序列化和反序列化过程中起到了关键作用。

gRPC中的Protocol Buffers 3

gRPC是一个高性能、开源的远程过程调用(RPC)框架,它使用HTTP/2协议进行传输,并默认使用Protocol Buffers作为接口定义语言(IDL)和消息格式。

gRPC和Protocol Buffers的结合
  1. 定义服务:在.proto文件中,不仅可以定义消息类型,还可以定义服务和方法。例如:
syntax = "proto3";

service Greeter {
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}

message HelloRequest {
  string name = 1;
}

message HelloReply {
  string message = 1;
}
  1. 生成代码:使用protoc编译器,结合gRPC插件,可以生成服务接口和消息的代码。例如,对于Go语言,可以使用以下命令生成代码:
protoc --go_out=plugins=grpc:. helloworld.proto
  1. 实现服务:在生成的服务接口基础上,开发者可以实现具体的业务逻辑。例如,在Go中:
type server struct{}

func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {
  return &pb.HelloReply{Message: "Hello " + in.Name}, nil
}
  1. 启动gRPC服务器:最后,启动gRPC服务器,注册服务,并监听端口。例如:
func main() {
  lis, err := net.Listen("tcp", ":50051")
  if err != nil {
    log.Fatalf("failed to listen: %v", err)
  }
  s := grpc.NewServer()
  pb.RegisterGreeterServer(s, &server{})
  if err := s.Serve(lis); err != nil {
    log.Fatalf("failed to serve: %v", err)
  }
}

Protocol Buffers 3的优势

  1. 高效:protobuf使用紧凑的二进制格式,序列化和反序列化速度快,占用带宽小。
  2. 灵活:支持多种语言,易于扩展,向后兼容。
  3. 强类型:定义明确的消息结构,减少数据传输中的错误。

Protocol Buffers和JSON的比较

特性Protocol BuffersJSON
数据格式二进制文本
序列化速度较慢
数据大小较大
可读性不可读可读
Schema定义必须可选
类型安全

结论

Protocol Buffers和gRPC的结合提供了一种高效、强类型的远程过程调用方式。通过定义明确的接口和消息结构,开发者可以构建跨语言、跨平台的分布式系统,提升开发效率和系统性能。

标签:Protocol,err,proto,GRPC,gRPC,序列化,Buffers
From: https://blog.csdn.net/qq_14829643/article/details/139709581

相关文章

  • 1251 - Client does not support authentication protocol requested by server; cons
    错误记录:1251-Clientdoesnotsupportauthenticationprotocolrequestedbyserver;considerupgradingMySQLclient错误原因:mysql8之前的版本中加密规则是mysql_native_password,而在mysql8之后,加密规则是caching_sha2_password。解决方案:解决:①升级navicat驱动;②......
  • BGP(Border Gateway Protocol,边界网关协议)劫持是指恶意或非法地篡改BGP路由信息的行为
    BGP(BorderGatewayProtocol,边界网关协议)劫持是指恶意或非法地篡改BGP路由信息的行为。BGP是互联网上用来交换路由信息的主要协议之一,它负责决定网络数据包应该如何从一个网络路由到另一个网络。BGP劫持可以分为两种主要类型:前缀劫持(PrefixHijacking):在前缀劫持中,攻击者发送......
  • 【mitmproxy】使用mitmproxy录制grpc流量
    一、官网https://www.mitmproxy.org/ 二、文档https://docs.mitmproxy.org/stable/ 三、安装1、二进制 2、使用pip安装pipinstallmitmproxy三、启动服务端 四、测试1、使用代理发送客户端请求$http_proxy=http://127.0.0.1:8080pythonasync_greeter......
  • 【Locust】实现grpc接口性能测试
    一、locusthttps://www.locust.io/ 二、准备测试服务1、下载测试服务https://github.com/grpc/grpc.git2、使用编辑器或者IDE打开 3、proto文件位置 4、创建测试代码安装相关库pipinstalllocustgrpciogrpcio-toolspython-mgrpc_tools.protoc-I=/path......
  • .net6 grpc使用
    .NETCore(.NET6)中gRPC使用 目录一、简介二、创建gRPC服务端1.创建gRPC项目2.编写自己的服务三、创建gRPC客户端1.创建客户端项目2.grPC服务https的调用3.gRPC内网http调用4.IOC注入的方式调用gRPC四、webapi中加入gRPC 回到顶部一、简介简单解析......
  • 基于注解注册连接的Thrift框架(03)——TProtocol
    前情提要之前介绍了TProcessor的同步和异步实现,也说明了TAsyncMethodCall中的状态循环以及它是如何和TServer进行交互的。TProtocolTProtocol是一个抽象类,主要做了两件事情:绑定一个TTransport定义一系列读写消息的编解码接口。包括两类,一类是复杂数据结构比如readMessageBe......
  • Spring Boot集成grpc快速入门demo
    1.什么是GRPC?gRPC 是一个高性能、开源、通用的RPC框架,由Google推出,基于HTTP2协议标准设计开发,默认采用ProtocolBuffers数据序列化协议,支持多种开发语言。gRPC提供了一种简单的方法来精确的定义服务,并且为客户端和服务端自动生成可靠的功能库。在gRPC客户端可以直接调用不同......
  • gRPC 高级——Validator 验证器
    gRPC验证器(Validator)是一种用于在gRPC通信过程中进行数据验证的工具,通过在.proto文件中定义验证规则(例如长度限制、格式检查等),确保客户端和服务器之间传递的数据符合预期的格式和约束条件。它使用ProtocolBuffers作为序列化机制,并通过生成的代码在传输过程中自动执......
  • gRPC高级——Metadata机制
    什么是MetadatagRPC让我们可以像本地调用一样实现远程调用,对于每一次的RPC调用中都可能会有一些有用的数据,而这些数据就可以通过metadata来传递。metadata是以key-value的形式存储数据的,其中key是string类型,而value是[]string,即一个字符串数组类型。metadata使得client和s......
  • gRPC 高级——Interceptor 拦截器
    gRPC拦截器是一种用于在RPC方法调用的生命周期中拦截和处理请求和响应的机制。拦截器允许开发者在请求到达实际服务方法之前或在响应返回客户端之前执行自定义逻辑。它们类似于中间件,广泛应用于日志记录、身份验证、请求修改等场景。拦截器的种类客户端拦截器(ClientInter......