rpc原理与应用

news/2025/6/5 14:58:00
  • IPC和RPC?

RPC

RPCRemote Procedure Call),又叫做远程过程调用。它本身并不是一个具体的协议,而是一种调用方式

gRPC 是 Google 最近公布的开源软件,基于最新的 HTTP2.0 协议,并支持常见的众多编程语言。

HTTP2.0 是基于二进制的 HTTP 协议升级版本,目前各大浏览器都在快马加鞭的加以支持。

这个 RPC 框架是基于 HTTP 协议实现的,底层使用到了 Netty 框架的支持。

Dubbo 是阿里集团开源的一个极为出名的 RPC 框架,在很多互联网公司和企业应用中广泛使用。协议和序列化框架都可以插拔是及其鲜明的特色。

同样的远程接口是基于 Java Interface,并且依托于 Spring 框架方便开发。可以方便的打包成单一文件,独立进程运行,和现在的微服务概念一致。

Thrift 是 Facebook 的一个开源项目,主要是一个跨语言的服务开发框架。它有一个代码生成器来对它所定义的 IDL 定义文件自动生成服务代码框架。

用户只要在其之前进行二次开发就行,对于底层的 RPC 通讯等都是透明的。不过这个对于用户来说的话需要学习特定领域语言这个特性,还是有一定成本的。

什么是RPC

RPC【Remote Procedure Call】是指远程过程调用,是一种进程间通信方式,他是一种技术的思想,而不是规范。它允许程序调用另一个地址空间(通常是共享网络的另一台机器上)的过程或函数,而不用程序员显式编码这个远程调用的细节。即程序员无论是调用本地的还是远程的函数,本质上编写的调用代码基本相同。

也就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据。为什么要用RPC呢?就是无法在一个进程内,甚至一个计算机内通过本地调用的方式完成的需求,比如不同的系统间的通讯,甚至不同的组织间的通讯,由于计算能力需要横向扩展,需要在多台机器组成的集群上部署应用。RPC就是要像调用本地的函数一样去调远程函数;

推荐阅读文章:https://www.jianshu.com/p/2accc2840a1b

RPC基本原理

图片

stub可以理解为存根

  • **客户端存根,**存放服务端的地址消息,再将客户端的请求参数打包成网络消息,然后通过网络远程发送给服务方。
  • 服务端存根,接收客户端发送过来的消息,将消息解包,并调用本地的方法。

一般包括客户端、服务器端、服务注册中心

**◎客户端存根:**用于存放服务器端的地址信息,将客户端的请求参数等信息打包成网络消息,再通过网络传输发送给服务器端。

**◎服务器端存根:**接收客户端发送过来的请求消息并解包,然后调用本地服务处理。

存根之间通过网络传输

同步调用和异步调用

这个过程有点类似于 Java 中的 Callable 和 Runnable 接口,我们进行异步执行的时候,如果需要知道执行的结果,就可以使用 Callable 接口,并且可以通过 Future 类获取到异步执行的结果信息。并提前写上对结果的操作逻辑。

如果不关心执行的结果,直接使用 Runnable 接口就可以了,因为它不返回结果,当然啦,Callable 也是可以的,我们不去获取 Future 就可以了。

步骤解析:

图片

RPC两个核心模块:通讯,序列化。

RPC主要基于TCP/IP

IDL:接口描述语言

调用方法=方法名+参数+返回值

RPC 框架的好处就显示出来了,首先就是长链接,不必每次通信都要像 HTTP 一样去 3 次握手什么的,减少了网络开销。

其次就是 RPC 框架一般都有注册中心,有丰富的监控管理;发布、下线接口、动态扩展等,对调用方来说是无感知、统一化的操作。

gRPC

gRPC 是 Google 最近公布的开源软件,基于最新的 HTTP2.0 协议,并支持常见的众多编程语言。底层使用到了 Netty 框架的支持。

服务端:

监听端口,注册服务,启动服务器

客户端:

调用函数,传参数,接收返回值

