RPC(远程过程调用)的应用

接触背景

因为工作上某项目的需要设计一种分布式处理耗时的运算,每个节点然后将运算结果返回给中心服务器,而最初未了解RPC这部分之前我的设计是在每一个RPC服务器上搭建一个webserver,然后部署运算的service在上面,用json的方式通讯,这样肯定是可以实现的,但是部署极其麻烦又让webserver大材小用还会增加其它脚本语言或者框架的依赖。

之前也是有听说RPC,我当初也只是以为是一种概念,且需要自己实现的一种远程过程调用,没想到发现有大量现成的库已经做好了包装,让你远程调用就像本地一样使用那么方便。

RPC介绍

RPC全称叫Remote Procedure Call,中文叫远程过程调用,它是一种通过网络从一台计算机向另一台远程计算机上所写的模块上请求服务,一般是函数调用形式,而不需要自己实现底层变量类型转换数据再传输等网络技术的协议。

优点

使用者无需关注各个服务器之间调用所需的网络协议部分(比如tcp分包重传、http的参数协议制定),可以把更多的精力花在业务功能逻辑上,特别适合应用在分布式服务器上。

缺点

安全性一直是RPC的弊病,因为此协议一般没有用于验证调用者机制,如果把它直接替代简单的CURD并暴露给外部用户使用可能会很快被黑客利用。所以一般应用在企业内网或者设定防火墙ACL或者由远程计算机自行判断IP。

RPC实例(Python)

各种不同的语言对此都有自己的不同解决方案。比如Unix下,C可以用SUNRPC,Java则可使用RMI来处理。
Python同样也提供了一个基于XMLRPC的解决方案,用法非常简单:
首先,就像在编写普通的程序那样子编写你的模块或函数。
接着使用xmlrpc.server模块运行XMLRPC服务器,并且设定绑定IP和Port,以及注册服务器暴露出去的函数。
最后,在客户端内使用xmlrpc.client连接到服务器,想要调用服务器的函数像在本地的函数一样直接调用注册过的函数名即可。

XMLRPC server code:

# -*- coding:utf-8 -*-
from xmlrpc.server import SimpleXMLRPCServer
from socketserver import ThreadingMixIn

class ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):
    pass

def add(x, y):
    return x + y

if __name__ == ‘__main__‘:
    #rpc_server = SimpleXMLRPCServer((‘0.0.0.0‘, 8848)) #使用这个会让add函数始终只能同时处理一件事,必须等前一件事情做完才能接新任务
    rpc_server = ThreadXMLRPCServer((‘0.0.0.0‘, 8848)) #支持异步并行接受任务
    rpc_server.register_function(add, "add")
    rpc_server.serve_forever()

XML RPC client code:

# -*- coding:utf-8 -*-
import xmlrpc.client

if __name__ == ‘__main__‘:
    rpc_client = xmlrpc.client.ServerProxy("http://127.0.0.1:8848")
    print( rpc_client.add(3,4) )
    print( rpc_client.add("a+","b=c") )

首先启动Server端代码,再启动Client代码,即可得到输出的7、a+b=c结果,说明成功透过RPC远程调用add函数。

到此一个远程调用就完成了。感谢阅读,望能对读者有帮助。

时间: 2025-01-07 03:29:20

RPC(远程过程调用)的应用的相关文章

RPC远程过程调用协议

最近学习Hadoop.Hbase.Spark及Storm原理,经常会出现RPC这样的传输属于,为了更好地理解,将知识点详细的整理下吧~ RPC-----它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据. 简要工作原理 (1)调用客户端句柄,执行传入参数 (2)调用本地系统内核发送网络信息 (3)消息传送到远程主机 (4)服务器句柄得到消息并取得参数 (5)执行远程过程 (6)执行的过程将结果

Hadoop RPC远程过程调用源码解析及实例

