RPC——远程过程调用

一、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.mzph.cn/news/725910.shtml

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

相关文章

QT----在编译器里能够连接云端数据库,使用windeployqt打包后运行程序,链接不上云端mysql数据库

问题描述 在编译器里能够连接云端数据库,使用windeployqt打包后运行程序,链接不上云端mysql数据库,困扰了好几天 打包发布手机上的app还是无法连接 问题解决 打包的时候没有将这个文件放入,我们复制放到exe的目录即可

redis原理深入解析之看完这篇还需要努力

数据结构 动态字符串SDS struct __attribute__ ((__packed__)) sdshdr8 {uint8_t len; /*已保存的字节数 不含结束标识 header*/uint8_t alloc; /*申请总的字节数,不含结束标识 header*/unsigned char flags;/*不同sds头类型,控制sds头大小 header*/…

【AI视野·今日Robot 机器人论文速览 第八十二期】Tue, 5 Mar 2024

AI视野今日CS.Robotics 机器人学论文速览 Tue, 5 Mar 2024 Totally 63 papers 👉上期速览✈更多精彩请移步主页 Interesting: 📚双臂机器人拧瓶盖, (from 伯克利) website: https://toruowo.github.io/bimanual-twist 📚水下抓取器, (from …

Dynamo初学尝试梳理(五)-代码块上

“学而时习之,不亦说乎”,今天接着来,稍微提高点难度(高手直接忽略就行)。 代码块(Code Block),是 dynamo 中可以直接输入 DesignScript 的节点。可以通过双击鼠标左键,快…

程序员书单推荐:从入门到精通的必读之作

在程序员的职业生涯中,阅读技术书籍是不断学习和提升自我的重要途径。本文将为你推荐一系列从入门到精通的程序员书单,帮助你系统地掌握编程知识、提高技能水平,并在职业生涯中取得更大的进步。 一、入门篇 《Head First C语言》&#xff1…

基于SpringBoot+Vue+ElementUI+Mybatis前后端分离管理系统超详细教程(一)

Vue.js 是一个流行的前端框架,用于构建用户界面和单页应用程序。Vue 2 是其第二个主要版本,它提供了数据绑定、组件化、虚拟DOM等核心特性。要搭建一个 Vue 2 的工程化项目,可以遵循以下步骤: 一、前端环境搭建 (一&a…

Maven入门(作用,安装配置,Idea基础maven,Maven依赖,Maven构建项目)【详解】

目录 一. Maven的作用 1.依赖管理 2.统一项目结构 3.项目构建 二.Maven安装配置 1. Maven的仓库类型 2 加载jar的顺序 3. Maven安装配置 4.安装Maven 5.配置仓库 三.idea集成maven 1.给当前project集成maven 2.给新建project集成maven 3.创建maven项目 4.pom…

二维码门楼牌管理系统应用场景:地方社区管理的新利器

文章目录 前言一、地方社区管理部门的门牌信息利用二、与社区管理部门的联动效应三、结论 前言 随着信息技术的不断发展,二维码门楼牌管理系统逐渐成为地方社区管理的新宠。该系统通过集成二维码技术与门楼牌信息,为社区管理带来了前所未有的便利与高效…

Github 2024-03-07Go开源项目日报 Top10

根据Github Trendings的统计,今日(2024-03-07统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Go项目10TypeScript项目1Harbor - 开源的云原生注册表项目 创建周期:2908 天开发语言:Go协议类型:Apache License 2.0Star数量:21549 个For…

uniapp 解决请求出现 /sockjs-node/info?t=问题

1. uniapp请求出现 /sockjs-node/info?t问题 1.1. 问题 uniapp项目老是出现 http://192.168.2.106:8080/sockjs-node/info?t1709704280949 1.1. sockjs-node介绍 sockjs-node 是一个JavaScript库,提供跨浏览器JavaScript的API,创建了一个低延迟、全…

selinux规则

selinux状态 相关命令 进程要和文件的安全上下文相匹配,进程才能打开文件 查找这个命令从哪个安装包来的用 yum provides 命令 进程httpd 必须与ls -Z的文件类型一致,要不然在强制模式下面,打开不了 在终端2用此命令,把文件类型改…

【有趣】带照明灯的自行车“铃”

这个自行车“铃”发出的不是令行人刺耳讨厌的金属铃声,而是礼貌友好的“请让路,谢谢!”声,新颖而有趣;照明灯则为夜间骑车带来方便,既保安全而又实用。整个装置成本不足10元,制作和安装使用也都…

微信小程序用户登陆和获取用户信息功能实现

官方文档: https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html 接口说明: https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/user-login/code2Session.html 我们看官方这个图,梳理一下用户…

本地项目推送到腾讯云轻量应用服务器教程(并实现本地推送远程自动更新)

将本地项目上传到腾讯云轻量应用服务器并实现后续的推送更新,具体步骤如下: 在本地项目目录下初始化 Git 仓库: cd 项目目录 git init将项目文件添加到 Git 仓库并提交: git add . git commit -m "Initial commit"在…

git 命令怎么回退到某个特定的 commit 并将其推送到远程仓库?

问题 不小心把提交的名称写错提交上远程仓库了,这里应该是 【029】的,这个时候我们想回到【028】这一个提交记录,然后再重新提交【029】到远程仓库,该怎么处理。 解决 1、首先我们找到【028】这条记录的提交 hash,右…

瑞芯微第二代8nm高性能AIOT平台 RK3576 详细介绍

RK3576处理器 RK3576瑞芯微第二代8nm高性能AIOT平台,它集成了独立的6TOPS(Tera Operations Per Second,每秒万亿次操作)NPU(神经网络处理单元),用于处理人工智能相关的任务。此外,R…

teknoparrot命令行启动游戏

官方github cd 到teknoparrot解压目录 cd /d E:\mn\TeknoParrot2_cp1\GameProfiles启动游戏 TeknoParrotUi.exe --profile游戏配置文件游戏配置文件位置/UserProfiles,如果UserProfiles文件夹里没有那就在/GameProfiles,在配置文件里将游戏路径加入之间,或者打开模拟器设置 …

基于ACM32 MCU的两轮车充电桩方案,打造高效安全的电池管理

随着城市化进程的加快、人们生活水平的提高和节能环保理念的普及,越来越多的人选择了电动车作为代步工具,而两轮电动车的出行半径较短,需要频繁充电,因此在城市中设置两轮车充电桩就非常有必要了。城市中的充电桩不仅能解决两轮车…

python+django+vue房屋租赁系统 8gwmf

房屋租赁系统在设计与实施时,采取了模块性的设计理念,把相似的系统的功能整合到一个模组中,以增强内部的功能,减少各组件之间的联系,从而达到减少相互影响的目的。如房源信息、预约信息、求租信息模块等[12]。 管理员后…

springcloud:3.7测试线程池服务隔离

服务提供者【test-provider8001】 Openfeign远程调用服务提供者搭建 文章地址http://t.csdnimg.cn/06iz8 相关接口 测试远程调用:http://localhost:8001/payment/index 服务消费者【test-consumer-resilience4j8004】 Openfeign远程调用消费者搭建 文章地址http://t…