​什么是 gRPC?​

news2024/11/22 5:57:05

原文作者:NGINX

原文链接:什么是 gRPC?

转载来源:NGINX 开源社区


NGINX 唯一中文官方社区 ,尽在 nginx.org.cn

gRPC(Google Remote Procedure Call,Google 远程过程调用)是一个高性能的开源框架。它通过 HTTP/2 实现 API,旨在帮助开发人员更轻松地构建分布式应用,特别是当代码可能在不同地方运行的时候。

gRPC 最初由 Google 开发,用于实现远程过程调用(RPC)。如今,gRPC 是云原生计算基金会(CNCF)的一个孵化项目,这意味着它已被用于生产环境,并得到了大量贡献者的支持。

为何创建 gRPC?

为了解 Google 开发 gRPC 的原因,我们来大致看一下 API 这一设计的发展过程。

RPC 是设计和构建 API 的最早方法之一,允许您编写代码,就好像它将在本地计算机上运行一样,即使您实际上可能需要调用在其他机器(通常在您的本地网络)上运行的服务。

在实践中,这支持开发人员使用直接操作命令(例如 SendUserMessagesaddEntry 等),而不必考虑网络细节。RPC 消息具有轻量化、高效等特征,但却与底层系统紧密耦合,因此难以集成和变更,并很有可能泄露系统的细节。

REST API 架构问世后为使用 GETPOSTPUT 及 DELETE 等通用 HTTP 方法访问数据和资源提供了一种统一的方式,化解了其中一些挑战。尽管 REST 简化了数据访问,但 API 返回的元数据往往多于所需的数量。而且由于 REST API 还需要更多的网络信息(例如,请求发送的目的地),因此不如 RPC 轻量化和高效。

gRPC 有何优势?

通过采用新技术,gRPC 更新了 RPC 旧方法,以实现互操作性并提高效率。如今,它被大量用于为微服务架构开发 API。

gRPC 的一些优势包括:

  • 性能 – gRPC 默认使用 HTTP/2 作为其传输协议和 Protocol Buffers,这使其性能要高于 REST 和 JSON 通信。

  • 流式传输 – gRPC 支持事件驱动型架构的数据流,例如服务器端流式传输、客户端流式传输及用于同时发送客户端请求和服务器响应的双向流式传输。

  • 互操作性 – gRPC 内置代码生成能力,支持广泛的编程语言,包括 C++、Java、Python、PHP、Go、Ruby、C#、Node.js 等。

  • 安全性 – gRPC 提供可插式身份验证、链路追踪、负载均衡及健康检查,可提高安全防护和弹性。

  • 云原生 – gRPC 支持基于容器的部署,并可兼容 Kubernetes 和 Docker 等现代云技术。

总之,gRPC 提供了一个灵活的高性能框架,非常适合高度分布式微服务架构中的服务间通信。

了解 gRPC:基本概念

gRPC 的优势和好处主要源于以下两种技术的采用:

  • 用于信息结构化的 Protocol Buffers

  • 作为传输层的 HTTP/2

用于结构化消息的 Protocol Buffers

gRPC 使用 Protocol Buffers(或“Protobuf”)来定义服务和消息,而非利用 XML 或 JSON。它是一种语言中立的机制,用于对服务将要相互发送的结构化消息进行序列化处理。

类似于 REST API 的 OpenAPI 规范的概念,gRPC 中的 API 契约在 .proto 文本文件中实现。开发人员可在该文件中定义其所需的数据结构化方式。然后,protoc 编译器会自动将 .proto 文本文件编译成支持的语言。在运行时,消息被压缩并以二进制格式发送。

这提供了两大优势:

  • gRPC 占用的 CPU 较少,因为数据以二进制格式表示,降低了消息的大小。

  • 模式进行了明确定义,可确保消息在客户端和服务器之间顺畅交换,从而减少错误。

作为传输层的 HTTP/2

过去,REST API 使用 HTTP/1.1 作为传输层,虽然也可通过 HTTP/2 传送。然而,gRPC 只使用 HTTP/2,这带来了一些关键优势。其中一个优势是能够使用二进制发送通信。此外,HTTP/2 支持处理多个并行请求,而不是一次处理一个请求。通信也是双向的,这意味着单个连接即可同时发送请求和响应。

总体而言,HTTP/2 有助于提高性能,并降低网络利用率,这在繁忙的微服务架构中尤其重要。然而,它也有一些局限性。现代 Web 浏览器通常不支持 HTTP/2,因此您可能需要使用 NGINX 等反向代理来交付应用。

