如何理解RPC

2024-08-31 17:38
文章标签 理解 rpc

本文主要是介绍如何理解RPC,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

简述

远程过程调用(Remote Procedure Call,缩写为RPC),是一种用于构建基于C/S(客户端/服务器)的分布式应用程序技术。调用者与被调用者可能在同一台服务器上,也可能在由网络连接的不同服务器上,对于他们来说,网络通信是透明的,远程调用像本地调用一样简单。

理解

RPC就是要像调用本地函数一样去调用远程函数,要理解RPC,让我们先来看看如何完成一个本地函数的调用:

int add(int x,int y)
{return x + y;
}int a = 1;
int b = 1;
int result = add(a,b);

add函数的执行流程大致为:

  1. 分别将变量a、b的值压入栈
  2. 执行add函数,从栈中取出a、b的值赋值给x、y
  3. 计算x+y的值,并保存在栈中
  4. 退出add函数,将x+y的值赋值给result

本地过程调用发生在同一个进程,共享内存区域,但是RPC通信需要跨过不同的机器,不同的进程,因此需要解决几个问题:

  • 函数ID
  • 序列化、反序列化
  • 网络传输

函数ID

第一个需要解决的问题是如何定位函数的位置,如何告诉远程服务器调用的是哪个函数?
在本地调用中,通过函数指针来指定函数体,调用add函数,编译器会自动通过函数指针确定add函数在内存中的位置。但是在RPC中,无法通过函数指针来完成调用,因为它们的内存地址可能是完全不同的。所以调用方和被调用方同时需要维护一个{函数<->ID}的映射表,来保证调用到正确的函数。

序列化、反序列化

本地过程调用中传参是通过栈内存结构来实现的,但是RPC并不能直接使用内存来传递参数,因此传输过程中需要把参数或者返回值序列化,转化为字节流,反之为反序列化。


image.png | center | 246x224

序列化(serialization)是指将数据结构或物件状态转换成可取用格式(例如存成档案,存于缓冲,或经由网络中传送),以留待后续在相同或另一台计算机环境中,能恢复原先状态的过程。

序列化方式的优劣很大程序上影响了RPC的性能,市场上也有很多种序列化方案供选择,如何选择?可以从以下几个角度考虑:

  • 通用性:是否能支持较为复杂的数据结构,如Map等;
  • 性能:序列化所需要的时间以及所占用的空间;
  • 拓展性:是否可以很好的应对公司业务的发展。

网络传输:

函数的调用方和被调用方通常是通过网络连接的,也就是说函数ID、序列化之后的字节流都需要通过网络传输,因此并不局限于某种网络协议,只要可以完成传输即可。比如有的RPC框架使用TCP协议、有的使用HTTP。

对于Java语言来讲,使用IO相关的类库便可以完成网络编程。两种常用的通信模型:BIO与NIO,无论是哪一种模型,实现起来都比较复杂,对程序员要求较高,很有可能会出现隐藏Bug,于是便有了网络通信的编程框架。

Mina和Netty都是Java生态中非常知名的通信框架,它们出自同一个作者:Trustin Lee ,Mina诞生略早,属于Apache基金会,早年火热,如今更新缓慢;而Netty开始在Jboss名下,后来自立门户netty.io,现在大受欢迎,许多RPC框架都基于Netty实现,如阿里的dubbo。

框架

上文中,我们知道实现RPC通信需要解决三个问题,其中序列化、反序列化和网络传输实现的方式多种多样,因此市场上也有着很多种RPC框架。

国内:

  • Dubbo:阿里开源的一款高性能RPC框架,在国内应用广泛,期间停止维护过一段时间,如今又开始了更新,并且捐献给Apache基金会,孵化中;
  • Dubbox:当当团队基于Dubbo升级的一个版本,支持RESTful风格API的远程调用,基于Kryo/FST的Java高效序列化实现等功能,可直接用于生产环境;
  • Motan:新浪微博于2016年开源,“在微博平台中已经广泛应用,每天为数百个服务完成近千亿次的调用”。

