Spring rmi

Spring RMI 性能优化文章

http://hi.baidu.com/huxiaohang/item/f6f4803e6fa21c0eceb9fec6


(1)RMI的基本体系结构,概括起来说,由三个抽象层组成:

  1、存根/框架层(Stubs/Skeletons Layer)

  RMI为我们引入了两种特殊类型的对象,称为存根(Stub)和框架(Skeleton),它们组成了RMI的第一层。

   在远程通信的时候,要利用TCP/IP协议,做很多底层数据的打包传输。运用Java技术,我们先要把数据或者对象转换成字节流(byte stream),便于网络传输,这个过程叫汇集(marshaling);当收到远程传来的字节流后,我们要把流信息转换成对象或者数据,这个过程叫解读 (unmarshaling),它与汇集刚好相反。

  Stub和Skeleton层位于实际应用程序之下,建立在Proxy(代理)设 计方案之上。Stub类的作用是远程服务器实现的代理的角色,Stub是客户方对象;Skeleton类用于帮助对象通过RMI链接与Stub通信,它从 链路中读取方法调用的参数,向远程服务实现对象进行调用,接受返回值,然后再把返回值写回到Stub。

  2、远程引用层(Remote Reference Layer)

  远程引用层定义和支持着RMI连接的调用语义(semantics)。

   RMI进行远程访问要用到JRMP(Java Remote Method Protocol,即Java远程方法协议),这一层提供专用于JRMP的RemoteRef对象,它位于java.rmi.server包内,代表着远 程对象的一个句柄。RemoteRef使用远程引用来执行远程对象的一个远程方法调用。

  3、传输层(Transport Layer)

  传输层在JVM之间建立基于流的网络连接,并且负责设置和管理这些连接。这时候,RMI使用一种线级(wire-level)协议进行基于TCP/IP的连接,该协议就是Java远程方法协议(JRMP,即Java Remote Method Protocol)。


(2)spring rmi协议在远程调用的时候其实要传递的信息有2类:

1.元数据:你所要调用的方法的定位信息。

2.用户数据:你调用方法的入口参数。

而信息1就是org.springframework.util.ClassUtils.RemoteInvocation类的methodName和parameterTypes这2个实例变量。

客户端包装一个RemoteInvocation对象,发送给服务器。服务器通过methodName和parameterTypes可以定位service的一个方法。然后反射调用方法,将调用结果返回客户端,一次远程调用就完成了。而导致Spring rmi性能问题的就是parameterTypes实例变量。如远程服务需要传递int类型的参数,则传递之前需要先转成Integer(因为Integer对象实现了Serializable接口),到服务端后再转回int类型,这个过程耗时很多。可将接口的参数类型改为Integer来减少类型转换耗时。


你可能感兴趣的:(Spring rmi)