java RPC系列之二 HTTPINVOKER

Posted 青天流云

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java RPC系列之二 HTTPINVOKER相关的知识,希望对你有一定的参考价值。

java RPC系列之二  HTTPINVOKER

一、java RPC简单的汇总

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

二、Springhttpinvoker的配置实现

基本步骤:

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

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

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

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

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

三、Springhttpinvoker的配置实现的代码如下:

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

package com.lilin.maven.maven_intf;

/**
 * @author lilin
 * 
 */
public interface ISayHello {
    /**
     * 测试接口接口方法
     */
    void sayHello(String name);

}

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

package com.lilin.maven.maven_intf;

/**
 * @author lilin
 * 
 */
public class SayHelloService implements ISayHello {

    @Override
    public void sayHello(String name) {
        System.out.println("hello:" + name);
    }

}

3.使用spring的配置spring的httpinvoker服务,配置web.xml中的servlet,配置rmi-server.xml文件,将配置的service的bean发布为HTTP服务。

servlet配置:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    id="WebApp_ID" version="2.5">
    <display-name>SpringRMI</display-name>
    <servlet>
        <servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath*:/remote-servlet.xml</param-value>
        </init-param>
        <load-on-startup>2</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

rmi-server的配置:

<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
    <bean id="sayHello" class="com.lilin.maven.maven_intf.SayHelloService" />
    <bean name="/sayHello"
        class="org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter">
        <property name="service" ref="sayHello" />
        <property name="serviceInterface" value="com.lilin.maven.maven_intf.ISayHello" />
    </bean>
</beans>

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

<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>
    <bean id="sayHello"
        class="org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean">
        <property name="serviceUrl">
            <value>http://localhost:8080/maven-web-in/sayHello</value>
        </property>
        <property name="serviceInterface">
            <value>com.lilin.maven.maven_intf.ISayHello</value>
        </property>
    </bean>

</beans>

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

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

信息: Mapped URL path [/sayHello] onto handler ‘/sayHello‘
2016-3-29 0:38:51 org.springframework.web.servlet.FrameworkServlet initServletBean
信息: FrameworkServlet ‘Spring MVC Dispatcher Servlet‘: initialization completed in 1670 ms
2016-3-29 0:38:51 org.apache.coyote.AbstractProtocolHandler start
信息: Starting ProtocolHandler ["http-bio-8080"]
2016-3-29 0:38:51 org.apache.coyote.AbstractProtocolHandler start
信息: Starting ProtocolHandler ["ajp-bio-8009"]
2016-3-29 0:38:51 org.apache.catalina.startup.Catalina start
信息: Server startup in 5547 ms
则表示当前的发布服务成功!

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

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.lilin.maven.maven_intf.ISayHello;

/**
 * 客户端调用类
 * 
 * @author King
 * 
 */
public class Client {
    // 读取配置文件
    static ApplicationContext context = new ClassPathXmlApplicationContext(
            "remote-client-local.xml");

    public static void main(String[] args) {
        new Client().sayHello();
    }

    public void sayHello() {
        ISayHello sayHello = (ISayHello) context.getBean("sayHello");
        sayHello.sayHello("李林");
    }

}

 

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

spring的httpinvoker的使用场景:考虑网络限制,并且希望使用基于xml或者专有的java序列化机制时候哦,访问/发布基于spring的服务。

参见的是spring in action 第三版

以上是关于java RPC系列之二 HTTPINVOKER的主要内容,如果未能解决你的问题,请参考以下文章

Java实现简单的RPC框架

Java实现简单RPC框架

Java 实现简单的RPC框架

java 远程调用 RPC

Java并发编程系列之二线程基础

Java并发编程系列之二十八:CompletionService