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主要是引入依赖和管理模块,不涉及任何代码

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0</modelVersion>
  6.  
  7. <groupId>com.pinnet</groupId>
  8. <artifactId>springrmi</artifactId>
  9. <version>1.0-SNAPSHOT</version>
  10.  
  11. <modules>
  12. <module>do-common</module>
  13. <module>do-client</module>
  14. <module>do-server</module>
  15. </modules>
  16.  
  17. <parent>
  18. <groupId>org.springframework.boot</groupId>
  19. <artifactId>spring-boot-starter-parent</artifactId>
  20. <version>1.5.9.RELEASE</version>
  21. </parent>
  22.  
  23. <dependencies>
  24. <dependency>
  25. <groupId>org.springframework.boot</groupId>
  26. <artifactId>spring-boot-starter-web</artifactId>
  27. <version>1.5.9.RELEASE</version>
  28. </dependency>
  29. </dependencies>
  30. </project>

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

  

  1. package com.pinnet.service;
  2.  
  3. public interface IUserService {
  4.  
  5. public String getUser(String name);
  6. }

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

  yml配置主要是改变端口

  1. server:
  2. port: 8002

  UserServiceImpl主要是实现接口的功能

  1. package com.pinnet.server;
  2.  
  3. import com.pinnet.service.IUserService;
  4. import org.springframework.stereotype.Service;
  5.  
  6. @Service
  7. public class UserServiceImpl implements IUserService {
  8.  
  9. @Override
  10. public String getUser(String name) {
  11. return "result:"+name;
  12. }
  13. }

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

  1. package com.pinnet.config;
  2.  
  3. import com.pinnet.service.IUserService;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.context.annotation.Bean;
  6. import org.springframework.context.annotation.Configuration;
  7. import org.springframework.remoting.rmi.RmiServiceExporter;
  8.  
  9. @Configuration
  10. public class RmiServer {
  11.  
  12. @Autowired
  13. private IUserService userService;
  14.  
  15. @Bean
  16. public RmiServiceExporter getRmiServiceExporter() {
  17. RmiServiceExporter rmiServiceExporter = new RmiServiceExporter();
  18. rmiServiceExporter.setServiceName("userService");
  19. rmiServiceExporter.setService(userService);
  20. rmiServiceExporter.setServiceInterface(IUserService.class);
  21. rmiServiceExporter.setRegistryPort(2002);
  22. return rmiServiceExporter;
  23. }
  24. }

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

  

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

  1. server:
  2. port: 8001

  RMIclient:配置

  1. package com.pinnet.config;
  2.  
  3. import com.pinnet.service.IUserService;
  4. import org.springframework.context.annotation.Bean;
  5. import org.springframework.context.annotation.Configuration;
  6. import org.springframework.remoting.rmi.RmiProxyFactoryBean;
  7.  
  8. @Configuration
  9. public class RmiClient {
  10.  
  11. @Bean(name = "userService")
  12. public RmiProxyFactoryBean getUserService() {
  13. RmiProxyFactoryBean rmiProxyFactoryBean = new RmiProxyFactoryBean();
  14. rmiProxyFactoryBean.setServiceUrl("rmi://127.0.0.1:2002/userService");
  15. rmiProxyFactoryBean.setServiceInterface(IUserService.class);
  16. return rmiProxyFactoryBean;
  17. }
  18. }

  调用:

  1. package com.pinnet.init;
  2.  
  3. import com.pinnet.service.IUserService;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.boot.CommandLineRunner;
  6. import org.springframework.stereotype.Component;
  7.  
  8. @Component
  9. public class UserInit implements CommandLineRunner {
  10.  
  11. @Autowired
  12. private IUserService userService;
  13.  
  14. @Override
  15. public void run(String... strings) throws Exception {
  16. System.out.println(userService.getUser("test"));
  17. }
  18. }

  展示:

  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. 关于Struts2中的ognl-2.6.11.jar和ognl-2.7.3.jar解决思路

    关于Struts2中的ognl-2.6.11.jar和ognl-2.7.3.jar建了一个简单的工程:导入的jar包有六个,包括commons-fileupload-1.2.1.jarcommons- ...

  2. ListView实现分页加载(一)制作Demo

    一.什么是分页加载 在下面的文章中,我们来讲解LitView分页加载的实现.什么是分页加载呢?我们先看几张效果图吧,如下:                                       ...

  3. grep参数说明及常用用法(转)

    转:https://www.cnblogs.com/leo-li-3046/p/5690613.html grep常用参数说明 grep [OPTIONS] PATTERN [FILE...] gre ...

  4. PHP-------MySQLi 的函数

    MySQLi 的函数 在数据库中找到一张是自增长的科目表表就可以, Code主键值是自增长的,name是varchar类型的. 如果想往科目表里添加一条数据,是自增长列的表中添加数据,添加完之后,取添 ...

  5. iOS 加载pdf格式的文件

    可以加载的方式比较多,暂时先总结两种: 本地先导入一份pdf文件 type 1: 利用UIWebView加载 UIWebView *webView = [[UIWebView alloc] initW ...

  6. heatmap for arcgisjsapi

    在arcgis for js api 环境下使用heatmap插件. 由于最新的heatmap没有提供 for arcgisjsapi  插件,懒得研究新版本代码,所以这里用的还是老版本的heatma ...

  7. C#通过拼接协议的方式来发送邮件类库

    using System; using System.Collections.Generic; using System.Net; using System.Net.Mail; using Syste ...

  8. java连接linux的三种方式(附执行命令)

    # 本地调用使用JDK自带的RunTime类和Process类实现 public static void main(String[] args){ Process proc = RunTime.get ...

  9. iOS | 解决中文乱码

    在iOS开发中,多多少少的朋友在开发的过程中,测试数据的时候可能会碰到后台打印的时候不能正确的打印出正常的汉字,打印出一些影响判断的字符,经常需要查看数组中得元素是否是自己想要的,但是苹果并没有对直接 ...

  10. ubuntu18.04安装搜狗输入法

    首先,安装Fcitx输入框架 sudo apt install fcitx 其次,上搜狗输入法官网下载Linux版本搜狗输入法(32位和64位根据自己情况,在虚拟机上用浏览器下载即可 然后进入相应的下 ...