1、RMI 指的是远程方法调用 (Remote Method Invocation)。它是一种机制,能够让在某个 Java虚拟机上的对象调用另一个 Java 虚拟机中的对象上的方法。可以用此方法调用的任何对象必须实现该远程接口。调用这样一个对象时,其参数为 "marshalled" 并将其从本地虚拟机发送到远程虚拟机(该远程虚拟机的参数为 "unmarshalled")上。该方法终止时,将编组来自远程机的结果并将结果发送到调用方的虚拟机。如果方法调用导致抛出异常,则该异常将指示给调用方。

  2、从我了解RMI开始,我就觉得他和DUBBO的方式差不多,只是dubbo加入了中间件来做管理。RMI在实用性上面还是很不错的。说白了RMI就是像调用本地方法一样调用远程的方法。

  3、这里我写了一个demo,主要是了解RMI的实现过程和配置的方式,spring的xml配置方式可以参考我的这个方式来实现。

  4、目录结构,为了方便,我这边采用模块的形式来写入

  

  5、父模块springrmi的pom.xml主要是引入依赖和管理模块,不涉及任何代码

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>com.pinnet</groupId>
<artifactId>springrmi</artifactId>
<version>1.0-SNAPSHOT</version> <modules>
<module>do-common</module>
<module>do-client</module>
<module>do-server</module>
</modules> <parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.RELEASE</version>
</parent> <dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>1.5.9.RELEASE</version>
</dependency>
</dependencies>
</project>

  6、公共模块do-common这个主要是提供两方共同调用的接口,不涉及业务实现

  

package com.pinnet.service;

public interface IUserService {

    public String getUser(String name);
}

  7、RMIserver,这块主要是提供RMI服务,供远程调用

  yml配置主要是改变端口

server:
port: 8002

  UserServiceImpl主要是实现接口的功能

package com.pinnet.server;

import com.pinnet.service.IUserService;
import org.springframework.stereotype.Service; @Service
public class UserServiceImpl implements IUserService { @Override
public String getUser(String name) {
return "result:"+name;
}
}

  主要就是相关配置:主要是建立RMI服务。

package com.pinnet.config;

import com.pinnet.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.remoting.rmi.RmiServiceExporter; @Configuration
public class RmiServer { @Autowired
private IUserService userService; @Bean
public RmiServiceExporter getRmiServiceExporter() {
RmiServiceExporter rmiServiceExporter = new RmiServiceExporter();
rmiServiceExporter.setServiceName("userService");
rmiServiceExporter.setService(userService);
rmiServiceExporter.setServiceInterface(IUserService.class);
rmiServiceExporter.setRegistryPort(2002);
return rmiServiceExporter;
}
}

  8.RMIclient:客户端主要是调用服务,像调用本地一样

  

  yml:主要是改变端口防止占用

server:
port: 8001

  RMIclient:配置

package com.pinnet.config;

import com.pinnet.service.IUserService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.remoting.rmi.RmiProxyFactoryBean; @Configuration
public class RmiClient { @Bean(name = "userService")
public RmiProxyFactoryBean getUserService() {
RmiProxyFactoryBean rmiProxyFactoryBean = new RmiProxyFactoryBean();
rmiProxyFactoryBean.setServiceUrl("rmi://127.0.0.1:2002/userService");
rmiProxyFactoryBean.setServiceInterface(IUserService.class);
return rmiProxyFactoryBean;
}
}

  调用:

package com.pinnet.init;

import com.pinnet.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component; @Component
public class UserInit implements CommandLineRunner { @Autowired
private IUserService userService; @Override
public void run(String... strings) throws Exception {
System.out.println(userService.getUser("test"));
}
}

  展示:

  9、RMI的远程调用方式,很简单也很使用。这个在DUBBO的暴露接口,服务实现的通过zookeeper来注入的过程原理很像。

  所以RMI在使用过程中的实用程度还是很高的。本篇博客仅供参考,如有不对,还请指出。

  10、源码下载:https://pan.baidu.com/s/1p4DE6oQH_KmCf8ijqZdMQQ

