什么是 RPC?RPC原理是什么?

article/2025/9/26 21:38:37

什么是 RPC?RPC原理是什么?

什么是 RPC?

RPC(Remote Procedure Call)—远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。比如两个不同的服务 A、B 部署在两台不同的机器上,那么服务 A 如果想要调用服务 B 中的某个方法该怎么办呢?使用 HTTP请求 当然可以,但是可能会比较慢而且一些优化做的并不好。 RPC 的出现就是为了解决这个问题。

 

  1. 服务消费方(client)调用以本地调用方式调用服务;
  2. client stub接收到调用后负责将方法、参数等组装成能够进行网络传输的消息体;
  3. client stub找到服务地址,并将消息发送到服务端;
  4. server stub收到消息后进行解码;
  5. server stub根据解码结果调用本地的服务;
  6. 本地服务执行并将结果返回给server stub;
  7. server stub将返回结果打包成消息并发送至消费方;
  8. client stub接收到消息,并进行解码;
  9. 服务消费方得到最终结果。

下面再贴一个网上的时序图:

 

RPC 解决了什么问题?

从上面对 RPC 介绍的内容中,概括来讲RPC 主要解决了:让分布式或者微服务系统中不同服务之间的调用像本地调用一样简单。

常见的 RPC 框架总结?

  • RMI(JDK自带): JDK自带的RPC,有很多局限性,不推荐使用。
  • Dubbo: Dubbo是 阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成。目前 Dubbo 已经成为 Spring Cloud Alibaba 中的官方组件。
  • gRPC :gRPC是可以在任何环境中运行的现代开源高性能RPC框架。它可以通过可插拔的支持来有效地连接数据中心内和跨数据中心的服务,以实现负载平衡,跟踪,运行状况检查和身份验证。它也适用于分布式计算的最后一英里,以将设备,移动应用程序和浏览器连接到后端服务。
  • Hessian Hessian是一个轻量级的remotingonhttp工具,使用简单的方法提供了RMI的功能。 相比WebService,Hessian更简单、快捷。采用的是二进制RPC协议,因为采用的是二进制协议,所以它很适合于发送二进制数据。
  • Thrift Apache Thrift是Facebook开源的跨语言的RPC通信框架,目前已经捐献给Apache基金会管理,由于其跨语言特性和出色的性能,在很多互联网公司得到应用,有能力的公司甚至会基于thrift研发一套分布式服务框架,增加诸如服务注册、服务发现等功能。

既有 HTTP ,为啥用 RPC 进行服务调用?

RPC 只是一种设计而已

RPC 只是一种概念、一种设计,就是为了解决 不同服务之间的调用问题, 它一般会包含有 传输协议 和 序列化协议 这两个。

实现 RPC 的可以传输协议可以直接建立在 TCP 之上,也可以建立在 HTTP 协议之上。大部分 RPC 框架都是使用的 TCP 连接(gRPC使用了HTTP2)。

HTTP 和 TCP

可能现在很多对计算机网络不太熟悉的朋友已经被搞蒙了,要想真正搞懂,还需要来简单复习一下计算机网络基础知识:

我们通常谈计算机网络的五层协议的体系结构是指:应用层、传输层、网络层、数据链路层、物理层。

应用层(application-layer)的任务是通过应用进程间的交互来完成特定网络应用。HTTP 属于应用层协议,它会基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。HTTP协议工作于客户端-服务端架构为上。浏览器作为HTTP客户端通过 URL 向HTTP服务端即WEB服务器发送所有请求。Web服务器根据接收到的请求后,向客户端发送响应信息。HTTP协议建立在 TCP 协议之上。

运输层(transport layer)的主要任务就是负责向两台主机进程之间的通信提供通用的数据传输服务。TCP是传输层协议,主要解决数据如何在网络中传输。相比于UDP,TCP 提供的是面向连接的,可靠的数据传输服务。

主要关键就在 HTTP 使用的 TCP 协议,和我们自定义的 TCP 协议在报文上的区别。

http1.1协议的 TCP 报文包含太多在传输过程中可能无用的信息:

HTTP/1.0 200 OK
Content-Type: text/plain
Content-Length: 137582
Expires: Thu, 05 Dec 1997 16:00:00 GMT
Last-Modified: Wed, 5 August 1996 15:55:28 GMT
Server: Apache 0.84

<html>
 <body>Hello World</body>
</html>

