【Spring】几种RPC模型的使用与比较——Hessian/Burlap

Hessian和Burlap,现在进Caucho的网站都几乎见不到这方面的内容了。
我也不知道有没有人还会用这两个东东,虽然去年出了一个版本,但上一个版本是在2010年。
刚才在群里问了一下有没有人用,结果还真有人用Hessian,他们是C#和Java做通信。
Burlap性能更令人头疼,不知道还有没有人提及。
虽然不知道使用情况如何,但也在这里简单记录一下,拓展一下思维。


Hessian和Burlap都是由Caucho提供的,Hessian是Resin的一部分。
这两个东西就像同一件事物的两个部件,比如像这样的枪+链锯:
wKioL1NkkyTyB-ZyAACuhzwe5SQ580.jpg


Hessian是binary transport protocol,但与RMI不同的是他不是java序列化对象,所以他可以和其他语言的程序通信,比如C++、C#、Python、Ruby什么的。
Burlap是基于XML的,自然也可以支持很多不同的语言。当然,同样地传输内容下,XML的传输量会大一些。如果要说有什么好处的话也只有可读性了。


实在懒得添加依赖再提供原生实现,但他并不复杂。
Creating a Hessian service using Java has four steps:
·Create an Java interface as the public API
·Create a client using HessianProxyFactory
·Create the Service implementation class
·Configure the service in your servlet engine.


在这里我主要记录一下如何在spring中导出与调用Hessian service。
正如上面所说,我需要把服务配置到servlet engine中;
服务端和客户端都需要添加一个dependency:

1
2
3
4
5
< dependency >
     < groupId >com.caucho</ groupId >
     < artifactId >hessian</ artifactId >
     < version >4.0.33</ version >
</ dependency >


正好我这边有个使用springMVC
的应用,我就在这个基础上导出Hessian service。

1
2
3
4
5
6
7
8
9
10
11
12
13
< servlet >
     < servlet-name >springServlet</ servlet-name >
     < servlet-class >org.springframework.web.servlet.DispatcherServlet</ servlet-class >
     < init-param >
         < param-name >contextConfigLocation</ param-name >
         < param-value >/WEB-INF/spring-mvc.xml</ param-value >
     </ init-param >
     < load-on-startup >1</ load-on-startup >
</ servlet >
< servlet-mapping >
     < servlet-name >springServlet</ servlet-name >
     < url-pattern >/</ url-pattern >
</ servlet-mapping >


简单写一个接口与实现:

1
2
3
4
package pac.king.common.rpc;
public interface MyHessianService {
     public String justHadEnoughParties();
}
1
2
3
4
5
6
7
package pac.king.common.rpc.impl;
import pac.king.common.rpc.MyHessianService;
public class MyHessianServiceImpl implements MyHessianService {
     public String justHadEnoughParties() {
         return "Please save me.." ;
     }
}


我在spring-mvc.xml中曾经做了如下配置,并在*Controller中使用了RequestMapping注解去给URL做映射。
但这并不妨碍我导出Hessian service再为其映射一个URL:

1
2
3
4
5
6
7
8
9
10
11
12
< context:component-scan base-package = "pac.king.controller"
     use-default-filters = "false" >
     < context:include-filter type = "annotation"
         expression = "org.springframework.stereotype.Controller" />
</ context:component-scan >
< bean id = "urlMapping" class = "org.springframework.web.servlet.handler.SimpleUrlHandlerMapping" >
     < property name = "mappings" >
         < value >
             /service=myHessianService
         </ value >
     </ property >
</ bean >


导出Hessian service:

1
2
3
4
5
< bean id = "myHessianServiceImpl" class = "pac.king.common.rpc.impl.MyHessianServiceImpl" />
< bean id = "myHessianService" class = "org.springframework.remoting.caucho.HessianServiceExporter"
     p:service-ref = "myHessianServiceImpl"
     p:serviceInterface = "pac.king.common.rpc.MyHessianService"
/>


现在可以调用了,我需要在客户端声明一个接口(pac.test.HessianService),再用代理去调用:

1
2
3
4
<bean id= "myHessianClient" class = "org.springframework.remoting.caucho.HessianProxyFactoryBean"
     p:serviceUrl= "http://localhost:8080/runtrain/service"
     p:serviceInterface= "pac.test.HessianService"
/>


调用:

1
2
3
ApplicationContext context = new ClassPathXmlApplicationContext( "classpath:applicationContext.xml" );
HessianService service = (HessianService)context.getBean( "myHessianClient" );
System.out.println(service.justHadEnoughParties());


console输出:
wKiom1NkvhXDXoaIAAAtTJhsCvs931.jpg

对于Burlap,几乎与Hessian的配置没什么区别;
只需要把HessianServiceExporter改为BurlapServiceExporter,
并将HessianProxyFactoryBean改为BurlapProxyFactoryBean即可。


RMI使用Java的序列化,而Hessian/Burlap则为了不同语言之间通信而使用私有的序列化。
如果我需要基于HTTP,但我并不需要多语言支持,我只想用Java...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值