如何理解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

相关文章

深入理解go中interface机制

《深入理解go中interface机制》本文主要介绍了深入理解go中interface机制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录前言interface使用类型判断总结前言go的interface是一组method的集合,不

Java Spring的依赖注入理解及@Autowired用法示例详解

《JavaSpring的依赖注入理解及@Autowired用法示例详解》文章介绍了Spring依赖注入(DI)的概念、三种实现方式(构造器、Setter、字段注入),区分了@Autowired(注入... 目录一、什么是依赖注入(DI)?1. 定义2. 举个例子二、依赖注入的几种方式1. 构造器注入(Con

深入理解Go语言中二维切片的使用

《深入理解Go语言中二维切片的使用》本文深入讲解了Go语言中二维切片的概念与应用,用于表示矩阵、表格等二维数据结构,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录引言二维切片的基本概念定义创建二维切片二维切片的操作访问元素修改元素遍历二维切片二维切片的动态调整追加行动态

从原理到实战深入理解Java 断言assert

《从原理到实战深入理解Java断言assert》本文深入解析Java断言机制,涵盖语法、工作原理、启用方式及与异常的区别,推荐用于开发阶段的条件检查与状态验证,并强调生产环境应使用参数验证工具类替代... 目录深入理解 Java 断言(assert):从原理到实战引言:为什么需要断言?一、断言基础1.1 语

RabbitMQ工作模式中的RPC通信模式详解

《RabbitMQ工作模式中的RPC通信模式详解》在RabbitMQ中,RPC模式通过消息队列实现远程调用功能,这篇文章给大家介绍RabbitMQ工作模式之RPC通信模式,感兴趣的朋友一起看看吧... 目录RPC通信模式概述工作流程代码案例引入依赖常量类编写客户端代码编写服务端代码RPC通信模式概述在R

spring IOC的理解之原理和实现过程

《springIOC的理解之原理和实现过程》:本文主要介绍springIOC的理解之原理和实现过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、IoC 核心概念二、核心原理1. 容器架构2. 核心组件3. 工作流程三、关键实现机制1. Bean生命周期2.

深入理解Apache Kafka(分布式流处理平台)

《深入理解ApacheKafka(分布式流处理平台)》ApacheKafka作为现代分布式系统中的核心中间件,为构建高吞吐量、低延迟的数据管道提供了强大支持,本文将深入探讨Kafka的核心概念、架构... 目录引言一、Apache Kafka概述1.1 什么是Kafka?1.2 Kafka的核心概念二、Ka

深入理解Apache Airflow 调度器(最新推荐)

《深入理解ApacheAirflow调度器(最新推荐)》ApacheAirflow调度器是数据管道管理系统的关键组件,负责编排dag中任务的执行,通过理解调度器的角色和工作方式,正确配置调度器,并... 目录什么是Airflow 调度器?Airflow 调度器工作机制配置Airflow调度器调优及优化建议最

关于rpc长连接与短连接的思考记录

《关于rpc长连接与短连接的思考记录》文章总结了RPC项目中长连接和短连接的处理方式,包括RPC和HTTP的长连接与短连接的区别、TCP的保活机制、客户端与服务器的连接模式及其利弊分析,文章强调了在实... 目录rpc项目中的长连接与短连接的思考什么是rpc项目中的长连接和短连接与tcp和http的长连接短

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

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