RPC——远程过程调用

news/2024/4/16 16:34:46/文章来源:https://blog.csdn.net/m0_54369128/article/details/136441629

一、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.luyixian.cn/news_show_997480.aspx

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

相关文章

【项目笔记】java微服务:黑马头条(day02)

文章目录 app端文章查看,静态化freemarker,分布式文件系统minIO1)文章列表加载1.1)需求分析1.2)表结构分析1.3)导入文章数据库1.3.1)导入数据库1.3.2)导入对应的实体类 1.4)实现思路1.5)接口定义1.6)功能实现1.6.1):导入heima-leadnews-article微服务&am…

JEDEC标准介绍及JESD22全套下载

JEDEC标准 作为半导体相关的行业的从业者,或多或少会接触到JEDEC标准。标准对硬件系统的设计、应用、验证,调试等有着至关重要的作用。 JEDEC(全称为 Joint Electron Device Engineering Council)是一个电子组件工程标准制定组织…

面试题个人总结(面经)

自我介绍 你好,我叫XXX,是今天面试初级蓝队的人员,我毕业于XXXX,专业为网络空间安全,我曾经在XXXXX实习过,有过大概一年左右的工作经验,还有过一定的护网经验,去年在XXX厂商护过网,…

Python与FPGA——图像锐化

文章目录 前言一、图像锐化二、Python robert锐化三、Python sobel锐化四、Python laplacian锐化五、FPGA sobel锐化总结 前言 在增强图像之前一般会先对图像进行平滑处理以减少或消除噪声,图像的能量主要集中在低频部分,而噪声和图像边缘信息的能量主要…

排序算法——梳理总结

✨冒泡 ✨选择 ✨插入  ✨标准写法  &#x1f3ad;不同写法 ✨希尔排序——标准写法 ✨快排 ✨归并 ✨堆排 ✨冒泡 void Bubble(vector<int>& nums) {// 冒泡排序只能先确定最右边的结果&#xff0c;不能先确定最左边的结果for (int i 0; i < nums.size(); i){…

Spark Core

Spark Core 一、Spark RDD RDD概述 1.RDD基础 2.RDD源代码描述 3.RDD特性 4.Spark宽窄依赖 RDD创建 在驱动器中创建RDD 1.parallelize 读取外部数据集创建RDD 2.textFile RDD操作 缓存rdd到内存 1.RDD转化操作 2.常见的转化操作 3.RDD行动操作 4.常见的行动操作 Spark…

力扣-数组题

1. 两数之和 找出map中是否有target-nums[i]&#xff0c; class Solution { public:vector<int> twoSum(vector<int>& nums, int target) {unordered_map<int, int> hash;for(int i 0 ;i < nums.size(); i){if(hash.find(target - nums[i]) ! hash…

Service Mesh:如何为您的微服务架构带来可靠性和灵活性

在云原生架构中&#xff0c;Service Mesh 技术成为了微服务架构中不可或缺的一环。本文灸哥将和你一起探讨 Service Mesh 技术的原理、功能和实践&#xff0c;帮助架构师和开发人员更好地理解和应用这一关键技术。 1、Service Mesh 技术概述 Service Mesh 又称为服务网格&…

【STM32】HAL库 CubeMX 教程 --- 高级定时器 TIM1 定时

实验目标&#xff1a; 通过CUbeMXHAL&#xff0c;配置TIM1&#xff0c;1s中断一次&#xff0c;闪烁LED。 一、常用型号的TIM时钟频率 1. STM32F103系列&#xff1a; 所有 TIM 的时钟频率都是72MHz&#xff1b;F103C8不带基本定时器&#xff0c;F103RC及以上才带基本定时器。…

代码随想录 回溯算法-分割

