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. hadoop fs 常用命令(1)

    Hadoop: https://blog.csdn.net/mulangren1988/article/details/54860924 Hadoop:1. Hadoop fs –fs [local ...

  2. eas之日志文件夹

    F:\ThisIs_MyWork\kingdee\eas\server\profiles\server1\logs 服务端的日志文件夹    F:\ThisIs_MyWork\kingdeecusto ...

  3. 【剑指Offer】4、重建二叉树

      题目描述:   输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列 ...

  4. vfs:结构体对象

    VFS结构体 super_block 存储一个已安装的文件系统的控制信息,代表一个已安装的文件系统:每次一个实际的文件系统被安装时, 内核会从磁盘的特定位置读取一些控制信息来填充内存中的超级块对象.一 ...

  5. Google Shell Style Guide

    转自:http://google.github.io/styleguide/shell.xml Shell Style Guide Revision 1.26 Paul Armstrong Too m ...

  6. jQuery cxCalendar 日期选择器

    简介 cxCalendar 是基于 jQuery 的日期选择器插件. 它灵活自由,你可以自定义外观,日期的范围,返回的格式等. 版本: jQuery v1.7+ jQuery cxCalendar v ...

  7. 邓_ Phpcms·二次开发

    PHPCMS V9产品介绍 PHPCMS V9(简称V9)采用PHP5+MYSQL做为技术基础进行开发.V9采用OOP(面向对象)方式进行基础运行框架搭建.模块化开发方式做为功能开发形式.框架易于功能 ...

  8. bzoj 2654 && bzoj 3675 总结

    手动博客搬家: 本文发表于20180929 15:18:55, 原地址https://blog.csdn.net/suncongbo/article/details/82897992 最近做到了两道( ...

  9. d正则表达式相关

    控件看Delphi正则表达式使用方法(TPerlRegEx)的介绍: 使用正则表达式获取Sql查询语句各项(表名.字段.条件.排序) 希望在线测试正则表达式  在线正则表达式测试 有许多常规表达式 希 ...

  10. 使用 Redis及其产品定位

    实际MySQL是适合进行海量数据存储的,通过Memcached将热点数据加载到cache,加速访问,很多公司都曾经使用过这样的架构,但随着业务数据量的不断增加,和访问量的持续增长,我们遇到了很多问题: ...