一。为什么需要远程过程调用RPC
为什么需要远程调用
在如何给女朋友解释什么是分布式这一篇文章中介绍过,为了提升饭店的服务能力,饭店从一开始只有一个负责所有事情的厨师发展成有厨师、切菜师、备菜师等多个角色。
在饭店只有一个厨师的时候,厨师想要做出一道美味的番茄炒蛋的时候,他需要自己洗番茄、切番茄、打鸡蛋、炒菜。整个过程不需要其他人参与自己就完全可以完成了。这就是古老的集中式应用中,一台单体计算机就可以搞定所有事情了。
制作番茄炒蛋{
厨师->洗菜->切菜->炒菜
}
随着饭店发展,需要明确分工,让专业的人负责专业的事儿。所以,整个做菜过程中不再只有厨师参与了。需要有多个角色,备菜师傅负责准备番茄和鸡蛋、切菜师傅负责切菜、厨师只要负责炒菜就行了。
但是,随着分工明确,制作番茄炒蛋的过程不再是只有一个人参与的过程了。这个过程中需要多方协作。厨师准备炒菜之前,需要先通知备菜师傅和切菜师傅,前序工作准备好之后才能进行炒菜。
制作番茄炒蛋{
备菜师->洗菜
切菜师->切菜
厨师->炒菜
}
这种情况下,厨师就要依赖很多外人来参与这个炒菜工作。而他在通知备菜师帮他洗菜,通知切菜师傅帮他切菜的时候,这个过程就是远程过程调用。
大多数情况下,一般是服务员直接到厨房下单,然后后厨有一个人员分别把菜单分发给备菜师、切菜师和厨师。
这个过程就和计算机系统很像了。如今的大型网站都是分布式部署的。拿一个下单流程来说,可能涉及到物流、支付、库存、红包等多个系统后,而多个系统又是分别部署在不同的机器上的,分别由不同的团队负责。而要想实现下单流程,就需要用到远程调用。
下单{
库存->减少库存
支付->扣款
红包->红包抵用
物流->生成物流信息
}
到底什么是远程过程调用
RPC 是指计算机 A 上的进程,调用另外一台计算机 B 上的进程,其中 A 上的调用进程被挂起,而 B 上的被调用进程开始执行,当值返回给 A 时,A 进程继续执行。调用方可以通过使用参数将信息传送给被调用方,而后可以通过传回的结果得到信息。而这一过程,对于开发人员来说是透明的。
就像后厨的例子一样,服务员把菜单传给后厨,厨师告诉备菜师和洗菜师开始工作,然后他等待他们完成工作。备菜师和洗菜师工作完之后,厨师开始炒菜。这个过程对于服务员来说其实是透明的,他不需要关心到底后厨是怎么做菜的。

由于各服务部署在不同机器上,要想在服务间进行远程调用免不了网络通信过程,服务消费方每调用一个服务都要写一坨网络通信相关的代码,不仅复杂而且极易出错。
如果有一种方式能让我们像调用本地服务一样调用远程服务,而让调用者对网络通信这些细节透明,那么将大大提高生产力,比如服务消费方在执行orderService.buy("HHKB键盘")时,实质上调用的是远端的服务。这种方式其实就是RPC。而提供了这种功能的工具我们称之为RPC框架。
在RPC框架中主要有三个角色:Provider、Consumer和Registry。如下图所示:

Server: 暴露服务的服务提供方。 Client: 调用远程服务的服务消费方。 Registry: 服务注册与发现的注册中心。
服务提供方和服务消费方都比较好理解,就是后厨的洗菜师和厨师啦。厨师就是服务消费方,洗菜师就是服务提供方。厨师依赖洗菜师提供的服务。
服务注册中心又是个什么东西呢?
其实这个也比较好理解。对于那种很大的饭店来说,厨师可能有很多(集群部署),洗菜师也有很多(集群部署)。而厨师想要洗菜师帮忙洗菜的时候,他不会直接找某个洗菜师,而是通知一个中间人,这个人可能是洗菜师团队的领导,也可能就是一个专门协调后厨的人员。他知道整个厨房有多少洗菜师,也知道哪个洗菜师今天来上班了(需要先进行服务注册)。而且,他还可以根据各个洗菜师的忙碌情况动态分配任务(负载均衡)。
这个中间人就是服务注册中心。