gRPC 与 REST:比较

如今,REST 是最主要的 API 设计风格,因此可用作与 gRPC 进行对比。REST 和 gRPC 都是为 Web 应用和微服务构建 API 的有效方法,难分优劣。不过,了解二者之间的主要区别对选择最适合作业的工具而言大有裨益。

gRPC 和 REST 之间的一些主要区别包括以下方面:

  • 协议

  • 数据格式

  • 流式传输

  • API 设计

  • 性能

  • 错误处理

  • 语言支持

协议

虽然 REST API 能够利用 HTTP/2,RESTful 服务通常使用基于文本的 HTTP/1.1 作为传输层,而 gRPC 则完全依靠 HTTP/2 — 这是一种更高效的二进制协议,支持请求头压缩和单个 TCP 连接上多路复用等特性。

数据格式

REST API 通常使用 JSON 作为收发数据的数据格式。JSON 是基于文本的格式,易于读写,并得到了广泛支持。gRPC API 使用 Protobuf,它采用二进制格式,可提供更小的有效载荷并实现更快的交互。但 Protobufs 本身可读性差。

流式传输

REST API 支持“请求-响应”模式,对流式传输的支持有限。相比之下,gRPC API 通过 HTTP/2 进行传送,并支持多种通信模式,包括一元流式传输(请求-响应)、服务器流式传输、客户端流式传输和双向流式传输。

API 设计

REST 是一种以资源为中心的模式,支持 GET、POST、PUT 和 DELETE 等标准 HTTP 方法。每个请求都必须包含处理该请求所需的所有信息。此外,API 契约通常使用 OpenAPI 规范编写而成,客户端和服务器的编码需要单独完成。相比之下,gRPC 是一种以服务为中心的模式,其中消息和服务在 .proto 文件中进行定义。该文件可用于为 API 客户端和服务器生成代码。

性能

REST 可能会慢些,因为它通过 HTTP/1.1 传输基于文本的数据。每个请求都需要进行一次 TCP 握手,这可能会导致一些延迟。而 gRPC 支持通过 HTTP/2 传输多个数据流,因此多个客户端可同时发送多个请求,而无需新建 TCP 连接。它还利用了 HTTP/2 的特性,例如请求头压缩。

错误处理

REST 使用标准 HTTP 状态代码进行错误处理。相比之下,gRPC 支持以更高的细粒度来定义错误状态代码,并确保其保持一致。默认的 gRPC 模型非常有限,通常使用更丰富的错误模型(由 Google 开发)进行扩展。

语言支持

REST 得到了几乎所有语言的广泛支持,但并未提供任何内置代码生成功能。实现完全由开发人员自己解决。而 gRPC 凭借其 protoc 编译器为多种编程语言提供了原生代码生成功能。

应使用 gRPC 而非 REST 吗?

综上所述,在 gRPC 和 REST 之间如何选择取决于您所需完成的项目。gRPC 为分布式应用中的服务提供了一种高效、高性能的通信方式。不过,它无法被 Web 浏览器及其他客户端直接读取,并需要使用 API 网卡或反向代理(如 NGINX)与前端客户端进行交互。对于事件驱动型微服务架构中的内部 API 而言,它是不二之选。

与之相比,REST 已被广泛采用,并得到了几乎所有语言的支持。它具有人类和机器可读性,因为数据使用 JSON 或 XML 进行交换。此外,其入门学习难度要低得多,并得到许多 Web 浏览器的支持,因此非常适合公开暴露的 API。

gRPC 微服务架构

由于性能以及在语言支持方面的灵活性,gRPC 是微服务架构中通信的最佳选择之一。开发人员可以轻松构建并生成以其首选语言运行的 gRPC 客户端和服务器。由于 gRPC 以二进制格式描述了 API 契约,因此微服务可独立于用于构建它们的语言进行通信。

最常见的基于 gRPC 的微服务架构之一是将 API 网关部署在微服务的前面,然后通过 gRPC 处理所有内部通信。API 网关处理来自 HTTP/1.1 的传入请求,并通过 HTTP/2 将其作为 gRPC 请求代理到微服务。

gRPC 安全防护问题

随着 gRPC 日益普及,开发人员和安全运维团队需要确保部署有效的安全防护解决方案。由于 gRPC 消息采用二进制格式,因此对于采用 ASCII 通信的设备和工具而言,可能会遇到问题。

gRPC API 也容易受到许多最常见的 API 安全威胁。访问控制、加密及运行时防护等标准 API 安全防护实践在基于 gRPC 的架构中同样重要。

gRPC 安全防护建议

