掌握 gRPC 和 RPC 的关键区别

一、远程过程调用协议简介

1、RPC 的本质

首先,我们探讨一下什么是 RPC。RPC,缩写为 Remote Procedure Call Protocol,直译来看就是远程过程调用协议

讲得通俗一些:

  • RPC 是一种通信机制
  • RPC 实现了客户端/服务器通信模型

官方的定义可能会这样解释:它是一种协议,可以使程序能在网络上请求远程计算机上的服务,而无须关心底层网络技术细节。

RPC 的构架可以分为三个层次

  • 用户与服务器(负责业务逻辑,并调用本地的存根程序)
  • 存根程序(Stub)(负责封装和解封装约定语法和语义)
  • RPC运行时(RPCRuntime)(管理网络通信的最底层)

下面的示意图说明了典型的开发情景:前端代码调用后端服务

RPC 示意图

2、RPC 解决的核心问题

RPC 的设计解决了几个关键问题:

  • 协议一致性问题: 举例来说,如何确保前端和后端能够就“0为是,1为否”的约定达成共识。
  • 传输协议的弹性: 当面对网络错误、数据重传、丢失或性能瓶颈时,RPC 如何应对。
  • 服务的发现机制: 客户端应如何发现可用的服务器服务、访问哪个端口等。服务器可能会启动多个远程调用服务,监听在随机端口,客户端需要一种机制来探测这些服务。

3、RPC 的使用场景

两个经典的应用示例包括:

  • 即时通讯软件
  • 微服务架构

4、RPC 的工作流程*

从调用到结果接收,RPC 的过程概述如下:

  • 调用方(Client)发起本地调用式的远程请求;
  • 客户端存根(Client stub)接收请求,将调用的方法名、参数等序列化为可网络传输的消息;
  • 客户端存根发送序列化后的消息给服务端;
  • 服务端存根(Server stub)接受消息并反序列化,以获取调用的方法名和参数;
  • 服务端存根执行本地调用获取结果;
  • 服务端返回执行结果给它的存根;
  • 服务端存根序列化执行结果,发送回客户端;
  • 客户端存根反序列化结果,并返回给客户端调用方;
  • 调用方(Client)得到最终的RPC调用执行结果。

5、RPC 与 HTTP 的差异点

RPC 和 HTTP 对比不完全是同等级别的比较,更恰当的是将 RPC 和 "HTTP + RestFul" 放在一起对比。

传输协议方面

RPC 不限于 HTTP,它还可以选择 TCP 进行传输,而 HTTP 只工作在自身的协议之上。

传输效率方面

RPC 包含了 HTTP2 的特性,使得它在传输效率上优于标准的 HTTP1。

性能消耗方面

得益于 HTTP2 的特性(如二进制传输、头部压缩等),RPC 在性能上的消耗相较于 HTTP1 会更低。

负载均衡方面

大多数 RPC 框架自带负载均衡策略,而传统的 HTTP 方案则通常需要通过 Nginx/HAProxy 等工具实现。

服务治理方面

RPC 框架 能实现自动通知和服务调整,而 HTTP 则往往需要手动通知和修改配置。

二、深入了解 gRPC

1、gRPC 概述

简单来说,gRPC 是一个开源的RPC框架,它建立在 HTTP2 的基础设施之上,因而自然具备了HTTP2 的一系列优势:

  • 二进制分帧的数据传输
  • 多路复用
  • 服务端推送
  • 头部压缩

2、gRPC 的通信流程

如下图所示,通过 gRPC 进行远程服务调用时,客户端(client)仅需 gRPC 存根,通过 Proto Request 请求 gRPC 服务器,服务器则通过 Proto Response(s) 返回结果。

gRPC 通信流程图

三、了解 JSON-RPC 接口

JSON-RPC 是一种简洁的使用JSON格式数据的RPC传输协议,它通过HTTP进行通信。Postman 是API开发中常用的工具,能够轻松实现 JSON-RPC 接口的测试与使用。

四、如何调试 gRPC

Apifox 提供基于 .proto 文件的 gRPC 接口调试功能,支持包含一元调用和流式调用。项目创建时,选择「gRPC项目」并导入 .proto 文件,即可开始调试,无需编写额外代码。

Apifox gRPC 调试

导入 .proto 文件之前,需要确认是否有其他依赖的.proto文件,并添加相应的依赖路径。

导入 .proto 文件

一元调用

通过将 gRPC URL 填入地址栏并点击「调用」按钮,即可实现一元调用。

一元调用

流式调用

