深入spring Integration集成远程调用RMI原理

背景

一、RMI 远程方法调用

  • RMI(Remote Method Invocation)远程方法调用。能够让在客户端Java虚拟机上的对象像调用本地对象一样调用服务端java 虚拟机中的对象上的方法。使用代表:EJB
  • RMI应用架构:
    深入spring Integration集成远程调用RMI原理
  • Transport Layer − 在这一层,客户端和服务端进行连接. 它用来管理已经存在的连接connection,同样也可以创建一个新的连接connection。
  • Stub − stub是远程对象在客户端的代理proxy.它驻留在客户端系统;它是客户程序的网关。
  • Skeleton − 驻留在服务端的对象. stub和skeleton进行通信,将请求发送到远程对象。
  • RRL(Remote Reference Layer) − 管理客户端到服务器的引用的一个层。

java RMI实例

服务端

pojo java Bean
深入spring Integration集成远程调用RMI原理
服务,继承了Remote接口
深入spring Integration集成远程调用RMI原理
服务实现继承了UnicastRemoteObject,可以实现服务发布功能。
深入spring Integration集成远程调用RMI原理
服务器
深入spring Integration集成远程调用RMI原理

客户端

pojo java Bean
深入spring Integration集成远程调用RMI原理
服务,继承了Remote接口
深入spring Integration集成远程调用RMI原理
客户端测试
深入spring Integration集成远程调用RMI原理
此时,客户端打印

服务端返回的的信息为:succes

服务端打印

Order{item='davidwang', qty=456, orderDate=2020-07-17T13:58:45.464}

小结

java rmi 服务通过实现Remote接口来具有提供rmi的功能,真实的服务实现了UnicastRemoteObject接口,使之具有发布服务的功能,最后使用LocateRegistry注册和Naming服务来绑定服务。

Spring RMI实例

服务端

pojo javaBean
深入spring Integration集成远程调用RMI原理
服务
深入spring Integration集成远程调用RMI原理
服务实现
深入spring Integration集成远程调用RMI原理
启动服务端
深入spring Integration集成远程调用RMI原理
RmiServiceExporter(服务端,使用UnicastRemoteObject.exportObject()发布)

客户端

pojo javaBean
深入spring Integration集成远程调用RMI原理
服务
深入spring Integration集成远程调用RMI原理
测试类
深入spring Integration集成远程调用RMI原理
RmiProxyFactoryBean(客户端,自动调用getObject()方法获取代理类)
此时服务端打印:

create order: Order{item='davidwang', qty=456, orderDate=2020-07-17T14:20:59.274}

客户端打印:

org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
org.springframework.context.event.internalEventListenerProcessor
org.springframework.context.event.internalEventListenerFactory
rmiClientTest
exporter
spring rmi返回结果:Order{item='davidwang', qty=456, orderDate=2020-07-17T14:20:59.274}

小结

spring 封装了java rmi的实现,在服务端使用RmiServiceExporter来发布服务,客户端使用RmiProxyFactoryBean来获取服务。

深入Spring RMI原理

分别从服务端RmiServiceExporter和客户端RmiProxyFactoryBean来分析

服务端RmiServiceExporter

RmiServiceExporter实现了InitializingBean,在bean初始化时,实现了afterPropertiesSet方法。具体实现直接引用prepare()方法。
深入spring Integration集成远程调用RMI原理
1.RmiInvocationWrapper继承自Remote,包装了接口服务
深入spring Integration集成远程调用RMI原理
等同于接口实现了Remote接口。
2.Registry
深入spring Integration集成远程调用RMI原理
使用LocateRegistry.getRegistry方法获取Registry
3.使用jdk的UnicastRemoteObject的exportObject()方法,共有六种使用方式:

  • UnicastRemoteObject()
  • UnicastRemoteObject(int)
    • UnicastRemoteObject(int, RMIClientSocketFactory, RMIServerSocketFactory)
  • exportObject(Remote)
  • exportObject(Remote, int)
  • exportObject(Remote, int, RMIClientSocketFactory, RMIServerSocketFactory)
    其中第四种已经过期。

    客户端RmiProxyFactoryBean

    客户端RmiProxyFactoryBean继承自RmiClientInterceptor,通过实现InitializingBean的afterPropertiesSet()方法,具体的实现在prepare方法。
    深入spring Integration集成远程调用RMI原理
    支持Naming方式和stub方式
    深入spring Integration集成远程调用RMI原理

总结

一、RMI容易和RPC弄混。

二、RPC 远程过程调用

  • RPC(Remote Procedure Call Protocol)远程过程调用协议,通过网络从远程计算机上请求调用某种服务。它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。使用代表:Dubbo
    深入spring Integration集成远程调用RMI原理

    三、RMI与RPC的区别

  • 1、方法调用方式不同:RMI调用方法,RMI中是通过在客户端的Stub对象作为远程接口进行远程方法的调用。每个远程方法都具有方法签名。如果一个方法在服务器上执行,但是没有相匹配的签名被添加到这个远程接口(stub)上,那么这个新方法就不能被RMI客户方所调用。RPC调用函数,RPC中是通过网络服务协议向远程主机发送请求,请求包含了一个参数集和一个文本值,通常形成“classname.methodname(参数集)”的形式。这就向RPC服务器表明,被请求的方法在“classname”的类中,名叫“methodname”。然后RPC服务器就去搜索与之相匹配的类和方法,并把它作为那种方法参数类型的输入。这里的参数类型是与RPC请求中的类型是匹配的。一旦匹配成功,这个方法就被调用了,其结果被编码后通过网络协议发回。
  • 2、适用语言范围不同:RMI只用于Java,支持传输对象。RPC是基于C语言的,不支持传输对象,是网络服务协议,与操作系统和语言无关。
    深入spring Integration集成远程调用RMI原理
  • 3、调用结果的返回形式不同:RMI是面向对象的,Java是面向对象的,所以RMI的调用结果可以是对象类型或者基本数据类型。RPC的结果统一由外部数据表示(External Data Representation,XDR)语言表示,这种语言抽象了字节序类和数据类型结构之间的差异。只有由XDR定义的数据类型才能被传递,可以说RMI是面向对象方式的Java RPC。

猜你喜欢

转载自blog.51cto.com/15015181/2556236
今日推荐