ProtoBuf 与 gRPC 你需要知道的知识

gRPC(二)入门:Protobuf入门 通过protubuf文档先了解一下protobuf语法。点击跳转Protocol Buffers ( Protobuf ) 是一种免费的开源 跨平台数据格式,用于序列化结构化数据。它是谷歌公司开发的一种数据描述语言,并于2008年开源。Protobuf刚开源时的定位类似于XML、JSON等数据描述语言,通过附带工具生成代码并实现将结构化数据序列化的功能。Protocol Buffers 是一种语言、平台无关,可扩展的序列化结构化数据的方法,常用于通信协议,数据存储等等。 阅读详情

ProtoBuf 是一套接口描述语言(IDL)和相关工具集(主要是 protoc,基于 C++ 实现),类似 Apache 的 Thrift)。用户写好 .proto 描述文件,之后使用 protoc 可以很容易编译成众多计算机语言(C++、Java、Python、C#、Golang 等)的接口代码。这些代码可以支持 gRPC,也可以不支持。

gRPC 是 Google 开源的 RPC 框架和库,已支持主流计算机语言。底层通信采用 gRPC 协议,比较适合互联网场景。gRPC 在设计上考虑了跟 ProtoBuf 的配合使用。

两者分别解决的不同问题,可以配合使用,也可以分开。

典型的配合使用场景是,写好 .proto 描述文件定义 RPC 的接口,然后用 protoc(带 gRPC 插件)基于 .proto 模板自动生成客户端和服务端的接口代码。

ProtoBuf

需要工具主要包括:

  • 编译器:protoc,以及一些官方没有带的语言插件;
  • 运行环境:各种语言的 protobuf 库,不同语言有不同的安装来源;

语法类似 C++ 语言,可以参考 语言规范

比较核心的,message 是代表数据结构(里面可以包括不同类型的成员变量,包括字符串、数字、数组、字典……),service代表 RPC 接口。变量后面的数字是代表进行二进制编码时候的提示信息,1~15 表示热变量,会用较少的字节来编码。另外,支持导入。

默认所有变量都是可选的(optional),repeated 则表示数组。主要 service rpc 接口只能接受单个 message 参数,返回单个 message;

syntax = "proto3";
package hello;

message HelloRequest {
  string greeting = 1;
}

message HelloResponse {
  string reply = 1;
  repeated int32 number=4;
}

service HelloService {
  rpc SayHello(HelloRequest) returns (HelloResponse){}
}

编译最关键参数是指定输出语言格式,例如,python 为 --python_out=OUT_DIR

一些还没有官方支持的语言,可以通过安装 protoc 对应的 plugin 来支持。例如,对于 go 语言,可以安装

$ go get -u github.com/golang/protobuf/{protoc-gen-go,proto} // 前者是 plugin;后者是 go 的依赖库

之后,正常使用 protoc --go_out=./ hello.proto 来生成 hello.pb.go,会自动调用 protoc-gen-go 插件。

ProtoBuf 提供了 Marshal/Unmarshal 方法来将数据结构进行序列化操作。所生成的二进制文件在存储效率上比 XML 高 3~10 倍,并且处理性能高 1~2 个数量级。

gRPC

工具主要包括:

  • 运行时库:各种不同语言有不同的 安装方法,主流语言的包管理器都已支持。
  • protoc,以及 grpc 插件和其它插件:采用 ProtoBuf 作为 IDL 时,对 .proto 文件进行编译处理。

官方文档 写的挺全面了。

类似其它 RPC 框架,gRPC 的库在服务端提供一个 gRPC Server,客户端的库是 gRPC Stub。典型的场景是客户端发送请求,同步或异步调用服务端的接口。客户端和服务端之间的通信协议是基于 HTTP2 的 gRPC 协议,支持双工的流式保序消息,性能比较好,同时也很轻。

采用 ProtoBuf 作为 IDL,则需要定义 service 类型。生成客户端和服务端代码。用户自行实现服务端代码中的调用接口,并且利用客户端代码来发起请求到服务端。一个完整的例子可以参考 这里

以上面 proto 文件为例,需要执行时添加 grpc 的 plugin:

$ protoc --go_out=plugins=grpc:. hello.proto

生成服务端代码

服务端相关代码如下,主要定义了 HelloServiceServer 接口,用户可以自行编写实现代码。

type HelloServiceServer interface {
        SayHello(context.Context, *HelloRequest) (*HelloResponse, error)
}

func RegisterHelloServiceServer(s *grpc.Server, srv HelloServiceServer) {
        s.RegisterService(&_HelloService_serviceDesc, srv)
}

用户需要自行实现服务端接口,代码如下。

比较重要的,创建并启动一个 gRPC 服务的过程:

  • 创建监听套接字:lis, err := net.Listen("tcp", port)
  • 创建服务端:grpc.NewServer()
  • 注册服务:pb.RegisterHelloServiceServer()
  • 启动服务端:s.Serve(lis)
type server struct{}

// 这里实现服务端接口中的方法。
func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {
    return &pb.HelloReply{Message: "Hello " + in.Name}, nil
}

// 创建并启动一个 gRPC 服务的过程:创建监听套接字、创建服务端、注册服务、启动服务端。
func main() {
    lis, err := net.Listen("tcp", port)
    if err != nil {
        log.Fatalf("failed to listen: %v", err)
    }
    s := grpc.NewServer()
    pb.RegisterHelloServiceServer(s, &server{})
    s.Serve(lis)
}

编译并启动服务端。

生成客户端代码

生成的 go 文件中客户端相关代码如下,主要和实现了 HelloServiceClient 接口。用户可以通过 gRPC 来直接调用这个接口。

type HelloServiceClient interface {
        SayHello(ctx context.Context, in *HelloRequest, opts ...grpc.CallOption) (*HelloResponse, error)
}

type helloServiceClient struct {
        cc *grpc.ClientConn
}

func NewHelloServiceClient(cc *grpc.ClientConn) HelloServiceClient {
        return &helloServiceClient{cc}
}

func (c *helloServiceClient) SayHello(ctx context.Context, in *HelloRequest, opts ...grpc.CallOption) (*HelloResponse, error) {
        out := new(HelloResponse)
        err := grpc.Invoke(ctx, "/hello.HelloService/SayHello", in, out, c.cc, opts...)
        if err != nil {
                return nil, err
        }
        return out, nil
}

用户直接调用接口方法:创建连接、创建客户端、调用接口。

func main() {
    // Set up a connection to the server.
    conn, err := grpc.Dial(address, grpc.WithInsecure())
    if err != nil {
        log.Fatalf("did not connect: %v", err)
    }
    defer conn.Close()
    c := pb.NewHelloServiceClient(conn)

    // Contact the server and print out its response.
    name := defaultName
    if len(os.Args) > 1 {
        name = os.Args[1]
    }
    r, err := c.SayHello(context.Background(), &pb.HelloRequest{Name: name})
    if err != nil {
        log.Fatalf("could not greet: %v", err)
    }
    log.Printf("Greeting: %s", r.Message)
}

编译并启动客户端,查看到服务端返回的消息。

转载请注明:http://blog.csdn.net/yeasy/article/details/52190007

gRPC】:快速上手gRPCprotobuf 快速上手gRPCprotobuf简单demo实例 阅读详情

相关推荐

Golang——gRPCProtoBuf介绍

微服务架构中,由于每个服务对应的代码库是独立运行的,无法直接调用,彼此之间的通信就是一个大问题。gRPC可以实现微服务,将大的项目拆分为多个小且独立的业务模块,也就是服务,各个服务将使用高效的protobuf协议进行RPC调用,gRPC默认使用protocol buffers,这个是google开源的一套成熟的结构数据序列化机制,当然也可以使用其它数据结构如JSON。可以用proto files创建gRPC服务,用message类型来定义方法参数和返回类型。

weixin_57023347的博客 2357

3、grpcprotobuf入门

打开命令行 cmd下执行命令生成go文件: main.go测试:注意proto生成的时候helloworld.pb.go包名是 main.go grpc生成:这个之前的非grpc的相似,但是生成的命令需要修改为(这个就是为什么在grpc环境搭建中我们需要下载修改protoc-gen-go-grpc.exe这个文件) 四、go的grpc快速体验 helloworld.proto: 生成命令 注意最新版本的grpc将pb.go拆分成2份文件,分别是proto -> hello

qq23001186的博客 3552

gRPC+Protobuf专题研究

gRPC官网在Protobuf官网上,是这样介绍Protobuf的:简单来说,Protobuf是用于序列化结构化数据的中立语言,它可扩展,比起XML来说更小、更快、更简单。

weixin_45730969的博客 1240

gRPCgrpcprotobuf快速入门 - 基于「Python」「Golang」

gRPC是一个高性能、开源和通用的RPC框架,面向移动和HTTP/2设计。目前提供C、Java和Go语言版本,分别是: grpc, grpc-java, grpc-go.其中C版本支持C,C++,Node.js,Python, Ruby, Objective-C,PHP和C#支持.

Jzin的博客 2492

关于ProtoBuf gRPC,你需要知道知识

来源品略网:http://www.pinlue.com/article/2020/03/0415/599980108317.html ProtoBuf是一套接口描述语言(IDL)和相关工具集(主要是protoc,基于 C++ 实现),类似 Apache 的Thrift)。用户写好 .proto 描述文件,之后使用 protoc 可以很容易编译成众多计算机语言(C++、Java、Pyt...

yihuliunian的博客 1080

RPC gRPC ProtoBuf之间的关系

文章目录RPCProtoBufmessage定义message扩展Services定义protoc(Protocol Compiler)gRPC编译gRPC(mac)编译examples/cpp/helloworld代码理解(examples/cpp/helloworld)proto文件(helloworld.proto)helloworld.grpc.pb.h(cc)文件同步RPC例子greeter_client.cc和greeter_server.cc异步RPC例子greeter_async_clien

123456789 3897

Wireshark ProtobufgRPC 内置解析器使用介绍

Wireshark从2.6.0版本开始支持解析ProtobufgRPC协议,但到3.3.0/3.4.0版本相关功能才比较完备,目前已支持根据.proto文件里的定义解析Protobuf消息等功能。本文以几个示例说明Wireshark ProtobufgRPC内置解析器的使用方法。

雕虫小技 8182

【C++版本】protobufgRPC

Google Protocol Buffers(protobuf)是一种语言中立、平台中立的序列化协议,旨在高效地将结构化数据进行序列化和反序列化。(3)Protobuf 可以 gRPC 结合使用,定义和实现高效的 RPC 协议,支持流式传输和双向通信。每个字段有一个唯一的编号,用于标识字段。required:表示字段是必需的,消息必须包含该字段,否则解析消息时会报错。optional:表示字段是可选的,消息中可以包含也可以不包含该字段。每个字段有三部分:修饰符、类型和字段名,以及一个唯一的编号。

喜欢打篮球的普通人 1956

ProtobufgRPC

ProtobufgRPC学习总结课程报告

mzman的博客 1494

Golang gRPC+Protobuf:高效序列化的秘密

在当今的软件开发中,不同服务之间的通信至关重要。我们的目的就是要探索一种高效的服务间通信和数据序列化方案。本文的范围涵盖了Golang语言下gRPCProtobuf的基本概念、工作原理、实际应用等方面,帮助读者全面了解如何利用它们实现高效的序列化。本文首先会介绍gRPCProtobuf的核心概念,让大家对它们有一个初步的认识;接着详细讲解它们的工作原理和架构,包括算法原理、数学模型等;然后通过项目实战,展示如何在实际代码中运用;再探讨它们的实际应用场景;

AI Agent Harness Engineering 1741

【微服务】微服务、gRPCprotobuf是什么,及其联系

Protobuf是一种数据格式,定义了“服务和消息的结构”。它是基础,用来告诉服务端和客户端“如何传递数据”。gRPC是通信工具,利用 Protobuf 定义的结构,实现服务之间的高效调用。微服务是架构模式,将系统拆分成独立服务,这些服务之间通常通过 gRPC 通信。微服务是一种架构风格,把一个完整的应用拆分成多个小的服务,每个服务只负责一种特定的功能。用户服务:处理用户的注册、登录等操作。订单服务:负责下单、查询订单。商品服务:管理商品信息。支付服务:处理支付操作。微服务。

m0_74282926的博客 1683

ProtoBuf-gRPC实践

01.gRPC学习背景1.1 为什么要学RPC1.2 RPC是什么1.3 网络库收益分析1.4 学习计划说明1.5 学习问题思考02.ProtoBuf的介绍2.1 ProtoBuf是什么2.2 ProtoBuf和json2.3 ProtoBuf问题思考2.4 ProtoBuf特点2.5 ProtoBuf存储格式2.6 ProtoBuf优缺点2.7 创建proto文件2.8 ProtoBuf核心思想2.9 转化为Json数据。

杨充 1346

区块链:ProtoBuf gRPC

ProtoBuf gRPC ProtoBuf是一套接口描述语言(Interface Definition Language,IDL),类似 Apache 的Thrift。 相关处理工具主要是protoc,基于 C++ 语言实现。 用户写好.proto描述文件,之后便可以使用 protoc 自动编译生成众多计算机语言(C++、Java、Python、C#、Golang 等)的接口...

跨链技术践行者 8208

gRPC -> RPC -> Protobuf

gRPC 是一个现代、高效、跨语言的远程调用框架,Kubelet 通过 gRPC containerd 通信,实现在不同节点上的容器统一调度管理,是 Kubernetes 通信机制的“高铁级别”的高速通道。举例说明 kubelet 和 containerd 的某个具体 gRPC 调用的传输内容(原始 Protobuf 报文)展示.proto文件的目录结构字段说明创建你自己的 gRPC 服务示例(例如模拟 kubelet 调用容器创建)我都可以详细帮你构建出来。你想往哪个方向深入?

喝醉酒的小白 1015

grpc的数据传输格式protobuf你了解吗?

本文档主要讲解protobuf中基础的编码规则。先整体描述protobuf数据格式的优势,然后讲解protobuf的编码规则,通过了解编码规则,让大家深入浅出的理解protobuf的优势。在讲解规则时,会用到大量的例子帮助大家理解,大家也可以跟着一起计算,如果有计算不符的地方,欢迎评论区留言探讨。总结一下,gRPC选择protobuf是因为它的高性能、跨语言支持、强类型系统和自动代码生成,这些特点使得它非常适合构建高效、跨平台的微服务系统。

qq_41705360的博客 1840

gRPC的简介Protobuf的使用

gRPC 简介 gRPC:A high-performance, open-source universal RPC framework gRPC客户端和服务端可以在多种环境中运行和交互;例如服务端使用Java写;可以用Go语言写客户端调用 gRPCProtobuf介绍 微服务架构中每个服务对应的代码库都是独立运行的;gRPC 可以实现微服务,将大的项目拆分为多个小且独立的业务模块;即服务;各服务之间使用高效的protobuf协议进行RPC调用 可以使用proto files 创建gRPC服务;使用

wzbwzt的博客 2164
上一篇: Docker 1.12 Swarm 模式剖析
下一篇: 第二届全球区块链峰会随记
yeasy
博客等级 码龄21年 626粉丝 155原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值