国外

  • gRPC:Google开源,具有平台无关性,基于http/2协议,支持服务追踪、负载均衡、健康检查等功能;
  • Thrift:可伸缩的跨语言服务的RPC软件框架,最早由Facebook开发,2007年捐献给了Apache基金会管理,现在是Apache的顶级项目;
  • Finagle:Twitter基于Netty开发的支持容错的、协议无关的RPC框架,支撑了Twitter的核心服务。

参考

  1. RPC wiki
  2. Remote Procedure Calls (RPC)
  3. 你应该知道的RPC原理
  4. 谁能用通俗的语言解释一下什么是 RPC 框架?

这篇关于如何理解RPC的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1124564

相关文章

一文带你理解Python中import机制与importlib的妙用

《一文带你理解Python中import机制与importlib的妙用》在Python编程的世界里,import语句是开发者最常用的工具之一,它就像一把钥匙,打开了通往各种功能和库的大门,下面就跟随小... 目录一、python import机制概述1.1 import语句的基本用法1.2 模块缓存机制1.

深入理解C语言的void*

《深入理解C语言的void*》本文主要介绍了C语言的void*,包括它的任意性、编译器对void*的类型检查以及需要显式类型转换的规则,具有一定的参考价值,感兴趣的可以了解一下... 目录一、void* 的类型任意性二、编译器对 void* 的类型检查三、需要显式类型转换占用的字节四、总结一、void* 的

深入理解Redis大key的危害及解决方案

《深入理解Redis大key的危害及解决方案》本文主要介绍了深入理解Redis大key的危害及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录一、背景二、什么是大key三、大key评价标准四、大key 产生的原因与场景五、大key影响与危

深入理解C++ 空类大小

《深入理解C++空类大小》本文主要介绍了C++空类大小,规定空类大小为1字节,主要是为了保证对象的唯一性和可区分性,满足数组元素地址连续的要求,下面就来了解一下... 目录1. 保证对象的唯一性和可区分性2. 满足数组元素地址连续的要求3. 与C++的对象模型和内存管理机制相适配查看类对象内存在C++中,规

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

【C++高阶】C++类型转换全攻略:深入理解并高效应用

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C++ “ 登神长阶 ” 🤡往期回顾🤡:C++ 智能指针 🌹🌹期待您的关注 🌹🌹 ❀C++的类型转换 📒1. C语言中的类型转换📚2. C++强制类型转换⛰️static_cast🌞reinterpret_cast⭐const_cast🍁dynamic_cast 📜3. C++强制类型转换的原因📝

深入理解RxJava:响应式编程的现代方式

在当今的软件开发世界中,异步编程和事件驱动的架构变得越来越重要。RxJava,作为响应式编程(Reactive Programming)的一个流行库,为Java和Android开发者提供了一种强大的方式来处理异步任务和事件流。本文将深入探讨RxJava的核心概念、优势以及如何在实际项目中应用它。 文章目录 💯 什么是RxJava?💯 响应式编程的优势💯 RxJava的核心概念

如何通俗理解注意力机制?

1、注意力机制(Attention Mechanism)是机器学习和深度学习中一种模拟人类注意力的方法,用于提高模型在处理大量信息时的效率和效果。通俗地理解,它就像是在一堆信息中找到最重要的部分,把注意力集中在这些关键点上,从而更好地完成任务。以下是几个简单的比喻来帮助理解注意力机制: 2、寻找重点:想象一下,你在阅读一篇文章的时候,有些段落特别重要,你会特别注意这些段落,反复阅读,而对其他部分

深入理解数据库的 4NF:多值依赖与消除数据异常

在数据库设计中, "范式" 是一个常常被提到的重要概念。许多初学者在学习数据库设计时,经常听到第一范式(1NF)、第二范式(2NF)、第三范式(3NF)以及 BCNF(Boyce-Codd范式)。这些范式都旨在通过消除数据冗余和异常来优化数据库结构。然而,当我们谈到 4NF(第四范式)时,事情变得更加复杂。本文将带你深入了解 多值依赖 和 4NF,帮助你在数据库设计中消除更高级别的异常。 什么是