springboot之RMI的使用
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的使用的更多相关文章
- SpringBoot里使用RMI进行远程方法调用
一.Java RMI定义 Java RMI:Java远程方法调用,即Java RMI(Java Remote Method Invocation)是Java编程语言里,一种用于实现远程过程调用的应用程 ...
- springboot+dubbo之多端口注入服务
前面介绍了,springboot+dubbo基础整合,这篇介绍多端口注入服务. springboot使用@Bean注入dubbo服务,当你是单一的ProviderConfig实例,dubbo的@Ser ...
- Docker+SpringBoot+Mybatis+thymeleaf的Java博客系统开源啦
个人博客 对于技术人员来说,拥有自己的个人博客应该是一件令人向往的事情,可以记录和分享自己的观点,想到这件事就觉得有意思,但是刚开始写博客的时候脑海中是没有搭建个人博客这一想法的,因为刚起步的时候连我 ...
- Springboot数据访问,棒棒哒!
Springboot对数据访问部分提供了非常强大的集成,支持mysql,oracle等传统数据库的同时,也支持Redis,MongoDB等非关系型数据库,极大的简化了DAO的代码,尤其是Spring ...
- JVM活学活用——优化springboot
介绍 在SpringBoot的Web项目中,默认采用的是内置Tomcat,当然也可以配置支持内置的jetty,内置有什么好处呢? 1. 方便微服务部署. 2. 方便项目启动,不需要下载Tomcat或者 ...
- SpringBoot学习之集成dubbo
一.摘自官网的一段描述 1.背景 随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进. 单一应用架构 ...
- springboot 注册dao层 service 层
可以使用三种注解来引入DAO层的接口到spring容器中.1.@Mapper,写在每一个DAO层接口上,如下: 2.@MapperScan和@ComponentScan两者之一.前者的意义是将指定包中 ...
- springboot情操陶冶-jmx解析
承接前文springboot情操陶冶-@Configuration注解解析,近期笔者接触的项目中有使用到了jmx的协议框架,遂在前文的基础上讲解下springboot中是如何整合jmx的 知识储备 J ...
- Docker和jenkins实现springboot自动部署
准备: 一个springboot项目.一台虚拟机(centos 7). 安装: linux安装docker 更新yum:yum update 下载docker: yum –y install dock ...
随机推荐
- 快速搭建一个SSM框架demo
我之所以写一个快速搭建的demo,主要想做一些容器的demo,所以为了方便大家,所以一切从简,简单的3层架构 先用mysql的ddl,后期不上oracle的ddl ; -- ------------- ...
- CoreAnimation confusion: CATransaction vs CATransition vs CAAnimationGroup?
http://stackoverflow.com/questions/14042755/coreanimation-confusion-catransaction-vs-catransition-vs ...
- jQuery 实现改变图片指定区域的颜色
javascript本身无法改变图片的颜色,不过我们可以通过一些技巧来实现一样的效果. 1.首先我们要知道图片哪些区域需要改变颜色,这里我们可以用执点地图的方法来弄 例1: <img src=& ...
- [原创] 腾讯RTX二次开发相关的一些注意事项
在企业即时通信方面,腾讯的RTX在国内的占有率应该是很高的 所以,就避免不了要与其他系统进行消息集成 腾讯为此提供了二次开发的工具包,支持JAVA.C#.VB等多种开发语言 但是,目前为止,腾讯官方提 ...
- Centos 7 安装Anaconda3
1.首先下载地址: https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/ 使用清华镜像下载速度快 2.安装 bash Anaconda3-5.1 ...
- 20165214 2018-2019-2 《网络对抗技术》Exp6 信息搜集与漏洞扫描 Week9
<网络对抗技术>Exp6 信息搜集与漏洞扫描 Week9 一.实验目标与内容 1.实践目标 掌握信息搜集的最基础技能与常用工具的使用方法. 2.实践内容 (1)各种搜索技巧的应用 使用搜索 ...
- Hibernate之openSession与getCurrentSession的区别
openSession 与 getCurrentSession的区别(1)openSession 每一次获得的是一个全新的session对象,而getCurrentSession获得的是与当前线程绑定 ...
- 最简单的Servlet继承HttpServlet查询数据库登录验证
<%-- Created by IntelliJ IDEA. User: yunqing Date: 2017-12-06 Time: 9:11 To change this template ...
- java 编写小工具 尝试 学习(三)
1.在 新建的 窗口上 添加 按钮 ,不废话 ,贴代码和 截图 package jFrameDemo; import java.awt.event.ActionEvent; import jav ...
- JavaScript Event Loop和微任务、宏任务
为什么JavaScript是单线程? JavaScript的一大特点就是单线程, 同一时间只能做一件事情,主要和它的用途有关, JavaScript主要是控制和用户的交互以及操作DOM.注定它是单线程 ...