RPC——RPC协议介绍及原理详解

news2024/10/5 17:28:35

common wx:CodingTechWork

介绍RPC学习总结思维导图

RPC框架

概念

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

常用RPC技术或框架

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

主流的gRPC、Thrift、Dubbo

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

为什么要有RPC?

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

使用场景

  1. 大型网站:内部涉及多个子系统,服务、接口较多。
  2. 注册发现机制:如Nacos、Dubbo等,一般都有注册中心,服务有多个实例,调用方调用的哪个实例无感知。
  3. 安全性`:不暴露资源。
  4. 服务化治理:微服务架构、分布式架构。

架构

架构图

在这里插入图片描述

一次RPC调用流程

在这里插入图片描述

  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. 客户端得到最终的结果。

核心功能

重要组成

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

功能实现

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

服务寻址功能

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

需要通过服务注册中心去查询对方服务有哪些实例。

  1. Nacos整合OpenFeign实现RPC调用。
  2. Spring Cloud集成Dubbo实现RPC调用。

序列化和反序列化功能

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

网络传输功能

作用
  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较低。

RPC与Restful API对比

侧重不同

  1. RPC侧重于操作
  2. Restful侧重于资源

传输效率

  1. RPC效率更高,可自定义TCP协议,控制请求报文体积。
  2. Restful效率更低,基于HTTP协议。

复杂度

  1. RPC实现复杂,需关注服务寻址、序列化和反序列化及网络传输,调用流程繁琐。
  2. Restful实现简单,无需关注序列化和反序列化、网络传输,调用流程便捷。

使用场景

  1. RPC适用于公司内部服务调用,如部门之间不同平台的服务调用,性能消耗低,传输效率高,实现复杂一些。
  2. HTTP主要用于外部异构环境,浏览器接口调用、第三方接口调用等。

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

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

相关文章

Java蓝桥杯

目录 往年真题 题目分类 搜索 动态规划 并查集 贪心算法 二分查找 输入输出 图论 其他 往年真题 2022年第十三届蓝桥杯大赛软件类决赛Java研究生组真题 - 题库 - C语言网 2021年蓝桥杯第十二届省赛及国赛真题 - 题库 - C语言网 2020年蓝桥杯第十一届省赛及国赛真题…

[创业之路-73] :如何判断一个公司或团队是熵增:一盘散沙、乌合之众,还是,熵减:凝聚力强、上下一心?

前言: 一盘散沙、乌合之众: 凝聚力强、上下一心: 一、股权结构与利益分配 一盘散沙、乌合之众 凝聚力强、上下一心 股权结构过于松散和平均,无决策者,常常陷入无休止的争论股权结构层次结构,有最终决策者…

0302nacos配置运行-docker-macos apple arm64

1 已有镜像 拉取镜像 docker pull zhusaidong/nacos-server-m1:2.0.3运行容器-单机模式运行配置mysql数据库 第一步:创建挂载目录和文件 创建nacos 日志目录、配置目录 直接运行镜像,命令行或者图形界面进入容器,找到配置文件home/nacos/con…

TClientDataSet 模拟 EXECEL表

日常处理数据时,经常需要,从EXCEL表格中,批量导入数据,通过 XLSReadWriteII编程,会很快导入。 但是,客户提供的EXCEL表的字段,数据格式,字段的排序,有很大的区别。因此&a…

如何正确使用SDK加密串(视频加密)

我们点播SDK需要用户提供 userid、readtoken、writetoken、secretkey几个配置信息才能解密播放视频。基于安全性考虑,建议这些参数保存在服务端,APP 在启动时从服务端获取并配置。 为防止 APP 端被嗅探这几个参数,需要对传输的内容进行加密。…

Postgresql源码(105)分区表剪枝代码分析

对于分区表,对于子表的剪枝是保证性能的最重要的手段,优化器在生成Plan的过程中对子表进行了裁剪,本篇对裁剪流程做简要总结。 1 构造数据 CREATE TABLE measurement (city_id int not null,logdate date not null,peaktemp…

电子科技大学 数学专业-功不唐捐,玉汝于成

电子科技大学 数学专业 功不唐捐,玉汝于成 1.本科背景 本科是坐落于湖南湘潭的湖南科技大学,专业为网络工程专业,因热爱数学专业,所以决定跨考数学专业。 本科专业课平均成绩85,排名10/104。CET 4 474分,…

【动态规划专栏】-- 01 背包问题 -- 动态规划经典题型

目录 背包问题概述 01 背包问题 01背包⭐⭐ 【算法原理】 第一问 第二问 C 算法代码 复杂度分析 【空间优化 - 滚动数组】 C 算法代码 复杂度分析 分割等和子集⭐⭐ 【算法原理】 对于类01背包问题 C 算法代码 【空间优化 - 滚动数组】 C 算法代码 目标和…

利用宝塔搭建个人博客:简单而高效的教程

前言 宝塔面板是一款服务器管理软件,支持windows和linux系统,可以通过Web端轻松管理服务器,提升运维效率。 例如:创建管理网站、FTP、数据库,拥有可视化文件管理器,可视化软件管理器,可视化CP…

[C++]异常笔记

我不怕练过一万种腿法的对手,就怕将一种腿法 练一万次的对手。 什么是C的异常 在C中,异常处理通常使用try-catch块来实现。try块用于包含可能会抛出异常的代码,而catch块用于捕获并处理异常。当异常被抛出时,程序会跳过try块中未执行…

Redis6之简介与安装

目录 一、NoSQL NoSQL 特点 使用场景 二、Redis介绍 简介 特性 使用场景 三、Redis安装 1、下载 2、安装 3、启动、停止 4、补充 四、key键操作 一、NoSQL NoSQL 非关系型数据库;存储原理非常简单(典型的数据类型为k-v),不存在繁杂的关系链&#xff…

LabVIEW与Space Wire配合开发

LabVIEW与Space Wire配合开发 Space Wire是欧洲航天局开发的一种高速、点对点、全双工的串行总线网络,以IEEE1355-1995和LVDS 两个商业标准为基础,汲取了1394技术、ATM技术、以太网技术的优点,同时考虑了空间应用的特点,在故障检…

10 - 守护进程深度分析

---- 整理自狄泰软件唐佐林老师课程 查看所有文章链接:(更新中)Linux系统编程训练营 - 目录 文章目录 1. 会话与终端的关联1.1 思考1.2 新会话关联控制终端的方法1.3 一些相关推论1.4 一些想法1.5 编程实验:会话与终端 2. 守护进程…

RK android13编译环境搭建与常用编译命令

RK android13编译环境搭建与常用编译命令 1 使用清华的源1.1 备份sources.list1.2 用下面的内容替换/etc/apt/sources.list里面的内容1.3 更新源 2 安装编译环境3 常用编译命令3.1 设置项目的编译命令,环境变量3.1 编译所有模块3.2 编译android3.2 编译kernel3.3 编…

linux驱动学习2-pinctrl子系统和gpio子系统

pinctrl子系统 pinctrl 子系统主要用于管理芯片的引脚。 iomuxc节点介绍 首先我们在/ebf-buster-linux/arch/arm/boot/dts/imx6ull.dtsi 文件中查找 iomuxc 节点&#xff0c;可以看到如下定义 iomuxc: iomuxc20e0000 {compatible "fsl,imx6ul-iomuxc";reg <…

【软件环境安装部署】Linux服务器下 Docker 安装 MongoDB 以及 SpringBoot 整合 MongoDB 开发使用

文章目录 安装测试 MongoDB拉取镜像创建和启动容器登录mongo容器&#xff0c;并进入到【admin】数据库创建一个用户&#xff0c;mongo 默认没有用户连接mongo数据库测试数据库&#xff0c;插入一条语句测试数据库&#xff0c;查询刚才插入的语句查看所有数据库开放指定端口navi…

【状态估计】基于线性卡尔曼滤波器和粒子滤波器无人机估计地形高度(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

python基础----11-----闭包、装饰器、单例、工厂、多线程、socket、正则表达式、递归

一 闭包 闭包&#xff1a;通过封装一个函数&#xff0c; 该函数内部又封装一个函数用于返回&#xff0c;使得得到一个无法直接修改值的临时变量&#xff0c;只能通过函数调用修改。闭包的作用&#xff1a;代替全局变量&#xff0c;避免全局变量的滥用。闭包的优缺点&#xff1…

华为荣耀系列uniapp无法USB连接手机调试问题解决方案汇总

华为荣耀系列是一个异常奇葩的手机&#xff0c;经常出现无法调试的问题。 目前我整理出一套完整的切实多次测试可行的解决方案。 一、打开手机的关于手机 设置里面-一直快速点击版本号&#xff0c;连续点10几下。 此时处于开发者模式。 二、打开开发者选项 1、打开开发者…

搭建一个定制版New Bing吧

项目介绍 项目地址&#xff1a;https://github.com/adams549659584/go-proxy-bingai 引用项目简介&#xff1a;用 Vue3 和 Go 搭建的微软 New Bing 演示站点&#xff0c;拥有一致的 UI 体验&#xff0c;支持 ChatGPT 提示词&#xff0c;国内可用&#xff0c;国内可用&#xff…