gRPC 应用和 API 需要采用整体安全防护方法。确保 gRPC 安全的一些最佳实践包括:

  • 模式验证 – 通过验证 gRPC 消息中的每个字段是否具有正确的类型和预期内容来阻止恶意利用。

  • 数据屏蔽 – 屏蔽或阻止敏感数据(如信用卡号码和社会保险号)离开系统。

  • 速率限制 – 严格限制请求的大小和数量,以防止资源耗尽型 DoS 攻击。

  • 访问控制 – 在授予客户端对服务的访问权限之前执行身份认证和授权。

  • 加密 – 使用传输层安全(TLS)保护传输中的消息。

最终,您应验证 API 网关、Web 应用防火墙(WAF)及其他 API 管理和安全防护工具能否保护您生产环境中的 gRPC 应用和 API。这些工具应能够为每个服务导入 .proto 文件,以用于对 gRPC 应用和 API 实施安全防护。

总结

gRPC 正被开发人员及 Netflix 和 Lyft 等大公司大量用于微服务架构中的内部通信。不过,gRPC 既无法替代 REST API,也不是构建 API 的更好方式。只有当您主要为内部微服务环境构建 API 并需要高效、实时通信能力时,gRPC 才是一个可供考虑的备选方案。

展望未来,鉴于其性能优势和易开发性,gRPC 可能会在云原生应用中愈加受到青睐。与此同时,需要公开暴露 API 的开发人员将继续在其应用中使用 REST。REST 也将继续存在于云原生环境中,因为它具有向后兼容性并可深度集成现有 API 基础架构和运维环境。

更多资源

NGINX 提供了各种免费资源,可为您提供所需的帮助。

博客

  • 将 NGINX 部署为 API 网关:发布 gRPC 服务

  • 使用 NGINX App Protect 保护 gRPC API

  • 保护 gRPC 应用免遭严重的 DoS 攻击

  • 保护 GraphQL 和 gRPC 双向流式传输 API

电子书

  • API 策略:面向平台工程团队的最佳实践

产品资料

  • NGINX API 互联套件(API Connectivity Stack)

  • NGINX App Protect


NGINX 唯一中文官方社区 ,尽在 nginx.org.cn

更多 NGINX 相关的技术干货、互动问答、系列课程、活动资源: 开源社区官网 | 微信公众号

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1601249.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

1688上怎么找跨境电商低价优质货源?妙手ERP帮您搞定!

1688是跨境卖家常用的货源网站,但很多从1688上拿货的卖家都会遇到这样的问题:有时候找到的货源比同行售价还高,好不容易找到低价的货源,但质量不好、供应也不稳定。 实际上,1688平台上有很多超低价的货源,…

Ubuntu系统安装APITable多维表格平台结合内网穿透实现公网访问

文章目录 前言1. 部署APITable2. cpolar的安装和注册3. 配置APITable公网访问地址4. 固定APITable公网地址 前言 vika维格表作为新一代数据生产力平台,是一款面向 API 的智能多维表格。它将复杂的可视化数据库、电子表格、实时在线协同、低代码开发技术四合为一&am…

机器人码垛机的技术特点与应用

随着科技的飞速发展,机器人技术正逐渐渗透到各个行业领域,其中,机器人码垛机在物流行业的应用尤为引人瞩目。它不仅提高了物流效率,降低了成本,更在改变传统物流模式的同时,为行业发展带来了重大的变革。 一…

2024蓝桥杯每日一题(最大公约数)

备战2024年蓝桥杯 -- 每日一题 Python大学A组 试题一:公约数 试题二:最大公约数 试题三:等差数列 试题四:最大比例 试题五:Hankson的趣味题 试题一:公约数 【题目描述】 …

cesium加载高层级离线影像地图瓦片(天地图、19级Arcgis)

