当前位置: 首页 > news >正文

grpc和protobuf在一起

目录

gRPC 简介

使用protobuf

protobuf版本


gRPC 简介

gRPC 可以使用protobuf作为它的接口定义语言 ( IDL ) 和它的底层消息交换格式。在 gRPC 中,客户端应用程序可以直接调用不同机器上的服务器应用程序上的方法,就像它是本地对象一样,使你更容易创建分布式应用程序和服务。与许多 RPC 系统一样,gRPC 基于定义服务的思想,指定可以远程调用的方法及其参数和返回类型。在服务端,服务端实现这个接口并运行一个 gRPC 服务器来处理客户端调用。在客户端,客户端有一个存根(在某些语言中仅称为客户端),它提供与服务器相同的方法。

gRPC 客户端和服务器可以在各种环境中运行和相互通信——从 Google 内部的服务器到你自己的桌面——并且可以用任何 gRPC 支持的语言编写。因此,例如,你可以使用 Go、Python 或 Ruby 中的客户端轻松地在 Java 中创建 gRPC 服务器。此外,最新的 Google API 将具有其接口的 gRPC 版本,让你可以轻松地将 Google 功能构建到你的应用程序中。

使用protobuf

默认情况下,gRPC 使用protobuf, 谷歌成熟的结构化数据序列化开源机制(虽然它可以与其他数据格式如 JSON 一起使用)。这是它如何工作的快速介绍。如果你已经熟悉protobuf,请随时跳到下一部分。

使用protobuf的第一步是定义要在proto 文件中序列化的数据的结构:这是一个带有.proto扩展名的普通文本文件。protobuf数据被结构化为 消息,其中每条消息都是一个小的信息逻辑记录,包含一系列称为字段的名称-值对。这是一个简单的例子:

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

然后,一旦你指定了你的数据结构,你就可以使用protobuf编译器protoc从你的原型定义中以你喜欢的语言生成数据访问类。这些为每个字段提供了简单的访问器,例如name()and set_name(),以及将整个结构序列化/解析到原始字节的方法。因此,例如,如果你选择的语言是 C++,则在上面的示例中运行编译器将生成一个名为Person. 然后,你可以在应用程序中使用此类来填充、序列化和检索Personprotobuf消息。

你在普通的 proto 文件中定义 gRPC 服务,将 RPC 方法参数和返回类型指定为protobuf消息:

// The greeter service definition.
service Greeter {
  // Sends a greeting
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}

// The request message containing the user's name.
message HelloRequest {
  string name = 1;
}

// The response message containing the greetings
message HelloReply {
  string message = 1;
}

gRPC 使用protoc特殊的 gRPC 插件从你的 proto 文件生成代码:你将获得生成的 gRPC 客户端和服务器代码,以及用于填充、序列化和检索消息类型的常规protobuf代码。你将在下面看到一个示例。

protobuf版本

一般来说,虽然你可以使用 proto2(当前的默认protobuf版本),但我建议你将 proto3 与 gRPC 一起使用,因为它可以让你使用 gRPC 支持的所有语言,并避免与 proto2 客户端对话的兼容性问题proto3 服务器,反之亦然。

相关文章:

  • 1. HelmTemplate 3分钟将项目打包成Helm Chart并部署至k8s
  • 【Shell】算术运算符、流程控制、函数使用、数组以及加载其它文件的变量
  • Redis 备份恢复(持久化)手册
  • 【Linux】01-Linux系统CentOS7虚拟机VMware安装保姆级教程
  • Go语言各种扩容机制(防止混淆)
  • Pytorch深度学习——线性回归实现 04(未完)
  • 虚拟内存、锁页内存、内存分页、分段、段页式内存管理(超详细)
  • 【BOOST C++】教程4:常量和宏
  • 不可以涩涩!AI续写软件初体验;迁移学习路线图;谷歌新闻非官方搜索API;CS295『因果推理』2021课程资料;前沿论文 | ShowMeAI资讯日报
  • 高项_第十四章信息文档管理与配置管理
  • 07 nginx 的 worker process 的调试
  • 时间序列预测:用电量预测 04 Std_Linear(多元线性回归算法 数据标准化)
  • boost之跨平台 错误处理
  • 【Shell编程】字符截取命令awk、sed命令
  • 阿里国际、ebay测评自养号,如何看待自己产品的销量?
  • 【comparator, comparable】小总结
  • ES6之路之模块详解
  • JS 面试题总结
  • mysql 5.6 原生Online DDL解析
  • Mysql优化
  • ng6--错误信息小结(持续更新)
  • PAT A1120
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • React as a UI Runtime(五、列表)
  • tab.js分享及浏览器兼容性问题汇总
  • Vue2.0 实现互斥
  • 包装类对象
  • 浮现式设计
  • 关于 Cirru Editor 存储格式
  • 实现简单的正则表达式引擎
  • 数组大概知多少
  • 鱼骨图 - 如何绘制?
  • 正则表达式小结
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • (27)4.8 习题课
  • (M)unity2D敌人的创建、人物属性设置,遇敌掉血
  • (pytorch进阶之路)CLIP模型 实现图像多模态检索任务
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (附源码)计算机毕业设计SSM基于健身房管理系统
  • (转)visual stdio 书签功能介绍
  • (轉貼)《OOD启思录》:61条面向对象设计的经验原则 (OO)
  • .htaccess配置重写url引擎
  • .Net Remoting(分离服务程序实现) - Part.3
  • .net Stream篇(六)
  • .Net Winform开发笔记(一)
  • .net 简单实现MD5
  • .NET命名规范和开发约定
  • .NET企业级应用架构设计系列之开场白
  • [BUG] Hadoop-3.3.4集群yarn管理页面子队列不显示任务
  • [BZOJ5250][九省联考2018]秘密袭击(DP)
  • [C# WPF] DataGrid选中行或选中单元格的背景和字体颜色修改
  • [C++] Boost智能指针——boost::scoped_ptr(使用及原理分析)
  • [CCIE历程]CCIE # 20604
  • [codevs 2822] 爱在心中 【tarjan 算法】