RPC——远程过程调用

news2024/11/18 19:47:57

一、RPC介绍

1.1 概述

  1. RPC(Remote Procedure Call Protocol) 远程过程调用协议。
  2. RPC是一种通过网络从远程计算机程序上请求服务,不需要了解底层网络技术的协议。
  3. RPC主要作用就是不同的服务间方法调用就像本地调用一样便捷。

1.2 RPC框架

  1. 应用级的服务框架:阿里的 Dubbo/Dubbox、Google gRPC、Spring Boot/Spring Cloud。
  2. 远程通信协议:RMI、Socket、SOAP(HTTP XML)、REST(HTTP JSON)。
  3. 通信框架:MINA 和 Netty

gRPC:gRPC是Google开源软件,gRPC是基于HTTP2.0协议,而HTTP2.0是基于二进制的HTTP协议升级版本,底层使用Netty框架支持。
Thrift:Thrift是Facebook开源项目,其是一个跨语言的服务开发框架。用户只需在进行二开即可,对底层的RPC通讯透明。
Dubbo:Dubbo是阿里开源组件协议和序列化框架都可以插拔,依托Spring框架开发,远程接口是基于Java接口,适用于微服务架构。

1.3 RPC的作用

1、服务化:微服务化,跨平台的服务之间远程调用;
2、分布式系统架构:分布式服务跨机器进行远程调用;
3、服务可重用:开发一个公共能力服务,供多个服务远程调用;
4、系统间交互调用:两台服务器A、B,服务器A上的应用a需要调用服务器B上的应用b提供的方法,而应用a和应用b不在一个内存空间,不能直接调用,此时,需要通过网络传输来表达需要调用的语义及传输调用的数据。

使用场景

1、大型网站:内部涉及多个子系统,服务、接口较多。

2、注册发现机制:如Nacos、Dubbo等,一般都有注册中心,服务有多个实例,调用方调用的哪个实例无感知。

3、安全性:不暴露资源。

4、服务化治理:微服务架构、分布式架构。

作者这里使用的是第4个用途。

二、RPC架构

RPC的架构图

2.1 调用过程

下面以一次调用过程为例:

1、客户端调用(Client):通过本地调用的方式调用服务(以接口方式调用);
2、客户端存根(Client Stub):接收到调用请求后负责将方法、入参等信息进行组装序列化成能够进行网络传输的消息体(将消息体对象序列化为二进制流);
3、客户端存根(Client Stub):找到远程的服务地址,并且将消息通过网络发送给服务端(通过sockets发送消息);
4、服务端存根(Server Stub):收到消息后进行反序列化操作,即解码(将二进制流反序列化为消息对象);
5、服务端存根(Server Stub):通过解码结果调用本地的服务进行相关处理;
6、服务端(Server):本地服务业务处理(执行应用程序);
7、服务端(Server):将处理结果返回给服务端存根(返回结果);
8、服务端存根(Server Stub):序列化处理结果(将结果消息对象序列化为二进制流);
9、服务端存根(Server Stub):将序列化结果通过网络发送至客户端(通过sockets发送消息);
10、客户端存根(Server Stub):接收到消息,进行反序列化解码(将结果二进制流反序列化为消息对象);
11、客户端得到最终的结果

2.2 各部分功能作用

客户端:Client,服务调用方。
客户端存根:Client Stub,存放服务端地址信息,将客户端的请求参数数据信息打包成网络消息,再通过网络传输发送给服务端。
服务端存根:Server Stub,接收客户端发送过来的请求消息并进行解包,然后再调用本地服务进行处理。
服务端:Server,服务的真正提供者。
newtwork service:底层传输,tcp或http

2.3 RPC功能实现

RPC功能的实现主要分为:服务寻址、序列化和反序列化、网络传输功能。

2.3.1 Call ID映射


1、本地:在本地方法调用中,函数体是直接通过函数指针来指定的,但是在远程调用中,由于两个进程的地址空间完全不一样,函数指针不起作用。
2、远程:RPC中所有函数或方法都有自己的一个ID(programID),在所有进程中都唯一。客户端在做远程过程调用时,必须附上这个ID,即客户端会查一下表,找出相应的Call ID,然后传给服务端,服务端也会查表,来确定客户端需要调用的函数,然后执行相应函数的代码。
3、Call ID映射表一般是一个哈希表。

2.3.2 序列化和反序列化功能(类似压缩于解压)

概述
1、序列化:将消息对象转换为二进制流。
2、反序列化:将二进制流转换为消息对象。
必要性
1、远程调用涉及到数据的传输,在本地调用中,只需要将数据压入栈中,然后让函数去栈中读取即可。
2、但远程的数据传输,由于客户端和服务端不在同一个服务器上,涉及不同的进程,不能通过内存传递参数,此时就需要将客户端先将请求参数转成字节流(编码),传递给服务端,服务端再将字节流转为自己可读取格式(解码),这就是序列化和反序列化的过程。反之,服务端返回值也逆向经历序列化和反序列化到客户端。
序列化的优势
1、将消息对象转为二进制字节流,便于网络传输。
2、可跨平台、跨语言。

