简单了解RPC

一、RPC是什么

RPC(Remote Procedure Call Protocol)远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。远程调用意思就是:被调用方法的具体实现不在程序运行本地,而是在别的某个地方(分布到各个服务器),调用者只想要函数运算的结果却不需要了解实现函数的具体细节。也就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据。

二、RPC需要解决的问题

1、Call ID映射
?? 我们怎么告诉远程机器我们要调用funA而不是funB或者funC呢?在本地调用中函数体是直接通过函数指针来指定的,我们调用funA编译器就自动帮我们调用它相应的函数指针。但是在远程调用中函数指针是不行的,因为两个进程的地址空间是完全不一样的。
所以,在RPC中所有的函数都必须有自己的一个ID。这个ID在所有进程中都是唯一确定的。客户端在做远程过程调用时必须附上这个ID。然后我们还需要在客户端和服务端分别维护一个 {函数 <–> Call ID} 的对应表。两者的表不一定需要完全相同但相同的函数对应的Call ID必须相同。当客户端需要进行远程调用时,它就查一下这个表,找出相应的Call ID,然后把它传给服务端,服务端也通过查表,来确定客户端需要调用的函数,然后执行相应函数的代码。
如下图:

2、序列化和反序列化
??客户端怎么把参数值传给远程的函数呢?在本地调用中我们只需要把参数压到栈里,然后让函数自己去栈里读就行。但是在远程过程调用时客户端和服务端是不同的进程不能通过内存来传递参数。甚至有时候客户端和服务端使用的都不是同一种语言(比如服务端用C++,客户端用Java或者Python)。这时候就需要客户端把参数先转成一个字节流(编码),传给服务端后,再把字节流转成自己能读取的格式(解码)。这个过程叫序列化和反序列化。同理,从服务端返回的值也需要经过序列化和反序列化的过程。
为什么需要序列化?

  • 转换为字节流方便进行网络传输。
  • 实现跨平台、跨语言;如果是跨平台的序列化则发送方序列化后,接收方可以用任何其支持的平台反序列化成相应的版本,比如 Java序列化后,用.net、phython等反序列化。

3、网络传输
? 远程调用往往用在网络上,客户端和服务端是通过网络连接的。所有的数据都需要通过网络传输,因此就需要有一个网络传输层。网络传输层需要把Call ID和序列化后的参数字节流传给服务端,然后再把序列化后的调用结果传回客户端。只要能完成这两者的,都可以作为传输层使用。因此,它所使用的协议其实是不限的,能完成传输就行。尽管大部分RPC框架都使用TCP协议,但其实UDP也可以,而gRPC干脆就用了HTTP2。
4、RPC的调用流程图

三、RPC与REST的比较与区别