实际加载效果如图: 1、下载离线地图瓦片方式(多种任选其一,个人倾向于Qgis工具): 方式1、采用第三方下载工具如:91卫图、水经注、全能电子地图下载器、bigemap等等。(这些有的下载层级不够&…

服务器数据恢复—xfs文件系统节点、目录项丢失的数据恢复案例

服务器数据恢复环境: EMC某型号存储,该存储内有一组由12块磁盘组建的raid5阵列,划分了两个lun。 服务器故障: 管理员为服务器重装操作系统后,发现服务器的磁盘分区发生改变,原来的sdc3分区丢失。由于该分区…

【C语言】每日一题,快速提升(2)!

🔥博客主页🔥:【 坊钰_CSDN博客 】 欢迎各位点赞👍评论✍收藏⭐ 题目:杨氏矩阵 有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是递增的,请编写程序在这样的矩阵中查找某个…

Ubuntu 部署ChatGLM3大语言模型

Ubuntu 部署ChatGLM3大语言模型 ChatGLM3 是智谱AI和清华大学 KEG 实验室联合发布的对话预训练模型。 源码:https://github.com/THUDM/ChatGLM3 部署步骤 1.服务器配置 Ubuntu 20.04 8核(vCPU) 32GiB 5Mbps GPU NVIDIA T4 16GB 硬盘 100GiB CUDA 版本 12.2.2/…

从汇编代码理解数组越界访问漏洞

数组越界访问漏洞是 C/C 语言中常见的缺陷,它发生在程序尝试访问数组元素时未正确验证索引是否在有效范围内。通常情况下,数组的索引从0开始,到数组长度减1结束。如果程序尝试访问小于0或大于等于数组长度的索引位置,就会导致数组…

Python 物联网入门指南(八)

原文:zh.annas-archive.org/md5/4fe4273add75ed738e70f3d05e428b06 译者:飞龙 协议:CC BY-NC-SA 4.0 第三十章:制作机械臂 最后,我们终于到达了大多数人自本书开始以来就想要到达的地方。制作一个机械臂!在…

pip如何查看Python某个包已发行所有版本号?

以matplotlib包为例子, pip install matplotlib6666 6666只是胡乱输入的一个数,反正输入任意一个不像版本号的数字都可以~ matplotlib所有版本号如下, 0.86, 0.86.1, 0.86.2, 0.91.0, 0.91.1, 1.0.1, 1.1.0, 1.1.1, 1.2.0, 1.2.1…

【问题处理】银河麒麟操作系统实例分享,oom分析

1.问题现象描述 服务器数据库被oomkill掉,但是mem查看只占用了不到60%。 2.问题分析 2.1.oom现象分析 从下面的日志信息,可以看到chmod进程是在内核采用GFP_KERNEL|__GFP_COMP分配order3也就是2的3次方,8个连续页的时候,因进入…

如何使用Git-Secrets防止将敏感信息意外上传至Git库

关于Git-Secrets Git-secrets是一款功能强大的开发安全工具,该工具可以防止开发人员意外将密码和其他敏感信息上传到Git库中。 Git-secrets首先会扫描提交的代码和说明,当与用户预先配置的正则表达式模式匹配时,便会阻止此次提交。该工具的优…

字体反爬积累知识

目录 一、什么是字体反扒 二、Unicode编码 三、利用font包获取映射关系 一、什么是字体反扒 字体反爬是一种常见的反爬虫技术,它通过将网页中的文本内容转换为特殊的字体格式来防止爬虫程序直接获取和解析文本信息。字体反爬的原理是将常规的字符映射到特殊的字…

Linux 磁盘管理和文件系统

硬盘的物理结构: 盘片硬盘有多个盘片,每盘片2面磁头每面一个磁头 硬盘的数据结构: 扇区盘片被分为多个扇形区域,扇区:每个扇区存放512字节的数据,硬盘的最小存储单位磁道同一盘片不同半径的同心圆,是由磁…

C++笔记:类和对象

类和对象 认识类和对象 先来回忆一下C语言中的类型和变量,类型就像是定义了数据的规则,而变量则是根据这些规则来实际存储数据的容器。类是我们自己定义的一种数据类型,而对象则是这种数据类型的一个具体实例。类就可以理解为类型&#xff0c…

「翻版周慧敏」海底骚逆天长腿贺30岁生日

有「翻版周慧敏」之称的苏皓儿(Chloe),日前原来已是她迎来30岁生日,她也在IG分享潜水靓相。火红色比坚尼尽骚她的苗条身材和长腿,就连网民也十分佩服,说:「三字头都咁靓好屈机!」 Ch…

MySQL 核心模块揭秘 | 14 期 | 回滚整个事务

回滚整个事务要怎么清除 binlog 日志,InnoDB 又会进行哪些操作? 作者:操盛春,爱可生技术专家,公众号『一树一溪』作者,专注于研究 MySQL 和 OceanBase 源码。 爱可生开源社区出品,原创内容未经授…

电商价格监测合规性探讨

品牌在做控价、数据分析的过程中,都需要先有数据作为支撑,也就是说要先采集数据,价格监测也是如此,监测的基础是采集,现在主流的采集形式是爬虫采集,可以理解为人工采集的升级版,以机器代替人工…

Python基于深度学习的车辆特征分析系统

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…