什么是RPC? 1.RPC(Remote Procedure Call)远程过程调用,它允许一台计算机程序远程调用另外一台计算机的子程序,而不用去关心底层的网络通信细节,对我们来说是透明的.经常用于分布式网络通信中. 2.Hadoop的进程间交互都是通过RPC来进行的,比如Namenode与Datanode之间,Jobtracker与Tasktracker之间等. RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据.在OSI网络通信模型中, RPC跨越了传输层和应用层

回顾:RPC远程过程调用协议

先看看来自百度的这个图,最终可以归纳为这10个步骤. 1.调用客户端句柄:执行传送参数 2.调用本地系统内核发送网络消息 3.消息传送到远程主机 4.服务器句柄得到消息并取得参数 5.执行远程过程 6.执行的过程将结果返回服务器句柄 7.服务器句柄返回结果,调用远程系统内核 8.消息传回本地主机 9.客户句柄由内核接收消息 10.客户接收句柄返回的数据 版权声明:

RPC的发展历史(本质就是双方定义好协议,传递参数后远程调用)

服务器通讯原理就是一台socket服务器A,另一台socket客户端B,现在如果要通讯的话直接以流方式写入或读出. 这样能实现通讯,但有个问题.如何知道更多信息?比如需要发送流大小,编码,Ip等. 这样就有了协议,协议就是规范,就是发送的流中携带了很多的内容. RPC的实现就是一种规范.可参考http://javatar.iteye.com/blog/1123915 这个简单RPC实现. RPC(远程过程调用)是什么 简单的说,RPC就是从一台机器(客户端)上通过参数传递的方式调用另一台机器(服

RPC源码阅读-客户端

Hadoop版本Hadoop2.6 RPC主要分为3个部分:(1)交互协议(2)客户端(3)服务端 (2)客户端 先展示RPC客户端实例代码 public class LoginController { public static void main(String[] args) throws IOException { //获取RPC LoginServiceInterface协议接口的代理对象 LoginServiceInterface proxy= RPC.getProxy(LoginSe

webservice restful rpc

webservice: 上世纪90年代流行的分布式技术,如DCOM,CORBA,RMI,范式是RPC,但各系统数据类型不一致,实现/调用机制不同,各系统间互通不可能.XML的出现,让数据类型一致了,SOAP的出现,让各系统可以相互调用了.Simple Object Access Protocol的原意是XML-RPC,但人们很快就发现方法调用太狭隘,而消息传递更加通用.WSDL即支持rpc/encoded也支持document/literal,但前者已成为历史遗留.webservices是soa

Samba的ADS域模式和RPC域模式

对于Samba服务器,有两种域安全模式,加入到Windows 2000或者Windows 2003域控制器(DC‘s)控制的域中: RPC 模式 RPC(远程过程调用)模式的域成员是"NT4"样式的域成员,可以在/etc/samba/smb.conf中通过security=domain设定. 只要域控制器运行在混合模式下,Samba的基于RPC的域成员代码更加成熟和稳定可以很好地与Windows2000/2003域控制器工作.混合模式是Windows2000/2003域控制器的默认运行

Hadoop中的RPC机制

1.  RPC--远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据.在OSI网络通信模型中,RPC跨越了传输层和应用层.RPC使得开发包括网络分布式多程序在内的应用程序更加容易. 2.  RPC采用客户机/服务器模式.请求程序就是一个客户机,而服务提供程序就是一个服务器.首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息.在服务器端,进程保持睡眠状

j2ee 分布式布署 RPC基础知识

一.什么是RPC     远程过程调用(RPC)是一个协议,程序可以使用这个协议使用网络中另一个服务器中某程序的服务,而不需要知道网络细节 二.RPC模型     .  c/s模式     .  基于传输层协议,例如(tcp/ip) .  事件处理模型(请求.计算.响应) 三.RPC设计的目的 . 调用非本机的方法 . 不同语言之间的通讯 . 不需要了解底层通讯机制,像调用本机方法一样调用远程序服务 四.RPC的作用 . 分布式程序的基础(分布式操作系统.分布式计算.分布式软件设计)