1、所属类别不同
? REST,是Representational State Transfer 的简写,中文描述表述性状态传递(是指某个瞬间状态的资源数据的快照,包括资源数据的内容、表述格式(XML、JSON)等信息。REST 是一种软件架构风格。这种风格的典型应用,就是HTTP。而RPC ,是 Remote Procedure Call Protocol 的简写,中文描述是远程过程调用,它可以实现客户端像调用本地服务(方法)一样调用服务器的服务(方法)。
RPC可以基于TCP/UDP,也可以基于HTTP协议进行传输的。
2、使用方式不同
从使用上来看,HTTP接口只关注服务提供方,对于客户端怎么调用并不关心。接口只要保证有客户端调用时,返回对应的数据就行了。而RPC则要求客户端接口保持和服务端的一致。REST是服务端把方法写好,客户端并不知道具体方法,客户端只想获取资源,所以发起HTTP请求,而服务端接收到请求后根据URI经过一系列的路由才定位到方法上面去,而RPC是服务端提供好方法给客户端调用,客户端需要知道服务端的具体类,具体方法,然后像调用本地方法一样直接调用它。
3、面向对象不同
从设计上来看,RPC所谓的远程过程调用是面向方法的;而REST所谓的Representational state transfer是面向资源的。

4、序列化协议不同
接口调用通常包含两个部分,序列化和通信协议。REST是基于HTTP协议,而RPC可以基于TCP/UDP,也可以基于 HTTP协议进行传输。常见的序列化协议有:json、xml、hession、protobuf、thrift、text、bytes等,REST通常使用的是JSON或者XML,而RPC使用的是JSON-RPC或者XML-RPC。

参考博文:https://blog.csdn.net/daaikuaichuan/article/details/88595202 (rpc简单易懂)
https://baijiahao.baidu.com/s?id=1637758852641939872&wfr=spider&for=pc (rpc与rest的比较理解与实现)

原文地址:https://www.cnblogs.com/jasonboren/p/12543059.html

时间: 2024-07-30 20:05:22

简单了解RPC的相关文章

利用Hadoop提供的RPC API实现简单的RPC程序

[toc] 利用Hadoop提供的RPC API实现简单的RPC程序 在Hadoop中提供了RPC服务的使用API,通过其API地使用,可以非常简单地构建远程过程调用程序,下面就给出一个简单的实例. 项目结构 为了方便操作,所有的代码都放在本地一个项目中,实际上,完全可以将代码放在不同的服务器上,这是RPC的概念,这里就不做过多的介绍.项目结构如下: rpc/ ├── HelloServiceImpl.java ├── IHelloService.java ├── RPCClientDriver

Java实现简单的RPC框架

一.RPC简介 RPC,全称为Remote Procedure Call,即远程过程调用,它是一个计算机通信协议.它允许像调用本地服务一样调用远程服务.它可以有不同的实现方式.如RMI(远程方法调用).Hessian.Http invoker等.另外,RPC是与语言无关的. RPC示意图 如上图所示,假设Computer1在调用sayHi()方法,对于Computer1而言调用sayHi()方法就像调用本地方法一样,调用 –>返回.但从后续调用可以看出Computer1调用的是Computer2

Java 实现简单的RPC框架

0 引言 RPC,全称为Remote Procedure Call,即远程过程调用,它是一个计算机通信协议.它允许像调用本地服务一样调用远程服务.它可以有不同的实现方式.如RMI(远程方法调用).Hessian.Http invoker等.另外,RPC是与语言无关的. 假设Computer1在调用sayHi()方法,对于Computer1而言调用sayHi()方法就像调用本地方法一样,调用 –>返回.但从后续调用可以看出Computer1调用的是Computer2中的sayHi()方法,RPC屏

Java 简单的RPC 实现

借用了网上某大神的例子.... 目录结构是这样的... RpcFramework 主要是两个方法.一个是暴露服务,一个为引用服务.暴露服务的主要作用是声明一个接口的实现类.可以通过socket 远程调用此方法.暴露服务 需要 端口号 和 接口实现类.... 引用服务主要是写一个本地接口,通过socket 序列化对象调用暴露的服务,也就是说,本地必须有接口,才可引用方法.引用服务需要 接口的类,主机地址 和 端口号. rpc用到的技术有3点:java多态:socket编程:java io序列流:代

一种简单的RPC框架

一 系统模型 二.数据库代码实现 1. mkdir database cd database vim dbInit.c /* * * Database Init tool * */ #include <stdio.h> #include <stdlib.h> #include <sqlite3.h> sqlite3 *db; /* * * return 0 if database can be created successfully else return -1 *

一个简单的&quot;RPC框架&quot;代码分析

0,服务接口定义---Echo.java /* * 定义了服务器提供的服务类型 */ public interface Echo { public String echo(String string); } 一,客户端代码分析--实现类:MainClient.java 客户端实现包括:获得一个代理对象,并使用该代理对象调用服务器的服务.获取代理对象时,需要指定被代理的类(相当于服务器端提供的服务名),Server IP,Port. Echo echo = RPC.getProxy(Echo.cl

一简单的RPC实例(Java)

来至于阿里liangf:如有冒犯,请原谅 RPCFrameWork: package com.sunchao.demo; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lan

一个简单RPC框架是如何炼成的(II)——制定RPC消息

开局篇我们说了,RPC框架的四个核心内容 RPC数据的传输. RPC消息 协议 RPC服务注册 RPC消息处理 下面,我们先看一个普通的过程调用 class Client(object): def __init__(self): self.remote = None ## # 内部是委托给远程remote对象来获取结果. def sayHello(self): if self.remote: return self.remote.sayHello() else : return None cla

Hadoop之RPC简单使用(远程过程调用协议)

一.RPC概述 RPC是指远程过程调用,也就是说两台不同的服务器(不受操作系统限制),一个应用部署在Linux-A上,一个应用部署在Windows-B或Linux-B上,若A想要调用B上的某个方法method(),由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语意和传达调用的参数. 楼主在接触RPC之前,用得最多的莫过于WebService.WebService可以说是在RPC发展的基础之上.RPC的协议有很多,比如最早的CORBA,Java RMI,Web Service等,又比