目录 131.分割回文串 93.复原IP地址 131.分割回文串 131. 分割回文串 中等 给你一个字符串 s&#xff0c;请你将 s 分割成一些子串&#xff0c;使每个子串都是 回文串 。返回 s 所有可能的分割方案。 回文串 是正着读和反着读都一样的字符串。 示例 1&#xff1a; 输…

【PHP+代码审计】PHP基础——变量和常量的定义和使用

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【Java、PHP】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收…

【算法沉淀】刷题笔记:并查集 带权并查集+实战讲解

&#x1f389;&#x1f389;欢迎光临&#x1f389;&#x1f389; &#x1f3c5;我是苏泽&#xff0c;一位对技术充满热情的探索者和分享者。&#x1f680;&#x1f680; &#x1f31f;特别推荐给大家我的最新专栏《数据结构与算法&#xff1a;初学者入门指南》&#x1f4d8;&am…

使用modinfo对比内核版本号

加载内核&#xff0c;出现版本不一样 cat /proc/verison查看内核板本 模块版本&#xff1a;显示模块的版本号。 $ modinfo [OPTIONS] [MODULE] 参数说明-F, --field <field>: 指定要显示的字段&#xff0c;可以使用逗号分隔多个字段。-k, --kernel <kernel>: 指定…

如何解决微服务的数据一致性分发问题?

介绍 系统架构微服务化以后,根据微服务独立数据源的思想,每个微服务一般具有各自独立的数据源,但是不同微服务之间难免需要通过数据分发来共享一些数据,这个就是微服务的数据分发问题。Netflix/Airbnb等一线互联网公司的实践[参考附录1/2/3]表明,数据一致性分发能力,是构…

OpenHarmony教程指南—ArkUI中组件、通用、动画、全局方法的集合

介绍 本示例为ArkUI中组件、通用、动画、全局方法的集合。 本示例使用 Tabs容器组件搭建整体应用框架&#xff0c;每个 TabContent内容视图 使用 div容器组件 嵌套布局&#xff0c;在每个 div 中使用 循环渲染 加载此分类下分类导航数据&#xff0c;底部导航菜单使用 TabCont…

基于springboot+vue的企业员工薪酬关系系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

【Spring底层原理高级进阶】Spring Batch清洗和转换数据,一键处理繁杂数据!Spring Batch是如何实现IO流优化的?本文详解!

&#x1f389;&#x1f389;欢迎光临&#xff0c;终于等到你啦&#x1f389;&#x1f389; &#x1f3c5;我是苏泽&#xff0c;一位对技术充满热情的探索者和分享者。&#x1f680;&#x1f680; &#x1f31f;持续更新的专栏《Spring 狂野之旅&#xff1a;从入门到入魔》 &a…

猫毛过敏又不想扔掉猫怎么办?如何养猫?热门宠物空气净化器分享

养了猫咪一年多&#xff0c;忽然发现自己患上了过敏性鼻炎和结膜炎&#xff0c;就是那种一靠近猫咪就会不断打喷嚏、流鼻涕、流眼泪的症状。有时候还会感到眼睛发痒&#xff0c;发红。有没有什么好的方法治疗过敏性鼻炎呢&#xff1f; 医生建议&#xff0c;从根本上解决问题需…

【C++ 编程指南】

C 编程指南 ■ C环境安装■ C 基本语法■ 预定义宏■ # 和 ## 运算符■ C 引用■ C 命名空间■ 定义命名空间■ using 指令■ 嵌套的命名空间 ■ String类■ 类■ 类的static静态成员 ■ C 继承■ 继承类型 public、protected 或 private■ 访问控制和继承■ 多继承■ 数据抽象…

微信小程序-生命周期

页面生命周期 onLoad: 页面加载时触发的方法&#xff0c;在这个方法中可以进行页面初始化的操作&#xff0c;如获取数据、设置页面状态等。 onShow: 页面显示时触发的方法&#xff0c;在用户进入页面或从其他页面返回该页面时会调用此方法。可以在此方法中进行页面数据刷新、动…