java RPC系列之一    rmi

一、java RPC简单的汇总

  java的RPC得到技术,基本包含以下几个,分别是:RMI(远程方法调用) 、Caucho的Hessian 和 Burlap 、Spring的基于HTTP的远程服务、以及使用JAX-RPC和JAX-WS的Web服务。本文主要介绍一下RMI的基本的配置实现,当然,是基于Spring集成的。后面会继续使用Spring的HTTP的方式实现远程调用实现。

二、RMI的基于Spring的配置实现

  基本步骤:

      1.定义好服务端需要提供的接口方法(客户端调用的接口)

      2.定义好服务端的实现代码

      3.使用spring配置服务端,发布服务到制定端口

      4.使用spring配置客户端的代理bean

      5.定义好服务端和客户端调用的测试代码。

三、RMI的基于Spring的配置实现的代码如下:

      1.定义好IRmiService 接口类,服务端和客户端都需要的接口类。

package com.lilin.maven.service.rmi;

/**
* @author lilin
*
*/
public interface IRmiService {
/**
*
* @param name
* @return
*/
String sayHello(String name);
}

  2.定义好服务端的实际实现代码RmiService。

package com.lilin.maven.service.rmi;

/**
*
* @author lilin
*
*/
public class RmiService implements IRmiService { @Override
public String sayHello(String name) {
return "Hello " + name;
} }

  3.使用spring的配置rmi服务,配置rmi-server.xml文件,发布rmi服务到制定的1199端口。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="rmiService" class="com.lilin.maven.service.rmi.RmiService" />
<bean class="org.springframework.remoting.rmi.RmiServiceExporter">
<property name="serviceName" value="rmiService" />
<property name="service" ref="rmiService" />
<property name="serviceInterface" value="com.lilin.maven.service.rmi.IRmiService" />
<property name="registryPort" value="1199" />
</bean>
</beans>

  4.使用spring配置客户端的代理bean,配置rmi-client.xml,把远程的服务方法配置为bean,可以方便注入。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="rmiService" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
<property name="serviceUrl" value="rmi://localhost:1199/greetService" />
<property name="serviceInterface" value="com.lilin.maven.service.rmi.IRmiService" />
</bean>
</beans>

 5.定义好服务端和客户端调用的测试代码,首先启动服务端,发布服务,然后启动测试端代码调用远程服务。

     服务端:启动server后,可以看到如下信息:

信息: Looking for RMI registry at port '1199'
2016-3-27 23:48:38 org.springframework.remoting.rmi.RmiServiceExporter prepare
信息: Binding service 'rmiService' to RMI registry: RegistryImpl_Stub[UnicastRef [liveRef: [endpoint:[192.168.1.105:1199](remote),objID:[0:0:0, 0]]]]

则表示当前的发布服务成功!

package com.lilin.maven.service.rmi;

import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
* @author lilin
*
*/
public class Server {
public static void main(String[] args) {
new ClassPathXmlApplicationContext("/config/spring/rmi-server.xml");
}
}

 客户端:获取client配置的bean,直接调用远程服务方法,可以得到正确结果如下:

package com.lilin.maven.service.rmi;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; /**
* @author lilin
*
*/
public class Client {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext(
"config/spring/rmi-client.xml");
IRmiService service = context.getBean("rmiService", IRmiService.class);
System.out.println(service.sayHello("李林"));
} }

测试结果如下:

信息: Loading XML bean definitions from class path resource [config/spring/rmi-client.xml]
2016-3-27 23:48:49 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
信息: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@1e13d52: defining beans [rmiService]; root of factory hierarchy
Hello 李林

到此简单的rmi远程服务调用,基于spring的配置就全部结束了,值得注意的是:

rmi使用场景:不考虑网络限制(防火墙),访问/发布基于java的服务。参见的是spring in action 第三版