服务提供者启动后主动向注册中心注册机器ip、port以及提供的服务列表; 服务消费者启动时向注册中心获取服务提供方地址列表,可实现软负载均衡和Failover;
二。实现RPC需要用到的技术
一个成熟的RPC框架需要考虑的问题有很多,这里只介绍实现一个远程调用需要用到的基本技术,感兴趣的朋友可以找一些开源的RPC框架代码来看下。
动态代理
生成 client stub和server stub需要用到Java 动态代理技术,我们可以使用JDK原生的动态代理机制,可以使用一些开源字节码工具框架 如:CgLib、Javassist等。
序列化
为了能在网络上传输和接收 Java对象,我们需要对它进行序列化和反序列化操作。
可以使用Java原生的序列化机制,但是效率非常低,推荐使用一些开源的、成熟的序列化技术,例如:protobuf、Thrift、hessian、Kryo、Msgpack
NIO
当前很多RPC框架都直接基于netty这一IO通信框架,比如阿里巴巴的HSF、dubbo,Hadoop Avro,推荐使用Netty 作为底层通信框架。
服务注册中心
可选技术: Redis、Zookeeper、Consul、Etcd
开源RPC框架
Dubbo
Dubbo 是阿里巴巴公司开源的一个Java高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成。目前已经进入Apache孵化器。
Motan
Motan是新浪微博开源的一个Java RPC框架。2016年5月开源。Motan 在微博平台中已经广泛应用,每天为数百个服务完成近千亿次的调用。
gRPC
gRPC是Google开发的高性能、通用的开源RPC框架,其由Google主要面向移动应用开发并基于HTTP/2协议标准而设计,基于ProtoBuf(Protocol Buffers)序列化协议开发,且支持众多开发语言。本身它不是分布式的,所以要实现上面的框架的功能需要进一步的开发。
thrift
thrift是Apache的一个跨语言的高性能的服务框架,也得到了广泛的应用。
参考资料 :https://www.jianshu.com/p/dbfac2b876b1
来自:https://cloud.tencent.com/developer/article/1493961
分享到:
相关推荐
这个"ONCRPC.rar_ONCRPC_code rpc_onc_onc rpc"文件包含的是关于ONC RPC协议的实现代码,主要针对的是JAVA平台,旨在实现不同编程语言之间的RPC调用。 在RPC(Remote Procedure Call)机制中,客户端可以透明地调用...
RPC(Remote Procedure Call)是一种分布式计算技术,允许一个程序在一台计算机上执行远程操作,就像它在本地执行一样。在Windows环境下,RPC是系统服务的重要组成部分,广泛用于进程间通信和系统组件之间的交互。本...
RPC 服务属性按钮全部都是灰色的解决方案 解决 RPC 服务属性按钮全部都是灰色的问题是很严重的问题,但可以解决。本文将详细介绍 RPC 服务属性按钮全部都是灰色的原因和解决方案,包括手动启动“远程过程调用”服务...
RPC(Remote Procedure Call)远程过程调用是一种计算机通信协议,允许程序在一台计算机上执行另一台计算机上的程序,而无需了解底层网络协议的细节。它为开发者提供了一种透明调用远程服务的方式,使得分布式系统...
JSON-RPC(JavaScript Object Notation Remote Procedure Call)是一种轻量级的远程过程调用协议,常用于客户端-服务器通信,特别是在Web应用中。它利用JSON作为数据交换格式,因为JSON易于阅读、编写,并且对机器...
JSON-RPC(JavaScript Object Notation Remote Procedure Call)是一种轻量级的远程过程调用协议,主要用来在客户端和服务器之间进行数据交换。它的设计思想是简单、直接,以JSON(JavaScript Object Notation)作为...
LabVIEW XML-RPC 是一种基于XML的远程过程调用(RPC)技术,它允许LabVIEW应用程序与其他支持XML-RPC协议的系统进行通信。这个技术在跨平台交互和分布式系统开发中发挥着重要作用,使得LabVIEW可以与不同编程语言...
RPC(Remote Procedure Call)是一种进程间通信技术,允许在一台计算机上的程序调用另一台计算机上的程序,使得分布式系统能够像调用本地函数一样调用远程服务。在本主题中,我们将深入探讨如何使用C语言实现RPC,并...
JSON-RPC(JavaScript Object Notation Remote Procedure Call)是一种轻量级的远程过程调用协议,它使用JSON(JavaScript Object Notation)作为数据交换格式。基于JSON-RPC 1.0的C语言实现,如"jsonrpc-c-master...
"javax.xml.rpc"是Java平台中的一个关键组件,主要用于实现基于XML的远程过程调用(XML-RPC)服务。这个框架允许Java应用程序通过HTTP协议来调用远程服务器上的方法,从而实现分布式计算。在Java EE环境中,它常与...
JSON-RPC(JavaScript Object Notation Remote Procedure Call)是一种轻量级的远程过程调用协议,常用于客户端-服务器通信。在Android开发中,有时我们需要与远程服务器进行数据交互,这时JSON-RPC客户端库就显得尤...
在IT行业中,"影像RPC和GCP校正"是一个重要的图像处理领域,主要涉及遥感图像的几何校正。遥感图像(Remote Sensing Image,简称RSI)由于拍摄角度、大气条件、传感器特性等因素,往往存在几何畸变,需要进行校正以...
Java RPC(Remote Procedure Call)调用是分布式系统中常见的通信方式,它允许一个程序在不关心远程系统具体实现的情况下调用另一个网络上的程序。在这个Java RPC调用示例中,我们将探讨RPC的基本概念、实现机制以及...
RPC(Remote Procedure Call)是一种计算机通信协议,它允许程序在一个进程中执行远程计算机上的代码,就像调用本地函数一样。在本项目"RPC-code_rpc_"中,我们关注的是RPC的实现,特别是通过Thrift和RMI两种技术...
RPC(Remote Procedure Call)是一种进程间通信机制,它允许一个程序调用另一个位于不同系统上的程序,就像调用本地函数一样。NFS-RPC(Network File System - Remote Procedure Call)是基于RPC的一种特定应用,...
【rpc.rstatd】是Linux系统中用于性能监控的一个组件,它是RPC(Remote Procedure Call)协议的一部分。RPC协议是一种客户端-服务器模型,允许一个程序在一台计算机上执行远程的另一台计算机上的函数或过程,而无需...
RPC是一种远程调用的通信协议,例如dubbo、thrift等,我们在互联网高并发应用开发时候都会使用到类似的服务。本专题主要通过三个章节实现一个rpc通信的基础功能,来学习RPC服务中间件是如何开发和使用。章节内以源码...
联系web和windows 应用的软件PHPRPC. PHPRPC for Delphi 是针对 Delphi 6 - 2009 原生程序开发版本的。如果你想将 PHPRPC 用于 Delphi.NET,请参见 PHPRPC for .NET 章节的相关内容。 PHPRPC for Delphi 的安装 ...
RPC,即Remote Procedure Call(远程过程调用),是计算机网络编程中的一个重要概念,它允许一个程序在不理解底层网络协议的情况下,调用另一个网络上不同机器上的程序。在这个"RPC.rar"压缩包中,主要围绕C++语言在...