java RPC系列之二 HTTPINVOKER
一、java RPC简单的汇总
java的RPC得到技术,基本包含以下几个,分别是:RMI(远程方法调用) 、Caucho的Hessian 和 Burlap 、Spring的基于HTTP的远程服务、以及使用JAX-RPC和JAX-WS的Web服务。本文主要介绍spring的httpinvoker的基本的配置实现。
二、Spring的httpinvoker的配置实现
基本步骤:
1.定义好服务端需要提供的接口方法(客户端调用的接口);
2.定义好服务端的实现代码;
3.使用spring配置服务端,发布服务到制定端口;
4.使用spring配置客户端的代理bean;
5.定义好服务端和客户端调用的测试代码。
三、Spring的httpinvoker的配置实现的代码如下:
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 第三版