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函数。
到此一个远程调用就完成了。感谢阅读,望能对读者有帮助。
RPC(远程过程调用)的应用的更多相关文章
- 用C代码简要模拟实现一下RPC(远程过程调用)并谈谈它在代码调测中的重要应用【转】
转自:http://blog.csdn.net/stpeace/article/details/44947925 版权声明:本文为博主原创文章,转载时请务必注明本文地址, 禁止用于任何商业用途, 否则 ...
- [node.js]RPC(远程过程调用)的实现原理
刚接触到RPC(远程过程调用),就是可以在本地调用远程机子上的程序的方法,看到一个简单的nodejs实现,用来学习RPC的原理很不错:nodejs light_rpc 使用示例: //服务端 ...
- 译:6.RabbitMQ Java Client 之 Remote procedure call (RPC,远程过程调用)
在 译:2. RabbitMQ 之Work Queues (工作队列) 我们学习了如何使用工作队列在多个工作人员之间分配耗时的任务. 但是如果我们需要在远程计算机上运行一个函数并等待结果呢?嗯,这 ...
- RPC远程过程调用(Remote Procedure Call)
RPC,就是Remote Procedure Call,远程过程调用 远程过程调用,自然是相对于本地过程调用 本地过程调用,就好比你现在在家里,你要想洗碗,那你直接把碗放进洗碗机,打开洗碗机开关就可以 ...
- RPC远程过程调用学习之路(一):用最原始代码还原PRC框架
RPC: Remote Procedure Call 远程过程调用,即业务的具体实现不是在自己系统中,需要从其他系统中进行调用实现,所以在系统间进行数据交互时经常使用. rpc的实现方式有很多,可以通 ...
- RPC远程过程调用协议
最近学习Hadoop.Hbase.Spark及Storm原理,经常会出现RPC这样的传输术语,为了更好地理解,将知识点详细的整理下吧~ RPC-----它是一种通过网络从远程计算机程序上请求服务,而不 ...
- 浅析RPC远程过程调用基本原理
在校期间大家都写过不少程序,比如写个hello world服务类,然后本地调用下,如下所示.这些程序的特点是服务消费方和服务提供方是本地调用关系. 而一旦踏入公司尤其是大型互联网公司就会发现,公司的系 ...
- RPC远程过程调用实例
什么是RPC RPC 的全称是 Remote Procedure Call 是一种进程间通信方式.它允许程序调用另一个地址空间(通常是共享网络的另一台机器上)的过程或函数,而不用程序员显式编码这个远程 ...
- RPC远程过程调用概念及实现
RPC框架学习笔记 >>什么是RPC RPC 的全称是 Remote Procedure Call 是一种进程间通信方式. 它允许程序调用另一个地址空间(通常是共享网络的另一台机器上)的过 ...
随机推荐
- 2016 一中培训 day 5 ksum
又是一天的爆零!!!!! 原本第一题 很容易做 竟然优化过度 丢了答案 1693: ksum Time Limit 1000 ms Memory Limit 524288 KBytes Judge S ...
- Android5.0新特性——全新的动画(animation)
全新的动画 在Material Design设计中,为用户与app交互反馈他们的动作行为和提供了视觉上的连贯性.Material主题为控件和Activity的过渡提供了一些默认的动画,在android ...
- webform(内置对象)
一.内置对象 (一)Response - 响应请求对象1.定义:Response对象用于动态响应客户端请示,控制发送给用户的信息,并将动态生成响应.Response对象只提供了一个数据集合cookie ...
- OS X 在Cisco无线环境下丢包分析 part 2
part 1说到,单播的ARP请求最终都被网关丢弃了,从而造成了丢包.先说我最终怎么解决的吧,我最终把核心交换上针对无线VLAN的arp inspection和dhcp snooping删掉了,然后出 ...
- Vue表单
gitHub地址: https://github.com/lily1010/vue_learn/tree/master/lesson11 一 vue表单 实在是太简单了,直接来个例子 <!DOC ...
- Jquery easyui Tree的简单使用
Jquery easyui Tree的简单使用 Jquery easyui 是jQuery EasyUI是一组基于jQuery的UI插件集合,而jQuery EasyUI的目标就是帮助web开发者更轻 ...
- SharePoint Iframe 报错“此内容不能显示在一个框架中”<续>
在之前的SharePoint站点iframe引用中,我们遇到过下面的问题,就是其它系统或者不通环境的SharePoint站点,引用SharePoint页面会报错“此内容不能显示在一个框架中”,之前我们 ...
- 解决SharePoint 文档库itemadded eventhandler导致的上传完成后,编辑页面保持报错的问题,错误信息为“该文档已经被编辑过 the file has been modified by...”
在文档库中添加itemadded 后,在上传文件后,会自动打开文档属性的编辑页面,在保存的时候就会报错,说这个文档已经被编辑过了.这是应为默认itemadded实践是异步执行的,会在edit页面打开之 ...
- Iterator 迭代器(一)
迭代器(iterator)是一种对象,它能够用来遍历标准模板库容器中的部分或全部元素,每个迭代器对象代表容器中的确定的地址.迭代器修改了常规指针的接口,所谓迭代器是一种概念上的抽象:那些行为 ...
- 错误:升级为xcode8之后无法上网的解决方法
主要是在info.list中增加以下的节点,因为XCode开始所有的http都转为https来联网了. 添加类型为Dictionary的:NSAppTransportSecurity 再添加节点为:N ...