2.3.3 网络传输功能

作用
1、客户端将Call ID和序列化后的参数字节流传输给服务端。
2、服务端将序列化后的调用结果回传给客户端。
协议
主要有TCP、UDP、HTTP协议。

基于TCP协议(常用)
1、客户端和服务端建立Socket连接。
2、客户端通过Socket将需要调用的接口名称、方法名称及参数序列化后传递给服务端。
3、服务端反序列化后再利用反射调用对应的方法,将结果返回给客户端。
基于HTTP协议
1、客户端向服务端发送请求,如GET、POST、PUT、DELETE等请求。
2、服务端根据不同的请求参数和请求URL进行方法调用,返回JSON或者XML数据结果。
TCP和HTTP对比
1、基于TCP协议实现的RPC调用,由于是底层协议栈,更佳灵活的对协议字段进行定制,可减少网络开销,提高性能,实现更大的吞吐量和并发数。但底层复杂,实现代价高
2、基于HTTP协议实现的RPC调用,已封装实现序列化,但HTTP属于应用层协议,HTTP传输所占用的字节数比TCP更高,传输效率对比TCP较低。

三、rpcgen工具的使用

3.1 概述

rpcgen 是一个用于生成远程过程调用(RPC)相关代码的工具,它是 RPC 协议的一部分。RPC 是一种允许程序调用另一个地址空间(通常是远程计算机上的程序)中的程序的技术。rpcgen 通常与 UNIX 和类 UNIX 系统上的 RPC 服务一起使用,它可以根据定义 RPC 接口的 .x 文件(接口定义文件)生成客户端和服务器端的代码。

rpcgen工具见 ==> 远程过程调用RPC生成工具

rpcgen 的主要功能包括:

  1. 自动生成客户端存根(stub)代码,这些代码用于客户端发起 RPC 调用。
  2. 自动生成服务器端存根代码,这些代码用于服务器端处理 RPC 请求。
  3. 生成用于数据序列化和反序列化的辅助代码。
  4. 生成用于错误处理的代码。

使用 rpcgen 时,开发者首先需要定义 RPC 接口定义文件(通常以.x为扩展名),然后在编译时运行 rpcgen 来生成相应的代码。这些代码随后可以被编译和链接到应用程序中,以实现 RPC 功能。

3.2 rpcgen的使用

1、首先我们需要定义 RPC 接口定义文件(通常以.x为扩展名)

2、打开后按照需求定义接口并设定ID

3、然后回到工具所在的地方

4、打开终端,输入命令运行rpcgen.exe,生成.c源文件。

4、执行成功后可以看到生成了新的源文件,生成代码成功。

5、接下来就是将生成的代码移植到需要的地方使用。

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

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

相关文章

二分搜索算法分析

目录 时间复杂度 空间复杂度 注意 二分搜索代码归纳 时间复杂度 怎么计算二分查找算法的时间复杂度呢?如果用T (n )来表示n 个有序元素的二分查找算法的时间复杂度,那么结果如下。 • 当n 1时,需要一次做比较,T (n )O (1)。 …

间隔5分钟执行1次Python脚本设置步骤 —— 定时执行专家

《定时执行专家》是一款制作精良、功能强大、毫秒精度、专业级的定时任务执行软件,用于在 Windows 系统上定时执行各种任务,包括执行脚本或程序。 下面是使用 "定时执行专家" 软件设置定时执行 Python 脚本的步骤: 步骤 1: 设置 P…

基于qt的图书管理系统----05其他优化

参考b站:视频连接 源码github:github 目录 1 优化借阅记录显示2 时间显示为年月日3 注册接口 1 优化借阅记录显示 现在只能显示部分信息,把接的书名和人的信息全部显示 在sql语句里替换为这一句即可实现查询相关联的所有信息 QString str…

[React 进阶系列] React Context 案例学习:使用 TS 及 HOC 封装 Context

[React 进阶系列] React Context 案例学习:使用 TS 及 HOC 封装 Context 具体 context 的实现在这里:[React 进阶系列] React Context 案例学习:子组件内更新父组件的状态。 根据项目经验是这样的,自从换了 TS 之后,…

洗衣洗鞋店小程序对接水洗唛打印,一键预约,支付无忧

随着社会的进步和科技的发展,我们的生活幸福感与日俱增。为了让我们从琐碎中解脱出来,干洗店洗鞋店行业也日新月异。今天,我为大家推荐这款优秀的干洗店小程序系统,让您的洗衣洗鞋服务体验更上一层楼。 干洗店管理系统是一款专为洗…

解读电影级视频生成模型 MovieFactory