客户端只有接口,用动态代理的方式实例化接口,在invoke方法中获取方法名等信息发给服务端

proto文件(IDL)

框架:

自定义RPC协议

header+body

RPC IO 优化

任何服务都是类似的,大量请求过来时,得用线程池、异步、协程等各种手段优化,提高并发,从而提高吞吐,减小延迟。

有的 RPC 框架能解决这些问题,比如有些 RPC 框架内置协程模型,支持 M 比 N 模型、协程窃取等等。如果 RPC 框架不管,就需要用额外的线程池库、异步库(promise、future)、协程库来手动控制请求的执行流并发执行。

文章来源:https://blog.csdn.net/qq_44915801/article/details/134897808
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:https://dhexx.cn/news/show-5177730.html

相关文章

【解密考研英语:Python数据分析与可视化】

解密考研英语:Python数据分析与可视化 背景数据集技术选型功能实现创新点 大家好,欢迎阅读我的CSDN博客!今天我将分享一项有关考研英语真题的数据分析与可视化项目,希望对考研学子提供更有针对性的复习帮助。 背景 作为考研学子…

元素定位,年轻人在 Web UI 自动化成长道路上吃的第一个亏

01/Katalon Studio 的 Web spy spy 英文翻译过来的意思是:间谍、密探。是具有监视意识的。 所以我们可以使用这个功能去监视 Web 元素并定位出来。具体操作如下:1,打开 Katalon 并创建好项目工程 2,在快捷键栏里点击 Web spy 如…

Java面试遇到的一些常见题

目录 1. Java语言有几种基本类型,分别是什么? 整数类型(Integer Types): 浮点类型(Floating-Point Types): 字符类型(Character Type): 布尔类…

【Linux】:线程(二)互斥

互斥与同步 一.线程的局部存储二.线程的分离三.互斥1.一些概念2.上锁3.锁的原理4.死锁 一.线程的局部存储 例子 可以看到全局变量是所有线程共享的,如果我们想要每个线程都单独访问g_val怎么办呢?其实我们可以在它前面加上__thread修饰。 这就相当于把g…

我的创作纪念日——一年

机缘 初心始于对技术的热爱和分享知识的渴望。最初,我在一次练习中遇到了一些问题,通过解决这些问题并将解决方案记录下来,我意识到分享经验对自己和他人都非常有价值。于是,我开始在博客和社交平台上记录日常学习过程、撰写技术…

重心坐标:定义、公式与应用

重心坐标(Barycentric Coordinates)在 CG 中尤为重要。 它们有一些功能,是 Mller-Trumbore 提出的下一个射线三角形相交算法的关键,该算法将在下一章中研究。 本章最后将讨论如何在 CG 中使用重心坐标。 NSDT工具推荐:…

[陇剑杯 2021]简单日志分析

[陇剑杯 2021]简单日志分析 题目做法及思路解析(个人分享) 问一:某应用程序被攻击,请分析日志后作答: 黑客攻击的参数是______。(如有字母请全部使用小写)。 题目思路: 分析…

pytest +uiautomator2+weditor app自动化从零开始

目录结构1.0 把设备连接单独移出去了 模块操作代码,有一些流程操作和断言方法 from devices import dv from time import sleep import random from tool.jt import capture_screenshotdef initialization(func):def wrapper():sleep(1)dv.app_stop(com.visteon.…

【STM32】TIM定时器编码器

1 编码器接口简介 Encoder Interface 编码器接口 编码器接口可接收增量(正交)编码器的信号,根据编码器旋转产生的正交信号脉冲,自动控制CNT自增或自减,从而指示编码器的位置、旋转方向和旋转速度 接收正交信号&#…

解密QQ号——C语言

题目: 有一串已加密的数字“6 3 1 7 5 8 9 2 4”解密规则:首先将第1个数字删除,紧接着将第2个数字放到这串数字的末尾,再将第3个数字删除并将第4个数字放到这串数字的末尾,再将第5个数删除 代码实现: #inc…