使用自定义 TCP 协议进行传输就会避免上面这个问题,极大地减轻了传输数据的开销。 这也就是为什么通常会采用自定义 TCP 协议的 RPC 来进行进行服务调用的真正原因。除此之外,成熟的 RPC 框架还提供好了“服务自动注册与发现”、"智能负载均衡"、“可视化的服务治理和运维”、“运行期流量调度”等等功能,这些也算是选择 RPC 进行服务注册和发现的一方面原因吧!

一个常见的错误观点

很多文章中还会提到说 HTTP 协议相较于自定义 TCP 报文协议,增加的开销在于连接的建立与断开,但是这个观点已经被否认,下面截取自某乎中一个回答:

首先要否认一点 HTTP 协议相较于自定义 TCP 报文协议,增加的开销在于连接的建立与断开。HTTP 协议是支持连接池复用的,也就是建立一定数量的连接不断开,并不会频繁的创建和销毁连接。二一要说的是 HTTP 也可以使用 Protobuf 这种二进制编码协议对内容进行编码,因此二者最大的区别还是在传输协议上。

 


http://chatgpt.dhexx.cn/article/9TCqGbP3.shtml

相关文章

【RK3399Pro学习笔记】三、Debian 9 安装 ROS (Thinker Edge R)

目录 配置源设置 Key安装初始化rosdep环境配置测试安装rosinstall卸载 平台&#xff1a;华硕 Thinker Edge R 瑞芯微 RK3399Pro 固件版本&#xff1a;Tinker_Edge_R-Debian-Stretch-V1.0.4-20200615 参考资料&#xff1a; RK3399(Debian9 - stretch) 安装 ROS Lunar —— WB8…

VMware安装Debian9及开发环境配置

序 需要用到一个搭载armv7架构A7内核的Linux设备&#xff0c;装的是Debian系统&#xff0c;为便于兼容该设备故用VMware安装一个Debian9虚拟机&#xff0c;整理总结了网上一些信息以供参考。 目录 一、安装Debian91、WMware中的配置2、安装镜像 二、开发环境配置1、设置快捷键打…

debian 升级linux内核,Debian 9更新到最新的Linux内核

喜欢折腾的同学,会豪气如何升级 Debian Stretch 的内核到新版。遗憾的是现在能搜到的升级 Debian Linux 内核的文章多数是使用Ubuntu的deb安装包,其实这样装上去是有问题,常见的问题是,总会提示需要 apt --fix-broken install 。 这里简单记录一下,如何使用Debian官方源更…

debian 9 ssh root权限登录

debian 9默认的一样不能用root用户登录&#xff0c;还是需要设置&#xff0c;方法如下&#xff1a; 一&#xff0c;打开终端&#xff0c;用普通用户登录 输入&#xff1a;su - 输入密码&#xff0c;切换到root用户 二&#xff0c;设置root用户登录 nano /etc/ssh/sshd_conf…

Debian9到Debian11的超详细升级教程

在云服务器商镜像页面中&#xff0c;可能无法选择一些系统最新的镜像版本。 就会造成一些软件不能顺利下载。 这时就需要自己手动下载并安装最新版的Debian系统了。 1、把当前版本的包更新到最新的版本 apt-get update apt-get upgrade apt-get dist-upgrade按q 直接回车 …

【linux实战】debian9安装python3.7

之前有写了一篇ubuntu18.04使用apt安装python各个版本的&#xff0c;但是最近上debian9上&#xff0c;发现那种apt安装方式不可行&#xff0c;因为ppa不支持debian系列。 Debian 9 默认安装有 Python 2.7 和 3.5。但是我们现在没法使用apt直接安装是没法安装自己想要的版本。 …

debian 系统启动服务器,Debian9添加开机自启动服务

升级到Debian9后&#xff0c;我们发现系统默认不带/etc/rc.local文件&#xff0c;但rc.local服务仍然保留 补齐缺失文件&#xff0c;让Debian9通过编辑/etc/rc.loacl文件为我们的服务添加开机自启动 1、添加rc-local.service #以下为一整条命令&#xff0c;一起复制运行cat >…

debian服务器系统安装,安装Debian 9(Stretch)最小服务器

在本指南中,我们将引导您使用netinstall CD ISO映像安装Debian 9(Stretch)Minimal Server 。 您将执行的此安装适用于构建未来可定制的服务器平台,而无需GUI(图形用户界面)。 您可以使用它来安装仅需要使用的必需软件包,我们将在将来的指南中向您展示。 但是,在进一步了解系…

debian9服务器系统,如何安装Debian 9(Stretch)最小服务器