Diffusion Models视频生成-博客汇总 前言:MovieFactory是第一个全自动电影生成模型,可以根据用户输入的文本信息自动扩写剧本,并生成电影级视频。其中针对预训练的图像生成模型与视频模型之间的gap提出了微调方法非常值得借鉴。这篇博客详细解…

2016年认证杯SPSSPRO杯数学建模C题(第一阶段)如何有效的抑制校园霸凌事件的发生解题全过程文档及程序

2016年认证杯SPSSPRO杯数学建模 C题 如何有效的抑制校园霸凌事件的发生 原题再现: 近年来,我国发生的多起校园霸凌事件在媒体的报道下引发了许多国人的关注。霸凌事件对学生身体和精神上的影响是极为严重而长远的,因此对于这些情况我们应该…

服务器通过impitool设置BMC共享lan实现远程管理

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、NC-SI是什么?二、ipmitool是什么三、查看是否支持ipmi设备四、安装ipmitool五、开始配置1.查看网卡状态2.设置运行模式3.设置静态地址 六、验证…

【机器学习】包裹式特征选择之基于遗传算法的特征选择

🎈个人主页:豌豆射手^ 🎉欢迎 👍点赞✍评论⭐收藏 🤗收录专栏:机器学习 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进…

u盘里文件损坏无法打开怎么恢复?这样操作更简单

U盘已经成为我们传输和存储数据的重要工具。然而有时候我们可能会遇到U盘里的文件损坏无法识别的情况,这无疑给我们的工作和学习带来了不小的困扰。 那么面对这种情况应该如何应对呢?本文将为你介绍个实用的恢复方法,帮助你轻松解决U盘文件损…

排序算法:插入排序和希尔排序

一、插入排序 1.基本原理 插入排序(英语:Insertion Sort)是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上…

ResponseStatusException

目录 概述: 综合实例: 继承 ResponseStatusException-自定义异常类 继承 ResponseStatusException-自定义响应头信息 继承 ResponseStatusException-定制更多异常处理逻辑 继承 ResponseStatusException-根据异常发生的上下文动态改变 HTTP 状态码…

嵌入式培训3-7

1.在主函数定义字符数组&#xff0c;在自定义函数中实现字符串比较 int strcmp(char *s1, char *s2); 参数&#xff1a;两个字符串 返回值&#xff1a;s1-s2差 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> int…

力扣面试经典150 —— 6-10题

力扣面试经典150题在 VScode 中安装 LeetCode 插件即可使用 VScode 刷题&#xff0c;安装 Debug LeetCode 插件可以免费 debug本文使用 python 语言解题&#xff0c;文中 “数组” 通常指 python 列表&#xff1b;文中 “指针” 通常指 python 列表索引 文章目录 6. [中等] 轮转…

Qt/C++音视频开发68-检查是否含有B帧/转码推流/拉流显示/监控拉流推流/海康大华宇视监控

一、前言 为什么需要判断视频文件是否含有B帧&#xff0c;这个在推流的时候很容易遇到这个问题&#xff0c;一般来说&#xff0c;没有B帧的视频文件&#xff0c;解码后的数据帧pts和dts都是顺序递增的&#xff0c;而有B帧的则未必&#xff0c;可能有些需要先解码后面显示&…

CentOS上安装MySQL 5.7和MySQL 8.0教程

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

全天候购药系统(微信小程序+web后台管理)

PurchaseApplet 全天候购药系统&#xff08;微信小程序web后台管理&#xff09; 传统线下购药方式存在无法全天候向用户提供购药服务&#xff0c;无法随时提供诊疗服务等问题。为此&#xff0c;运用软件工程开发规范&#xff0c;充分调研建立需求模型&#xff0c;编写开发文档…

智慧城市的前景:数字孪生技术在智慧城市中的应用前景

目录 一、引言 二、数字孪生技术及其在智慧城市中的应用概述 三、数字孪生技术在智慧城市中的应用前景 1、城市规划与仿真模拟 2、智能交通与出行服务 3、智慧环保与可持续发展 4、智慧公共服务与社会治理 5、智慧能源与绿色建筑 四、数字孪生技术在智慧城市中的挑战与…

稀疏数组实现

博文主要是自己学习的笔记&#xff0c;供自己以后复习使用&#xff0c; 参考的主要教程是B站的 尚硅谷数据结构和算法 稀疏数组(sparse array) 实际需求&#xff1a;五子棋程序中的存盘退出和续上盘的功能 问题分析&#xff1a; 如果直接用二维数组&#xff0c;很多值是默认…

hfish蜜罐搭建与使用

本次是对自己在学习蓝队过程中的一次对安全设备 hfish蜜罐的搭建和使用考核记录,距离之前已 经过去很久了,对之前在考核过程中的操作进行回顾和总结. 蜜罐在这里我进行免费分享 hfish-3.1.4-windows-amd64.zip官方版下载丨最新版下载丨绿色版下载丨APP下载-123云…