springboot之RMI的使用的更多相关文章

  1. SpringBoot里使用RMI进行远程方法调用

    一.Java RMI定义 Java RMI:Java远程方法调用,即Java RMI(Java Remote Method Invocation)是Java编程语言里,一种用于实现远程过程调用的应用程 ...

  2. springboot+dubbo之多端口注入服务

    前面介绍了,springboot+dubbo基础整合,这篇介绍多端口注入服务. springboot使用@Bean注入dubbo服务,当你是单一的ProviderConfig实例,dubbo的@Ser ...

  3. Docker+SpringBoot+Mybatis+thymeleaf的Java博客系统开源啦

    个人博客 对于技术人员来说,拥有自己的个人博客应该是一件令人向往的事情,可以记录和分享自己的观点,想到这件事就觉得有意思,但是刚开始写博客的时候脑海中是没有搭建个人博客这一想法的,因为刚起步的时候连我 ...

  4. Springboot数据访问,棒棒哒!

    Springboot对数据访问部分提供了非常强大的集成,支持mysql,oracle等传统数据库的同时,也支持Redis,MongoDB等非关系型数据库,极大的简化了DAO的代码,尤其是Spring ...

  5. JVM活学活用——优化springboot

    介绍 在SpringBoot的Web项目中,默认采用的是内置Tomcat,当然也可以配置支持内置的jetty,内置有什么好处呢? 1. 方便微服务部署. 2. 方便项目启动,不需要下载Tomcat或者 ...

  6. SpringBoot学习之集成dubbo

    一.摘自官网的一段描述 1.背景 随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进. 单一应用架构 ...

  7. springboot 注册dao层 service 层

    可以使用三种注解来引入DAO层的接口到spring容器中.1.@Mapper,写在每一个DAO层接口上,如下: 2.@MapperScan和@ComponentScan两者之一.前者的意义是将指定包中 ...

  8. springboot情操陶冶-jmx解析

    承接前文springboot情操陶冶-@Configuration注解解析,近期笔者接触的项目中有使用到了jmx的协议框架,遂在前文的基础上讲解下springboot中是如何整合jmx的 知识储备 J ...

  9. Docker和jenkins实现springboot自动部署

    准备: 一个springboot项目.一台虚拟机(centos 7). 安装: linux安装docker 更新yum:yum update 下载docker: yum –y install dock ...

随机推荐

  1. 快速搭建一个SSM框架demo

    我之所以写一个快速搭建的demo,主要想做一些容器的demo,所以为了方便大家,所以一切从简,简单的3层架构 先用mysql的ddl,后期不上oracle的ddl ; -- ------------- ...

  2. CoreAnimation confusion: CATransaction vs CATransition vs CAAnimationGroup?

    http://stackoverflow.com/questions/14042755/coreanimation-confusion-catransaction-vs-catransition-vs ...

  3. jQuery 实现改变图片指定区域的颜色

    javascript本身无法改变图片的颜色,不过我们可以通过一些技巧来实现一样的效果. 1.首先我们要知道图片哪些区域需要改变颜色,这里我们可以用执点地图的方法来弄 例1: <img src=& ...

  4. [原创] 腾讯RTX二次开发相关的一些注意事项

    在企业即时通信方面,腾讯的RTX在国内的占有率应该是很高的 所以,就避免不了要与其他系统进行消息集成 腾讯为此提供了二次开发的工具包,支持JAVA.C#.VB等多种开发语言 但是,目前为止,腾讯官方提 ...

  5. Centos 7 安装Anaconda3

    1.首先下载地址: https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/ 使用清华镜像下载速度快 2.安装 bash Anaconda3-5.1 ...

  6. 20165214 2018-2019-2 《网络对抗技术》Exp6 信息搜集与漏洞扫描 Week9

    <网络对抗技术>Exp6 信息搜集与漏洞扫描 Week9 一.实验目标与内容 1.实践目标 掌握信息搜集的最基础技能与常用工具的使用方法. 2.实践内容 (1)各种搜索技巧的应用 使用搜索 ...

  7. Hibernate之openSession与getCurrentSession的区别

    openSession 与 getCurrentSession的区别(1)openSession 每一次获得的是一个全新的session对象,而getCurrentSession获得的是与当前线程绑定 ...

  8. 最简单的Servlet继承HttpServlet查询数据库登录验证

    <%-- Created by IntelliJ IDEA. User: yunqing Date: 2017-12-06 Time: 9:11 To change this template ...

  9. java 编写小工具 尝试 学习(三)

    1.在 新建的 窗口上  添加  按钮  ,不废话 ,贴代码和 截图 package jFrameDemo; import java.awt.event.ActionEvent; import jav ...

  10. JavaScript Event Loop和微任务、宏任务

    为什么JavaScript是单线程? JavaScript的一大特点就是单线程, 同一时间只能做一件事情,主要和它的用途有关, JavaScript主要是控制和用户的交互以及操作DOM.注定它是单线程 ...