`
dwj147258
  • 浏览: 191955 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

使用远程服务RMI和invoker

阅读更多

     如果我们需要获取当前的天气状况,我们可以通过气象局提供的一个接口并调用方法来获取,这是因为气象局发布了一个远程服务,我们可以通过接口来调用他的远程方法,获取到天气信息,一般发布并使用远程服务的有RMI ,hessian和brulap ,以及spring的invoker,他们各有优缺点, 这里只介绍RMI和spring的invoker

一、使用RMI发布一个远程服务

       首先我们需要定义一个接口,这个接口对外公开

package main.java.test.rmi;

import java.util.List;

public interface FruitService {
    List<Fruit> getFruitList();
}

 然后还需要一个接口的实现类:

package main.java.test.rmi;

import java.util.ArrayList;
import java.util.List;

public class FruitServiceImpl implements FruitService {
    public List<Fruit> getFruitList() {
        List<Fruit> list = new ArrayList<Fruit>();
        Fruit f1 = new Fruit();
        f1.setName("橙子");
        f1.setColor("黄色");
        Fruit f2 = new Fruit();
        f2.setName("苹果");
        f2.setColor("红色");
        list.add(f1);
        list.add(f2);
        return list;
    }
}

 这里用到的实体类是Fruit,实体类必须序列化

package main.java.test.rmi;

import java.io.Serializable;

public class Fruit implements Serializable {
    private String name;
    private String color;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getColor() {
        return color;
    }
    public void setColor(String color) {
        this.color = color;
    }
}

 然后就是配置了, 在spring的配置文件中配置

<!-- spring集成RMI远程服务 -->
		<bean id="messageService" class="main.java.test.rmi.MessageProviderImp"></bean>

		<bean class="org.springframework.remoting.rmi.RmiServiceExporter">
		<!-- RMI服务名称,可自定义服务名称 -->
		<property name="serviceName" value="MessageService" />
		<!-- 导出实体 -->
		<property name="service" ref="messageService" />
		<!-- 导出接口 -->
		<property name="serviceInterface" value="main.java.test.rmi.MessageProvider" />
		<!-- spring默认使用1099端口 -->
		<property name="registryPort" value="1199" />
		</bean>

 这样启动项目,这个服务就发布出去了

 

二、访问RMI远程服务

     也就是客户端访问远程服务的时候,需要在客户端的spring配置文件中配置:

<bean id="messageService" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
		<property name="serviceUrl" value="rmi://192.168.1.100:1199/MessageService" />
		<property name="serviceInterface" value="org.thera.rmi.service.MessageProvider" />
	</bean>

 这样在项目中获取这个bean强转成接口调用相应的方法就可以了

public class Main {
	public static void main(String[] args) {
		ApplicationContext ctx = new FileSystemXmlApplicationContext("conf/context.xml");
		System.out.println("加载Spring容器,并初始化RMI客户端");
		MessageProvider client = (MessageProvider)ctx.getBean("messageService");
		String temp = client.queryForMessage("LvSantorini");
		
		System.out.println("返回结果: " + temp);
	}
}

 这就是RMI发布以及调用远程服务的实例

 

三、发布spring的invoker远程服务

    invoker是spring为了解决RMI和hessian的缺陷而出现的一个服务,发布一个invoker远程服务的步骤如下,他的接口,实现类以及实体类都是采用上面定义了的接口和接口实现类

   首先,使用invoker就需要使用spring,我们使用的springmvc框架,在这里需要定义一个接口调用的url,比如我们就定义为/user.service, 这样客户端就可以通过这个url来获取服务,手下那我们需要在web中拦截到这个请求,/*包含/user.service

<servlet>  
     <servlet-name>spring</servlet-name>  
      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
       <init-param>  
            <param-name>contextConfigLocation</param-name>  
            <param-value>classpath:main/resource/spring-servlet.xml</param-value>  
        </init-param>  
      <load-on-startup>1</load-on-startup>  
  	</servlet>
 	 <servlet-mapping>  
      <servlet-name>spring</servlet-name>  
      <url-pattern>/*</url-pattern>  
  	</servlet-mapping>  
  	<context-param>  
      <param-name>contextConfigLocation</param-name>  
      <param-value>classpath:main/resource/applicationContext.xml</param-value>  
  </context-param> 

因为这个url请求不同于其他的请求,所以需要为这个请求单独处理一个bean,在mvc的配置文件中这样配置:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-3.0.xsd 
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd ">
	<!-- <mvc:resources location="/html/" mapping="/html/**"/> 
	<mvc:resources location="/js/" mapping="/js/**"/> -->
	<mvc:resources location="/" mapping="/**/*.html"/> 
	<mvc:resources location="/" mapping="/**/*.js"/>
	<mvc:resources location="/" mapping="/**/*.jsp"/>
    <context:component-scan
			base-package="main.java">
    </context:component-scan>
    <mvc:annotation-driven/>
    <bean id="userServices" class="main.java.test.rmi.FruitServiceImpl" />  
		 <bean id="userServiceInvoker"  
        class="org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter">  
        <property name="service" ref="userServices" />  
        <property name="serviceInterface" value="main.java.test.rmi.FruitService">  
        </property>  
    </bean> 
    <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">  
        <property name="mappings">    
            <props>    
                  <prop key="/user.service">userServiceInvoker</prop>    
            </props>    
        </property>    
    </bean>
    
</beans>  

  这样就远程服务就发布出去了

四、获取invoker远程服务

获取invoker远程服务就需要在spring配置文件中这样配置:

<bean id="httpService1"  
        class="org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean">  
        <property name="serviceUrl">  
            <value>http://localhost:80/user.service</value>  
        </property>  
        <property name="serviceInterface" value="main.java.test.rmi.FruitService">  
        </property>  
    </bean>

 配置服务获取bean,这样在任意地方通过

FruitService client = (FruitService)BeanUtil.getBeanByName("httpService1");
		System.out.println("invoker     "+client.getFruitList().size());

 就可以获取到服务方法了是不是很简单

五、优缺点以及问题

   rmi是一种很好的实现与远程服务交互的非常好的方式,但是他存在某些限制, 首先,他很难穿越防火墙,其次就是rmi是基于java的也就是客户端和服务端都必须采用java 开发,

  invoker是一个座位两全其美的远程调用解决方案二出现的,但是他有一个严重的限制,就是他的客户端呢服务端都必须是spring应用,也隐含的表名了客户端和服务端必须是基于java的

问题:①invoker配置urlmapping时,必须是在springmvc的配置servlet配置文件中,而不是在spring的配置文件。

 

 

 

 

0
1
分享到:
评论

相关推荐

    Spring 实现远程访问详解——rmi

    1. 远程调用RMI(Remote Method Invocation): 通过使用 RmiProxyFactoryBean 和 RmiServiceExporter,并且,Spring支持两个传统的RMI(使用 java.rmi.Remote接口和java.rmi.RemoteException)和通过RMI调用器实现的...

    Spring 实现远程访问详解——httpinvoker

    Spring httpInvoker使用标准java序列化机制,通过Http暴露业务服务。如果你的参数和返回值是比较复杂的,通过httpInvoker有巨大的优势。 1. 远程访问流程 1) 服务端定义服务接口 2) 服务端实现服务接口 3) 暴露服务...

    Jmail+ HttpInvoker+定时任务+Aop+Rmi+

    RMI的核心概念包括远程接口、远程对象和 stub/skeleton,开发者需要定义远程接口,实现远程对象,并通过RMI注册表暴露服务。RMI适合于需要高性能、低延迟的内部系统通信,例如在分布式系统中的节点间通信。 最后,...

    rmi java 远程方法调用

    - 使用stub调用远程方法,RMI系统自动处理网络通信和序列化/反序列化。 ### RMI的优点 1. **简单易用**:RMI提供了简单的API,使得开发者可以专注于业务逻辑,而不是底层的网络通信细节。 2. **类型安全**:由于...

    rmi实例(Spring整合)

    在IT行业中,远程方法调用(Remote Method Invocation,简称RMI)是Java平台提供的一种用于在分布式环境中实现对象...在实际开发中,结合源码阅读和使用工具,如IDE的调试功能,可以帮助我们更好地理解和优化RMI服务。

    springboot-httpinvoker-demo.zip

    而在微服务架构中,服务间通信是必不可少的一部分,HTTP Invoker作为Spring框架的一个组件,为Spring Boot应用提供了一种轻量级的远程方法调用(RMI)方案。本篇将深入探讨SpringBoot HTTP Invoker的原理、配置以及...

    java项目使用spring rmi所涉及到的包

    在Java项目中,Spring RMI(Remote Method Invocation)是一种整合远程方法调用功能与Spring框架的方式,它使得在分布式环境中管理对象和服务变得更加便捷。本文将深入探讨Spring RMI涉及的包,以及如何在项目中使用...

    远程调用服务框架

    通过Spring的IOC(Inversion of Control)容器,服务提供者可以在启动时自动注册服务,而服务消费者可以通过服务ID和服务接口从ServiceRepository中获取服务代理,从而实现远程调用。 总结来说,远程调用服务框架是...

    Spring HttpInvoker的封装

    而是创建一个`HttpInvokerProxyFactoryBean`,指定服务端URL和服务接口,这样就可以像调用本地方法一样调用远程服务。 ```xml &lt;bean id="myServiceProxy" class="org.springframework.remoting.httpinvoker....

    Spring(RMI)实例

    通过分析和实践这个Spring RMI实例,开发者可以学习到如何在Spring环境中设置和使用RMI,这对于理解和掌握分布式系统的设计原则,尤其是Java环境下的分布式服务实现非常有帮助。同时,这也是一个很好的起点,可以...

    Java Spring1.2 Remote Invoke HTTP Invoker

    4. **配置**:在Spring的XML配置文件中,你需要为服务提供者和服务消费者配置相应的bean。对于服务提供者,你需要指定服务接口和实现,而对于服务消费者,你需要提供服务的URL和其他相关属性。 5. **安全性**:由于...

    HttpInvoker Sample

    `HttpInvoker`则是服务端代码,一般会包含服务接口定义和服务实现。服务接口定义了对外提供的方法,而服务实现则具体实现了这些方法。服务端需要使用`HttpInvokerServiceExporter`来导出服务,这个组件会监听指定的...

    Eclipse工程Http Invoker Service & Client

    Eclipse工程Http Invoker Service & Client展示了如何在Spring框架中使用Http Invoker进行远程服务调用。通过定义服务接口,创建服务实现,并在服务端和客户端配置相应的bean,我们可以轻松地实现跨网络的Java对象...

    spring远程调用简单实例

    Spring支持多种远程调用协议,如RMI(Remote Method Invocation)、Hessian、 Burlap以及HTTP Invoker等。这些协议允许我们跨越网络边界,像调用本地方法一样调用远程服务。 在本实例中,我们关注的是HTTP Invoker...

    使用spring远程调用服务端接口实现WebService功能

    这个技术允许客户端和服务端通过HTTP协议进行通信,实现远程方法的调用,类似于RMI(Remote Method Invocation)但更具有Web友好性。下面将详细阐述Spring框架如何帮助开发者实现这一功能。 首先,我们要理解Spring...

    springRMI示例

    2. **RMI Invoker**: Spring提供了`RmiServiceExporter`,它将Spring Bean转换为RMI服务。这个组件负责暴露远程接口,并允许客户端通过RMI调用服务。 3. **客户端配置**: 客户端通过`RmiProxyFactoryBean`来创建...

    spring httpInvoker示例

    在本文中,我们将深入探讨如何使用Spring框架中的HTTP Invoker组件进行远程方法调用(RMI)的实例。HTTP Invoker是Spring框架提供的一种轻量级远程调用解决方案,它利用HTTP协议在客户端和服务端之间传输Java对象。...

    Java Spring2.5 Remote Invoke HTTP Invoker

    1. **服务端配置**:首先需要在服务端创建一个Spring配置文件,定义远程服务的bean,使用`&lt;bean&gt;`标签并配置`http-invoker-proxy-ref`属性,指定服务接口。 2. **客户端配置**:在客户端,同样需要一个Spring配置...

    java远程通讯技术及简单实现.docx

    - **四类主要组件**:构建RMI应用需要创建远程对象的本地接口、远程对象的实现、RMI客户端和RMI服务器。 - **示例代码**: ```java // 远程对象的本地接口 package test.rmi; import java.rmi.Remote; import...

    spring远程调用

    与RMI(Remote Method Invocation)相比,HttpInvoker更适合于跨越防火墙的场景,因为它使用的是标准的HTTP协议,而RMI可能被防火墙阻拦。 实现HttpInvoker的步骤主要包括以下几个部分: 1. **创建服务接口**:...

Global site tag (gtag.js) - Google Analytics