1. 概述

在上一篇文章《使用HTTP Invokers入门Spring Remoting》中,我们已经了解了如何通过Spring Remoting轻松搭建客户端/服务器应用,实现远程方法调用(RMI)。

在这篇文章中,我们将展示Spring Remoting如何支持使用Hessian和Burlap来实现RMI

2. Maven依赖

Hessian和Burlap都由以下库提供,你需要在pom.xml文件中明确包含它:

<dependency>
    <groupId>com.caucho</groupId>
    <artifactId>hessian</artifactId>
    <version>4.0.38</version>
</dependency>

你可以在Maven中央仓库找到最新版本。

3. Hessian

Hessian是Caucho公司开发的轻量级二进制协议,用于Caucho应用服务器Resin。Hessian在多个平台和语言中都有实现,包括Java。

在接下来的子节中,我们将修改之前文章中介绍的“出租车预订”示例,让客户端和服务器通过Hessian而不是基于Spring Remote HTTP的协议进行通信。

3.1. 服务暴露

我们通过配置一个HessianServiceExporter类型的RemoteExporter来暴露服务,替换之前的HttpInvokerServiceExporter

@Bean(name = "/booking") 
RemoteExporter bookingService() {
    HessianServiceExporter exporter = new HessianServiceExporter();
    exporter.setService(new CabBookingServiceImpl());
    exporter.setServiceInterface( CabBookingService.class );
    return exporter;
}

现在我们可以启动服务器并保持其运行状态,同时准备客户端。

3.2. 客户端应用

让我们实现客户端。这里改动也很简单——我们需要将HttpInvokerProxyFactoryBean替换为HessianProxyFactoryBean

@Configuration
public class HessianClient {

    @Bean
    public HessianProxyFactoryBean hessianInvoker() {
        HessianProxyFactoryBean invoker = new HessianProxyFactoryBean();
        invoker.setServiceUrl("http://localhost:8080/booking");
        invoker.setServiceInterface(CabBookingService.class);
        return invoker;
    }

    public static void main(String[] args) throws BookingException {
        CabBookingService service
          = SpringApplication.run(HessianClient.class, args)
              .getBean(CabBookingService.class);
        out.println(
          service.bookRide("13 Seagate Blvd, Key Largo, FL 33037"));
    }
}

现在我们可以运行客户端,使其使用Hessian连接到服务器。

4. Burlap

Burlap是Caucho提供的另一种基于XML的轻量级协议。尽管Caucho很久前就停止维护它,但在最新的Spring版本中仍然存在,但已标记为过时。

因此,除非你有已经在分布式且不易迁移到其他Spring Remoting实现的应用,否则你应该合理地继续使用Burlap。

4.1. 服务暴露

我们可以像使用Hessian一样使用Burlap,只需选择适当的实现即可:

@Bean(name = "/booking") 
RemoteExporter burlapService() {
    BurlapServiceExporter exporter = new BurlapServiceExporter();
    exporter.setService(new CabBookingServiceImpl());
    exporter.setServiceInterface( CabBookingService.class );
    return exporter;
}

如你所见,我们只是将导出器类型从HessianServiceExporter改为BurlapServiceExporter。所有设置代码可以保持不变。

再次启动服务器,我们在处理客户端的同时保持它运行。

4.2. 客户端实现

在客户端端,我们也可以将Hessian换成Burlap,将HessianProxyFactoryBean替换为BurlapProxyFactoryBean

@Bean
public BurlapProxyFactoryBean burlapInvoker() {
    BurlapProxyFactoryBean invoker = new BurlapProxyFactoryBean();
    invoker.setServiceUrl("http://localhost:8080/booking");
    invoker.setServiceInterface(CabBookingService.class);
    return invoker;
}

现在我们可以运行客户端,看看它如何成功地使用Burlap连接到服务器应用。

5. 总结

通过这些快速示例,我们展示了如何在Spring Remoting中轻松选择不同的技术来实现远程方法调用,并且可以在完全不了解用于表示远程方法调用的协议技术细节的情况下开发应用。

如往常一样,你可以在GitHub上找到源码链接,包括Hessian和Burlap的客户端以及测试类CabBookingServiceTest.java,它会负责运行服务器和客户端。