毕业设计(论文)-远程过程调用技术与实现.doc_第1页
毕业设计(论文)-远程过程调用技术与实现.doc_第2页
毕业设计(论文)-远程过程调用技术与实现.doc_第3页
毕业设计(论文)-远程过程调用技术与实现.doc_第4页
毕业设计(论文)-远程过程调用技术与实现.doc_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

盐城师范学院毕业设计 盐 城 师 范 学 院毕业设计远程过程调用技术与实现学生姓名 学 院 信息工程学院 专 业 计算机科学与技术 班 级 学 号 指导教师 2016年5月16日5远程过程调用技术与实现摘 要远程过程调用(Remote Procedure Calls,RPC)是设计一个分布式系统,并通过分布式系统,实现程序跨计算机运行。传统的过程调用以本地调用居多,然而这种过程调用结构在互联网日益发展的今天,缺陷也越来越明显。本课题所研究的远程过程调用,恰好可以解决本地调用过程存在的一系列弊端,我们可以通过远程调用方法充分利用非共享内存的多处理器环境。其作用是使本地系统上的进程能够激活远程系统上的进程,从而调用远程系统上的功能。本平台是将Netty技术代替传统的通信技术,Netty提供异步的、事件驱动的网络应用程序框架和工具可以快速的处理Socket。另外,本平台所开发的远程方法调用是采用Google Protobuf技术,Protobuf是Google的开源技术,其功能类似xml。课题研究的目的是为了将这两种技术结合起来,提升远程方法调用的性能,降低编程复杂性,提高资源利用率。 【关键词】分布式应用;Netty;Protobuf全套设计加扣 3012250582Remote Procedure Call Technology and RealizationAbstractRemote Procedure Calls(RPC) is to design a distributed system ,this system can make procedure run across different computers. The traditional call mainly use local resource.However, this call structure method becoming more and more defective in modern times. This paper put forward a method which can handle this shadow. Our method can take advantage of the non-shared memory multiprocessor environment。Its purpose is to make the procedure which on the local system to activate the procedure on the remote system and call the function on the remote system.This plantform use Netty technology instead of traditional communication technologies. Netty can provide the application framework and tools which are asynchronous and event-driving. And it can process socket quickly. Another method is Google protobuf. Protobuf is open source technology of Google. And its function like XML. The purpose of this research is to combine these two technologies .So that we can enchance the performance of RPC。It also can reduce programming complexity and improve programming efficiency at the same time.Keywords Distributed Applications, Netty, protobuf目 录1 引言11.1 研究背景11.2 研究意义11.3 课题研究的目标22 系统开发介绍22.1 开发环境介绍22.1.1 软件环境22.1.2 硬件环境32.2 技术支持介绍32.2.1 项目管理工具Maven32.2.2 数据传输技术Protobuf32.2.3 通信技术Netty33 需求分析53.1 系统要求53.2 远程过程调用RPC基本说明53.3 远程调用体系结构84 系统设计94.1 远程调用方法的原理94.2 远程方法的实现94.3 功能示例124.4 扩展性功能145 结语15参考文献16致 谢171 引言1.1 研究背景远程过程调用(Remote Procedure Calls,RPC)是通过分布式系统,实现程序跨计算机运行。在本地过程调用(Local Proce dure Call, LPC)中,开发人员必须在本地主机中编译过程,并且该过程也只能局限在本地运行。简而言之,本地调用的关系就是主程序与过程之间的运行关系。这种过程调用结构在这个技术不断更新的信息时代,缺陷也越发明显,其调用模式不能充分利用网络上其他主机的资源,同时还要被很多区域的局限性所限制。本课题所研究的远程过程调用,恰好可以解决LPC所存在的一系列弊端。在操作数值过大,而本地客户机计算能力有限无法负担,计算能力强的服务器又不在本地的情况下,可以通过远程过程调用利用服务器资源,减轻客户端的运算负担。表1-1是远程过程调用和本地过程调用的比较:表1-1远程过程调用与本地过程调用的比较远程过程调用本地过程调用由客户程序激活;请求参量压缩为数据包调用模块执行过程调用发送请求,并将服务器程序中的参量拆包跳转子过程服务器上的参量被拆包并将其传递到服务器的子过程参量从栈装载到子过程的局部变量或寄存器在服务器上执行请求(过程)执行子过程代码将结果打包并返回给提出请求的客户结果和子过程的返回值被存贮在寄存器中由客户将结果拆包,继续执行正常的程序调用的过程访问数据1.2 研究意义远程过程调用(Remote Procedure Calls,RPC)是将本地过程调用的概念加以扩充,然后引入分析式环境的一种形式。建立RPC服务之后,客户端的调用参数打包后通过远程过程调用的粘合服务器传到骨干程序中,骨干程序根据传输后的数据拆包信息分析确定所要调用的过程。与远程调用方法(Remote Method Invocation ,RMI)不同,本项目主要使用的技术是Google protobuf以及Netty。研究的目的是为了将这两种技术结合起来,从而提升远程方法调用的性能,提高计算机资源利用率,解决现阶段过程调用的不足之处。RPC跟RMI相比,单在性能上方面就有很大的提高。首先,RPC与RMI相比在代码量变小的同时,效率却提高很多,调用速度与执行效率都远远高于传统的远程调用方法;其次远程调用的核心技术是通信,所以数据的安全很重要,本平台通过对代码管理方式的改革,确保了数据的安全性。综上所述,RPC的平台运用,不仅能使开发人员的编码工作变得简单,也能确保数据通信的安全1。1.3 课题研究的目标通过技术的改进和代码的不断优化,本课题所研究的远程过程调用平台跟传统的远程调用平台相比,不管是序列化还是反序列化,运用protobuf的RPC与运用xml的RMI相比,在时间开销和空间开销上,都有很大程度上的优化。在以后的工作生活中,可以减少操作人员的运作时间,简单易用.另外跟LPC相比,RPC减少了不必要的内存拷贝,从而减少了不必要的资源浪费。希望通过本平台的应用可以解决传统调用方法的不足,并能更加充分的利用其它服务器上的闲置资源,简化开发人员的编码工作。同时可以确保其他计算机使用者在区域的限制下,不影响工作的进度,在本地就可以准确高效的调用其他场所的资源。在整个调用过程,本平台可以确保通信数据的安全性,使所有使用者放心的调用其它服务器的过程。2 系统开发介绍2.1 开发环境介绍2.1.1 软件环境操作平台:Windows 平台服务器:IIS 6IDE:Eclipse + Maven2.1.2 硬件环境处理器:Intel(R) Core(TM) i7RAM:16GB2.2 技术支持介绍2.2.1 项目管理工具MavenMaven是一个项目管理工具,其支持的持续化集成测试 (Continuous Integration) 是避免项目后期风险的有效方法。另外,Maven可以自动生成报告,程序员检阅方便。使用Maven管理方式的项目,其代码安全性能更高,清晰的代码更新版号,可确保后期工作人员不会发生代码版本混淆的错误。使用Maven之前,需了解Maven的打包规则,在开发的时候,开发人员可以根据需要引入对应的引用。当开发人员在编写测试代码时,可以通过Maven的测试代码覆盖率分析插件了解到这些测试代码可覆盖的有用代码的范围,甚至还可以告诉您每个类里面哪些语句没有被覆盖到等信息。因此,通过使用Maven的代码管理方式不仅可以省去许多繁琐无技术含量的工作,还能在确保代码安全的前提下,提高编程效率。2.2.2 数据传输技术ProtobufProtobuf是一个开源框架,其作为一个结构化信息传递的工具,在本平台中,它的主要作用就是在两台设备各自的进程之间结构化信息传递。Protobuf的工作方法相对简单,首先将需要串行化的数据信息在特定的文件中进行定义,这里面每一个信息都是一小段逻辑记录以及一系列的键值对。Protobuf在java中的作用其实跟xml差不多,然而protobuf比xml拥有更多更高级的串行化结构数据的特性,因而跟xml相比,protobuf效率高,性能好,Protobuf在反序列化上与xml相比性能更有优势,时间开销以及空间开销都远远小于xml2。Protobuf的代码生成机制也省去了开发人员很多时间。总而言之,protobuf跟xml相比有以下几个优点:1.更简单,代码量比xml小3到10倍,protobuf信息的表示很紧凑,所以其代码体积也很小。2.运行速度快20到100倍,由于protobuf反序列的效率比xml高,所以速度更快。 3.更少的歧义,自己定义的数据结构可以通过使用代码生成器生成的代码来读取3。2.2.3 通信技术Netty远程过程调用支持存储于不同地址空间的对象之间彼此进行通信,被调用的进程能够及时作出反馈,使远程对象工作起来像是本地对象。其原理是通过网络技术将不同系统构成一个整体,因此通信技术是本课题的核心技术。跟其他的网络应用程序框架相比,Netty的文档更清晰,更新周期也更短,新版本的发布也比较快,技术不断提高,不易淘汰。Netty有统一的API,本平台在过程调用时能根据实际需求设置阻塞和非阻塞两种调用方式,之所以能设置是因为Netty可适用于不同的协议的特性。Netty还具有以下几个特性:1. 基于灵活、可扩展的事件驱动模型;2.高度可定制的线程模型;3.可靠的无连接数据Socket支持(UDP)。因而运用了Netty技术的远程调用平台,跟远程方法调用相比,有更好的吞吐量,更低的延迟,更高的资源利用率,并且能做到尽可能的减少不必要的内存拷贝。另外Netty有完整的SSL/TLS和STARTTLS的支持,安全指数更高,能在Applet与Android的限制环境下稳定运行。同时,使用了Netty的RPC不会因为过快或者过慢、超负载连接导致内存错误4。本文如下图2-1所示,将Netty的通信技术结合到远程过程调用中的:客户端传入参数并向服务器发送请求,服务器端接收到请求后,分析其数据包,调用所指定的过程,执行所指定的过程,返回执行结果,并将执行结果发送到客户端,客户端接收到结果值之后,再继续执行下一个过程。图2-1 RPC通信图3 需求分析3.1 系统要求远程过程调用(Remote Procedure Calls,RPC)主要目的是为了实现过程跨计算机运行。使本地系统上的进程能够激活远程系统上的进程,从而调用远程系统上的功能,操作起来如同本地调用一样自如。如有大量数值需要操作,而客户端无法负担的时候,就可以通过RPC将这些数值分布在处理能力更加强的服务器上运行。如下图3-1 RPC功能模块图所示,客户端需要通过本地过程调用将数据包传至stub过程,stub过程打包后传到查询粘合服务器,粘合服务器接收查询后,注册服务器,并将数据包传到相应的服务器中,服务器进行拆包分析,根据其需求,进行本地工过程调用,调用后执行该过程,返回结果,将结果打包,传输到客户端,客户端进行拆包,取得结果,执行本地过程的下一步。图3-1 RPC功能模块图3.2 远程过程调用RPC基本说明远程过程调用概述:RPC是一种把过程调用的概念扩充后再引入到分析式环境的一种形式,远程过程调用的形式类似方法调用,主要区别于被调用的过程运行的场所跟调用者所在的实际场所不同,即调用者在A电脑上调用B电脑上的过程,该过程实际运行于B电脑所在的场所。如图3-2所示,传统的过程调用,是调用者在场所A通过主程序调用本地过程,远程方法调用是调用者在场所A调用场所B的过程,并且该过程运行在场所B,运行结果最后再返回给调用者。所以,远程调用的实现需要设计一个软件来实现两者之间的通信与连接,这也正是RPC产生的必然性。图 3-2 RPC过程调用示意图远程过程调用的实现首先要解决两个问题:(1) 远程过程调用执行时,调用者必须能定位出被调用的过程实际运行的场所。(2) 假设调用者在场所A,被调用者在场所B,场所A跟场所B在远程调用执行时,必须能能合作通信。因此要求场所B对用户来说是透明的。下图是实现远程调用的方法以及思想。如3-3RPC的实现概况图所示,用户在客户端编写调用代码,传到stub过程中,stub将其进行数据打包,传到RPC运行程序中,RPC运行程序将数据包拆解,分析数据信息,调用相应的服务器过程,服务器端运行完成后,将结果传至stub端打包发送到客户端,客户端将结果拆包,传到调用代码处,进行下一步运行。图3-3 RPC的实现概况图其中服务器端已经有相应的过程,客户端输入参数调用服务器中已经编写好的过程,该过程执行完成后返回结果至客户端。如果开发人员要添加新的过程,可以根据自身的需求在服务器端进行编写。另外,过程调用的时候可以根据过程运行的实际情况设置阻塞与非阻塞,以提高调用效率,避免资源浪费。图3-4是远程过程调用示意图。图3-4 远程过程调用示意图 3.3 远程调用体系结构远程调用体系结构:RPC为远程对象生成客户端代理和服务器端代理。位于客户端的类称为计算客户端(CalculatorClient),位于服务器端的类称为计算服务端(CalculatorServer),该系统在服务器端编写了几个计算方法以测试系统的性能。 当客户机远程调用过程时,相当于调用CalculatorClient,CalculatorClient通过编组(Marshaling)把过程调用中的参数转换成可以在网络上传输的数据格式,经远程引用层和传输层向下,以包的形式传递给服务器,然后再次经传输层,向上穿过远程调用层和CalculatorServer,CalculatorServer负责拆解打包的数据,恢复过程调用中的参数,传入服务器端的过程。CalculatorServer利用过程调用,访问RPC实现类,RPC实现类进行相应的处理,并将返回值返回CalculatorServer,CalculatorServer对返回值进行编组,通过网络传输到客户机上。CalculatorClient再对收到的返回值进行分解,最后把分解后的返回值送给客户机应用。图3-5就是远程调用方法的体系架构图图3-5 体系结构图4 系统设计4.1 远程调用方法的原理(1) 客户端发起请求的时候,请求转交至远程调用方法RPC客户端的CalculatorClient类;(2) CalculatorClient类将请求的信息进行序列化;(3) 通过使用Protobuf技术将数据序列化的流传到服务器端;(4) 服务器端接收到流后根据解析的数据包传至相应的CalculatorServer类;(5) CalculatorServer类将请求的信息反序列化后调用实际的处理类;(6) 计算类处理完毕后将结果返回给CalculatorServer类;(7) CalculatorServer类将结果序列化,通过Protobuf将流传送给客户端的CalculatorClient;(8) CalculatorClient在接收到结果后反序列化,并将反序列化后的结果再返回给调用者。综上,创建一个远程方法调用应用的主要步骤,如下:(1) 创建远程接口:继承tobuf.MessageOrBuilder接口。(2) 创建远程类:实现远程接口。(3) 使用RPC程序生成远程实现所需的存根和框架(4) 创建服务器程序:负责在注册表中注册远程对象。(5) 创建客户程序:负责定位远程对象,并且调用远程对象的方法。4.2 远程方法的实现(1) 创建远程接口以下例程是Service接口的源程序。在这个接口中声明了Calculator()方法package tobuf.example;public final class Calculator private Calculator() public static void registerAllExtensions( Ctobuf.ExtensionRegistry registry) public interface CalcRequestOrBuilder extends / protoc_insertion_point(interface_extends:CalcRequest) tobuf.MessageOrBuilder (2) 创建远程类远程类即远程对象所属的类。RPC规范要求远程类必须实现对应的相关的远程接口。另外,远程类的构造方法必须声明抛出RemoteException。远程类必须继承tobuf.Messaget类,Messaget类让客户机与服务器对象实例建立一对一的连接。以下例程是CalcService接口的源程序。在这个接口中声明了add()方法。关键代码如下:Public class CalculatorServiceImpl implements Calculator.CalcService.Interface, Calculator.CalcService.BlockingInterface private static final Logger logger = Logger.getLogger(CalculatorServiceImpl.class);public void add(RpcController controller, CalcRequest request,RpcCallback done) CalcResponse response = null;try response = add(controller, request); catch (ServiceException e) if (done != null) done.run(response); else / Since no callback registered, might as well spit out the/ answer here otherwise well never know what happenedif (response = null)(Error occured);(Answer is: + response.getResult();(3) 编写服务器端程序创建服务器程序关键代码如下:package tobuf.example;import tobuf.example.Calculator.CalcService;import zh.brook.dxy.server.NRpcServer;public class CalculatorServer public static void main(String args) NRpcServer server = new NRpcServer(8888);server.registerService(CalcService.newReflectiveService(new CalculatorServiceImpl();server.registerBlockingService(CalcService.newReflectiveBlockingService(new CalculatorServiceImpl();server.start();(4) 编写客户端程序在例程CalculatorClient类的main()方法中,先获得远程对象的存根对象,然后测试它所属的类,接着调用它的远程方法,在CalcRequest.newBuilder().setOp1(20).setOp2(35).build()中输入参数20和35,然后调用sever中的计算。关键代码如下:public class CalculatorClient public static void main(String args) NRpcClient client = new NRpcClient(localhost, 8888);NRpcChannel channel = client.blockingConnect(localhost, 8888);Stub calcService = CalcService.newStub(channel);BlockingInterface blockingCalcService = CalcService.newBlockingStub(channel);final RpcController controller = channel.newController();CalcRequest request = CalcRequest.newBuilder().setOp1(20).setOp2(35).build();图4-1是本文要创建的RPC应用的类框图。其中HelloService是一个远程接口,它继承了java.rmi.Remote接口,HelloServiceImpl类实现了该接口,并且继承了java.rmi.server.UnicastRemoteObject类。SimpleClient和SimpleServer类分别是客户程序和服务器程序。图4-1 RPC应用的类框图4.3 功能示例在服务器端写入计算方法,如果需要添加什么方法都在此处设计,本平台主要提供的是一个调用平台,所有功能都需要使用者根据自己的需求在服务器后台自己添加,例如下图所示的Add方法:public void add(RpcController controller, CalcRequest request,RpcCallback done) CalcResponse response = null;try response = add(controller, request); catch (ServiceException e) if (done != null) done.run(response); else / Since no callback registered, might as well spit out the/ answer here otherwise well never know what happenedif (response = null)(Error occured);(Answer is: + response.getResult();在客户端调用服务器的方法,在CalcRequest.newBuilder()中输入参数20和35,然后调用sever中的计算。public class CalculatorClient public static void main(String args) NRpcClient client = new NRpcClient(localhost, 8888);NRpcChannel channel = client.blockingConnect(localhost, 8888);Stub calcService = CalcService.newStub(channel);BlockingInterface blockingCalcService = CalcService.newBlockingStub(channel);final RpcController controller = channel.newController();CalcRequest request = CalcRequest.newBuilder().setOp1(20).setOp2(20).build();/ no blockingcalcService.add(controller, request, new RpcCallback() public void run(CalcResponse response) if (response != null) System.out.println(The answer is: + response.getResult(); else System.out.println(Oops, there was an error: + controller.errorText(););运行后所得到的结果:传入的参数分别是20,35其中id号为1的是客户端,它远程调用的服务器名为CalcService,远程调用的过程名为Add,阻塞情况选择的是非阻塞,返回结果为55。id号为2的是服务器端,服务器名字为CalcService,被调用的方法为Add,非阻塞模式。开发人员在id为2的客户端上可以调用id为1的服务器上面的Add方法。本地系统上的进程能够激活远程系统上的进程,从而调用远程系统上的功能。以上是一个test的例子,用来验证本平台的可行性,后续可以根据此核心技术,将平台的内容以及功能向外扩展。4.4 扩展性功能本平台在核心代码处设置阻塞与非阻塞两种调用形式,可以根据过程调用的具体情况自行设置,从而提高远程调用运行效率。在计算机资源充足且运行的过程相对重要的情况下可以设置成阻塞模式。若资源紧张,则可设置成非阻塞模式,在非阻塞模式下,如果当前过程不能得到结果,则撤销当前线程,避免资源浪费。关键代码如下:if(isBlockingService)BlockingService blockingService = blockingServiceMap.get(serviceName);if(blockingService=null)throw new NoSuchServiceException(request,serviceName);else if(blockingService.getDescriptorForType().findMethodByName(methodName)=null)throw new NoSuchServiceMethodException(request, methodName);else if(!request.hasId()throw new NoRequestIdException();5 结语本课题所研究的远程过程调用是根据现阶段的过程调用的现状为前提开发而成的,在网络无处不在的今天,执行效率和信息安全越发重要,本地过程调用虽然安全,但资源利用率较低,并且它有区域的限制,它调用的过程只能局限在本地,如果操作的数据值过大,本地的客户端可能就因为无法负担而导致运行失败,这是一个大数据的时代,因而也注定了本地调用是无法独立支撑数据处理的。这也是本课题开发远程过程调用的根本原因。RPC其实是一个Client/Server模型,调用过程即本地程序片称为RPC Client,被调用过程(即远程程序片)称为RPC Server。RPC的实现不仅是大大减少了开发人员的工作量,其实对每个计算机的使用者来说都会带来很多便利,有的时候因为地域的限制或者计算机性能的约束,很多文件或工作不能在本地完成,但是到其他区域,又耗时劳财,这个时候RPC的出现就能完美的解决这个问题了。本课题所开发的远程过程调用主要是提供了一个平台,使用者可以根据自己的需求来添加功能,换而言之,RPC是在服务器和客户器之间进行通信和信息传递时提供了一种机制,在该机制下,客户端的过程可以通过调用服务器端的对象来获取远程数据。RPC针对本地过程调用(Local Procedure Call, LPC)以及远程方法调用(Remote Method Invocation )的弊端进行技术上的改进,它使开发人员更容易地调用远程程序同时又确保了数据的安全,使得调用过程在两者之间取得了平衡。由于环境有限以及有些领域我个人还没能充分掌握,所以本课题所开发的远程过程调用所有的功能添加都需要开发人员在后台自行编写,并且其主要也是提供给开发人员使用的,还没有推广到每一个计算机使用者都能轻松使用。不过在后续的工作中,我会继续完善。参考文献1 郭海川,分布式流式计算系统中消息传递中间件的设计与实现,2015.2 高静,段会川.JSON 数据传输效率研究.计算机

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论