本教程将介绍如何安装Debian 9(Stretch)最小服务器。 本指南的目的是提供一个最小的Debian设置&#xff0c;可以作为我们其他Debian 9教程的基础&#xff0c;以及在howtoing.com上完美的服务器指南 。 1要求 要安装Debian 9服务器系统&#xff0c;您将需要以下内容&#xff1a;…

debian9软件源的设置

文章目录 debian9软件源的设置概述笔记END debian9软件源的设置 概述 今天和同学讨论一个在debian9下自产软件的细节, 需要先编译这个软件工程. 他说在debian9或debian10下都可以编译. 我本地debian9虚拟机编译失败. 因为我这虚拟机环境是从.iso装的, 装到可以访问外网就做了…

IDEA连接数据库失败

问题描述 IDEA连接数据库输入用户名密码后点击测试连接&#xff0c;返回failed连接失败。 点击view查看失败原因 提示错误号为08001 分析原因 MySql 5.X版本和MySql8.X版本之间有个比较大的区别&#xff0c;MySql8.X在连接的时候需要设置时区&#xff0c;否则连接失败。 …

PHP连接数据库失败-解决方案

问题描述 今天在使用php代码连接数据库的时候发现死活都连接不上&#xff0c;在确认账号密码都没有错误的情况下&#xff0c;几乎找遍了答案都无法解决。 解决方法 通过不断的查阅资料及测试&#xff0c;发现问题在于本机地址localhost和127.0.0.1身上&#xff0c;当我把l…

用php连接数据库步骤,php连接数据库步骤详细介绍

本篇文章为大家简述一下PHP与数据库连接步骤&#xff0c;仅供参考。 1&#xff1a;链接数据库 ①主机地址 ②mysql用户名 ③mysql密码 ④选择连接的数据库 ⑤端口号mysqli_connect($localhost, $user, $password, $port); 返回&#xff1a;如果连接成功&#xff0c;返回资源类型…

CDH 5.13 hue数据库连接测试失败

在自己的虚拟机部署了好几次hue连接测试不通过&#xff0c;暂时用不到hue&#xff0c;就一直没有管。 路径; /opt/cm-5.13.1/log/cloudera-scm-server 执行 tail -n 500 cloudera-scm-server.log 报错信息&#xff1a; 解决办法&#xff1a;安装mysql的时候&#xff0c;将…

用友系统中连接数据库服务器失败,用友u8服务器连接不到本地数据库

用友u8服务器连接不到本地数据库 内容精选 换一换 创建外表语法(CREATE FOREIGN TABLE (SQL on Hadoop or OBS))中,需指定一个与MRS数据源连接相关联的外部服务器。当您通过GaussDB(DWS)管理控制台创建MRS数据源连接时,数据库管理员dbadmin会在默认数据库gaussdb中自动创建一…

达梦数据库连接失败解决方式

打开达梦数据库之后&#xff0c;连接失败&#xff0c;检查主机名、用户名、口令后依旧出现下图错误 点开详情后&#xff0c;提示错误消息&#xff1a;网络通信异常 排查发现&#xff0c;本地的达梦服务没有启动 解决办法&#xff1a; 首先&#xff0c;打开任务管理器里面的服…

关于Java连接mysql数据库失败的一种检查思路

今天学习《Java从入门到精通》李晓波版本时&#xff0c;用Java连接数据库失败&#xff0c;报了下面错误 这里贴个连接数据库的代码 package del; import java.sql.*; public class Java16_1 {public static void main(String[] args) {// TODO Auto-generated method stubConn…

eclipse连接数据库

数据库连接是很让人烦的一件事&#xff0c;因为状况百出&#xff0c;下面我就来说一下我连接的过程。 右击一个项目 下面就可以开始检查是否连接成功了! import java.sql.Connection; import java.sql.DriverManager;/*** 数据库工具类* author Administrator**/ public class …

关于Navicat连接本地数据库失败,报错2003

在连接虚拟机中数据库时成功的&#xff0c;在连接本地数据库显示失败 下图所示&#xff0c;连接数据库失败 在查找多方资料后 1.使用管理员权限 安装mysql服务器 输入命令&#xff1a;mysqld --install 2. 启动mysql服务 net start mysql 3. 启动数据库 在dos窗口输入&#…

Idea内部连接数据库测试连接失败解决办法

刚转到idea,需要配置一下数据库的连接&#xff0c;但是刚开始有一些小问题&#xff0c; 如图&#xff1a; 点击测试发现不可以&#xff0c;最终发现问题所在&#xff0c;原来是时区的问题&#xff0c; 解决办法&#xff1a;URL后拼接?serverTimezoneGMT 成功解决。