流式调用包括服务端流、客户端流和双向流。调用成功后,用户可以在消息标签区编写并发送消息。Apifox 展示了时间线视图,按顺序分布显示调用状态、发送的消息和收到的消息。点击具体消息可以方便地查看详细信息。

流式调用

知识扩展:

  • REST API 简介 - RESTful Web 服务
  • 分布式系统框架对比:gRPC vs Dubbo

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring IOC 源码分析

​ 什么是 IoC IoC (Inversion of control )控制反转。它是一种思想不是一个技术实现。描述的是:Java开发领域对象的创建以及管理的问题。 例如:现有类A依赖于类B。传统的开发方式 :往往是在类A中手动通过new关键字…

unity C#深拷贝、浅拷贝、直接赋值区别与经典实例

文章目录 浅拷贝深拷贝浅拷贝和直接赋值有啥区别 在C#中,浅拷贝(Shallow Copy)和深拷贝(Deep Copy)是两种不同级别的对象复制方式。它们的区别主要体现在处理引用类型字段时的行为。 浅拷贝 浅拷贝是指复制对象时&…

SSM框架整合:掌握Spring+Spring MVC+MyBatis的完美结合!

SSM整合 1.1 流程分析1.2 整合配置步骤1:创建Maven的web项目步骤2:添加依赖步骤3:创建项目包结构步骤4:创建SpringConfig配置类步骤5:创建JdbcConfig配置类步骤6:创建MybatisConfig配置类步骤7:创建jdbc.properties步骤8:创建SpringMVC配置类步骤9:创建Web项目入口配…

中科院国产多语言大模型-YAYI2开源!家族AI应用场景全覆盖!

项目简介 YAYI 2 是中科闻歌研发的新一代开源大语言模型,中文名:雅意,采用了超过 2 万亿 Tokens 的高质量、多语言语料进行预训练。 开源地址:https://github.com/wenge-research/YAYI2 YAYI2-30B是其模型规模,是基…

设计模式之访问者模式【行为型模式】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档> 学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您: 想系统/深入学习某…

推荐两款好用的卫星地图。

问题描述:推荐两款好用的卫星地图。 问题解决:谷歌地球、高德卫星地图。个人感觉谷歌地球好用一些。

金蝶云星空和吉客云单据接口对接

金蝶云星空和吉客云单据接口对接 对接系统:吉客云 吉客云是基于“网店管家”十五年电商ERP行业和技术积累基础上顺应产业发展需求,重新定位、全新设计推出的换代产品,从业务数字化和组织数字化两个方向出发,以构建流程的闭环为依归…

基于卡尔曼滤波的声源跟踪方法研究

基于卡尔曼滤波的声源跟踪方法研究 摘 要一、研究意义二、研究内容三、算法介绍3.1基于到达时间差的定位算法3.1.1算法原理介绍3.1.2仿真实验设计与分析 3.2扩展卡尔曼滤波算法3.2.1算法的基本原理3.2.2仿真实验及分析 3.3无迹卡尔曼滤波算法3.3.1算法的基本原理3.3.2仿真实验及…

web学习笔记(十五)

目录 1.Date对象 1.1日期对象的概念 1.2Date()方法的使用 1.3Date()常用方法汇总 1.4例题:用函数编写一个倒计时 2.函数 2.1函数的概念 2.2函数的使用 2.3函数的参数 2.4函数的声明 2.5函数的返回值 2.6异步函数 3特殊函数类型 3.1匿名函数 3.2箭头函数…

精细微调技术在大型预训练模型优化中的应用

目录 前言1 Delta微调简介2 参数微调的有效性2.1 通用知识的激发2.2 高效的优化手段3 Delta微调的类别3.1 增量式微调3.2 指定式微调3.3 重参数化方法 4 统一不同微调方法4.1 整合多种微调方法4.2 动态调整微调策略4.3 超参数搜索和优化 结语 前言 随着大型预训练模型在自然语…

基于cy7c68013的逻辑分析仪nanoDLA全套软件linux下编译测试

0. 环境 - win10 - ubuntu22 - nanoDLA 提前获取到源码:-> 浏览器打开 https://github.com/wuxx/nanoDLA -> Download as zip. 硬件就直接用taobao买到的,原理图是 1. win10出厂测试 1.1 安装pulseview nanoDLA-master\software\pulseview-0.4.…

VGAN实现视网膜图像血管分割(基于pytorch)

背景介绍 VGAN(Retinal Vessel Segmentation in Fundoscopic Images with Generative Adversarial Networks)出自2018年的一篇论文,尝试使用生成性对抗网络实现视网膜血管分割的任务,原论文地址:https://arxiv.org/abs/1706.0931…