java RPC系列之一 rmi的更多相关文章

  1. java RPC系列之二 HTTPINVOKER

    java RPC系列之二  HTTPINVOKER 一.java RPC简单的汇总 java的RPC得到技术,基本包含以下几个,分别是:RMI(远程方法调用) .Caucho的Hessian 和 Bu ...

  2. Java自带RPC实现,RMI框架入门

    Java自带RPC实现,RMI框架入门 首先RMI(Remote Method Invocation)是Java特有的一种RPC实现,它能够使部署在不同主机上的Java对象进行通信与方法调用,它是一种 ...

  3. NetCore Netty 框架 BT.Netty.RPC 系列随讲 二 WHO AM I 之 NETTY/NETTY 与 网络通讯 IO 模型之关系?

    一:NETTY 是什么? Netty 是什么?  这个问题其实百度上一搜一堆. 这是官方话的描述:Netty 是一个基于NIO的客户.服务器端编程框架,使用Netty 可以确保你快速和简单的开发出一个 ...

  4. 转载-- http接口、api接口、RPC接口、RMI、webservice、Restful等概念

     http接口.api接口.RPC接口.RMI.webservice.Restful等概念 收藏 Linux一叶 https://my.oschina.net/heavenly/blog/499661 ...

  5. java io系列06之 序列化总结(Serializable 和 Externalizable)

    本章,我们对序列化进行深入的学习和探讨.学习内容,包括序列化的作用.用途.用法,以及对实现序列化的2种方式Serializable和Externalizable的深入研究. 转载请注明出处:http: ...

  6. Java IO系列之四:NIO通信模型

    分布式rpc框架有很多,比如dubbo,netty,还有很多其他的产品.但他们大部分都是基于nio的, nio是非阻塞的io,那么它的内部机制是怎么实现的呢. 1.由一个专门的线程处理所有IO事件,并 ...

  7. Java IO系列之一:IO

    1. 概述 Java IO一般包含两个部分: 1.java.io包中堵塞型IO: 2.java.nio包中的非堵塞型IO,通常称为New IO. java.io包下,分为四大块近80个类: 1.基于字 ...

  8. RPC框架之RMI

     一:RPC 远程过程调用 RPC(Remote Procedure Call Protocol)远程过程调用协议,通过网络从远程计算机上请求调用某种服务. 一次RPC调用的过程大概有10步: 1.执 ...

  9. rpc 协议规范 之 rmi http webservice 和 一些框架

    RPC(Remote Procedure Call)是远程调用,是一种思想,也是一种协议规范.简单地说就是能使应用像调用本地方法一样的调用远程的过程或服务,可以应用在分布式服务.分布式计算.远程服务调 ...

随机推荐

  1. SQL语句注意得问题

    1/不要使用count(列明)或count(常量)来替代count(*),count(*)是SQL92定义得标准统计行数得语法,跟数据库无关,跟NULL和非NULL无关. 说明:count(*)会统计 ...

  2. List分组的两种方式

    java8之前List分组 假设有个student类,有id.name.score属性,list集合中存放所有学生信息,现在要根据学生姓名进行分组. public Map<String, Lis ...

  3. [系统资源]port range

    ip_local_port_range 端口范围 sysctl Linux中有限定端口的使用范围,如果我要为我的程序预留某些端口,那么我需要控制这个端口范围, 本文主要描述如何去修改端口范围. /pr ...

  4. [frontend] 根据文字长度 自适应宽度 自适应高度+ Uncaught ReferenceError: xxx is not defined at HTMLDivElement.onclick

    CSS一行代码就可以解决第一个问题: 1.1 根据文字长度,自适应标签宽度 解决方法:把width的设置删掉,加一行代码 display:table; .tag-footdetail{  /*widt ...

  5. 三剑客基础详解(grep、sed、awk)

    目录 三剑客基础详解 三剑客之grep详解 1.通配符 2.基础正则 3.grep 讲解 4.拓展正则 5.POSIX字符类 三剑客之sed讲解 1.sed的执行流程 2.语法格式 三剑客之Awk 1 ...

  6. 虚拟机pycharm

    一.进入虚拟机Ubuntu软件查找pycharm专业版进行安装 二.进入https://www.jetbrains.com/pycharm/download/#section=linux 下载Linu ...

  7. 论vue项目api相关代码的组织方式

    论vue项目api相关代码的组织方式 看了下项目组同事的代码,发现不同项目有不同的组织版本 版本一: ├─apis │ a.api.js │ b.api.js │ b.api.js │ d.api.j ...

  8. 20190218-学习python使用shelve遇到raise error, "db type could not be determined"

    照书上敲代码,运行了提示raise error, "db type could not be determined",现场如下: ubuntu-vm:~/code/massageb ...

  9. 1 java开发工具IDEA的使用

    IntelliJ IDEA 2017.1汉化破解版安装图文教程(附汉化补丁) 注册码:http://idea.lanyus.com/  点击在线生成 IntelliJ IDEA 2017.1正式版发布 ...

  10. MySQL 复制 - 性能与扩展性的基石:概述及其原理

    原文:MySQL 复制 - 性能与扩展性的基石:概述及其原理 1. 复制概述 MySQL 内置的复制功能是构建基于 MySQL 的大规模.高性能应用的基础,复制解决的基本问题是让一台服务器的数据与其他 ...