RMI:使用JRMP协议(基于TCP/IP),不允许穿透防火墙,使用JAVA系列化方式,使用于任何JAVA应用之间相互调用。
Hessian:使用HTTP协议,允许穿透防火墙,使用自己的系列化方式,支持JAVA、C++、.Net等跨语言使用。
Burlap: 与Hessian相同,只是Hessian使用二进制传输,而Burlap使用XML格式传输(两个产品均属于caucho公司的开源产品)。
Spring HTTP Invoker: 使用HTTP协议,允许穿透防火墙,使用JAVA系列化方式,但仅限于Spring应用之间使用,即调用者与被调用者都必须是使用Spring框架的应用。
1
2
3
4
5
|
/* <p><b>HTTP invoker is the recommended protocol for Java-to-Java remoting.</b>
* It is more powerful and more extensible than Hessian and Burlap, at the
* expense of being tied to Java. Nevertheless, it is as easy to set up as
* Hessian and Burlap, which is its main advantage compared to RMI.
*/
|
服务端配置:
服务声明:
在Spring配置文件中声明一个HttpInvokerServiceExporter类的bean,共三部分:
--服务名称(如helloExporter)
--服务类型(如com.stevex.demo.HelloService)
--服务实现类,一般引用其它bean(如helloService)
1
2
3
4
5
6
|
<
bean
name
=
"helloExporter"
class
=
"org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter"
>
<
property
name
=
"service"
ref
=
"helloService"
></
property
>
<
property
name
=
"serviceInterface"
value
=
"com.stevex.demo.HelloService"
>
</
property
>
</
bean
>
|
服务URL关联:
在web.xml中声明一个与服务与服务名称同名的Servlet(当然这个Servlet类Spring已经提供即HttpRequestHandlerServlet,这家伙的作用就是直接把强求扔给同名的bean),然后声明servlet-mapping将其map到指定URL,这样客户就可以通过这个URL访问到对应服务。
1
2
3
4
5
6
7
8
9
10
|
<
servlet
>
<
servlet-name
>helloExporter</
servlet-name
>
<
servlet-class
>
org.springframework.web.context.support.HttpRequestHandlerServlet
</
servlet-class
>
</
servlet
>
<
servlet-mapping
>
<
servlet-name
>helloExporter</
servlet-name
>
<
url-pattern
>/remoting/HelloService</
url-pattern
>
</
servlet-mapping
>
|
客户端配置:
1
2
3
4
5
6
7
|
<
bean
id
=
"remoteHelloService"
class
=
"org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean"
>
<
property
name
=
"serviceUrl"
value
=
"http://localhost:8080/demo/remoting/HelloService"
/>
<
property
name
=
"serviceInterface"
value
=
"com.stevex.demo.HelloService"
/>
</
bean
>
|
服务端实现:
1
2
3
4
5
6
7
|
@Service
(
"helloService"
)
public
class
HelloServiceImpl
implements
HelloService {
@Override
public
String hello() {
return
"Hello Stevex, I am invoked by Spring HTTP Invoker!"
;
}
}
|
1
2
3
|
public
interface
HelloService {
public
String hello();
}
|
客户端实现:
1
2
3
4
5
6
7
8
9
10
11
|
public
class
HelloClient {
public
static
void
main(String[] args) {
GenericXmlApplicationContext ctx =
new
GenericXmlApplicationContext();
ctx.load(
"classpath:http-invoker-app-context.xml"
);
ctx.refresh();
HelloService helloService = ctx.getBean(
"remoteHelloService"
,
HelloService.
class
);
System.out.println(helloService.hello());
}
}
|