Hessian是一个轻量级的remoting on http框架(远程调用框架),采用的是Binary RPC协议(二进制远程调用协议),和我们在web工程中常用的webservice比较类似,不过是个比较轻量级的框架,还有一点不一样的是webserce服务端和客户端何意用不同的框架,例如服务端用CXF,客户端用Axis。Hessian不行,调用方和被调用方必须都是Hessian。Hessian可通过Servlet提供远程服务,需要将请求映射到Hessian服务。也可Spring框架整合。
SpringBoot整合Hessian和Spring整合的步骤差不多,不过因为boot提倡无xml,所以整合的时候boot是在@SpringBootApplication
启动类中进行,传统spring是在xml和web.xml中进行,在自己搭建项目的时候可以互相参考看,可以参考此篇博文:https://my.oschina.net/pagecorrect/blog/745631。
maven 依赖
<!-- hessian -->
<dependency>
<groupId>com.caucho</groupId>
<artifactId>hessian</artifactId>
<version>4.0.38</version>
</dependency>
服务端代码
服务端在springBoot的启动类进行配置(@SpringBootApplication
),或者在标记为配置类的代码中进行配置(@Configuration
)。如果启动类中已经配置了很多东西,推荐做单独的配置类,也方便管理。
服务端业务代码接口
package com.wzh.demo.hessian.hessianService.service;
/**
* <发布的第一个hesian测试接口>
* <功能详细描述>
* @author wzh
* @version 2018-11-18 17:24
* @see [相关类/方法] (可选)
**/
public interface SayHelloHessian {
/**
* 接口测试方法
* @return
*/
public String SayHello(String msg);
}
服务端业务代码接口实现类,对象通过spring管理
package com.wzh.demo.hessian.hessianService.service.Impl;
import com.wzh.demo.hessian.hessianService.service.SayHelloHessian;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Service;
/**
* <一句话功能描述>
* <功能详细描述>
* @author wzh
* @version 2018-11-18 17:46
* @see [相关类/方法] (可选)
**/
@Service("sayHelloHessian")
public class SayHelloHessianImpl implements SayHelloHessian{
private Logger log = Logger.getLogger(SayHelloHessianImpl.class);
@Override
public String SayHello(String msg) {
log.info("-----------进入hessian方法,客户端参数:"+ msg +"--------------");
return "服务端返回:hello hessian";
}
}
服务端接口发布配置类,通过spirng注解配置
package com.wzh.demo.hessian.hessianService.config;
import com.wzh.demo.hessian.hessianService.service.SayHelloHessian;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.remoting.caucho.HessianServiceExporter;
import javax.annotation.Resource;
/**
* <用于配置发布hessian接口>
* <这里只是做了最简单的配置,还可以设置超时时间,密码这些安全参数>
* @author wzh
* @version 2018-11-18 16:55
* @see [相关类/方法] (可选)
**/
@Configuration //标记为spring 配置类
public class HessionServiceConfig {
@Resource
private SayHelloHessian sayHelloHessian;
/**
* 1. HessianServiceExporter是由Spring.web框架提供的Hessian工具类,能够将bean转化为Hessian服务
* 2. @Bean(name = "/helloHessian.do")加斜杠方式会被spring暴露服务路径,发布服务。
* @return
*/
@Bean("/helloHessian.do")
public HessianServiceExporter exportHelloHessian()
{
HessianServiceExporter exporter = new HessianServiceExporter();
exporter.setService(sayHelloHessian);
exporter.setServiceInterface(SayHelloHessian.class);
return exporter;
}
}
到此为止一个简单的基于Hessian的远程调用服务端就完成了,比webservice简单多了,下面进行客户端的编写。
客户端代码
客户端同样需要服务端的jar。除了jar依赖,客户端还需要两个东西,第一个是和业务端一样的接口代码,还有一个就是Hessian的连接对象。客户端可以做成spring管理的模式,一个接口配置一个,也可以做成我下面写的这种,一个工具类,每次调用。
客户端业务接口
package com.wzh.demo.hessian.hessianService.service;
/**
* <发布的第一个hesian测试接口>
* <功能详细描述>
* @author wzh
* @version 2018-11-18 17:24
* @see [相关类/方法] (可选)
**/
public interface SayHelloHessian {
/**
* 接口测试方法
* @return
*/
public String SayHello(String msg);
}
客户端获取连接对象工具类
package com.wzh.demo.hessian.hessianClient.utils;
import com.caucho.hessian.client.HessianProxyFactory;
import com.wzh.config.utils.BusinessException;
import com.wzh.demo.hessian.hessianService.service.SayHelloHessian;
import org.apache.log4j.Logger;
/**
* <获取客户端连接工厂对象>
* <功能详细描述>
* @author wzh
* @version 2018-11-18 20:45
* @see [相关类/方法] (可选)
**/
public class HessianProxyFactoryUtil {
private Logger log = Logger.getLogger(HessianProxyFactoryUtil.class);
/**
* 获取调用端对象
* @param clazz 实体对象泛型
* @param url 客户端url地址
* @param <T>
* @return 业务对象
*/
public static <T> T getHessianClientBean(Class<T> clazz,String url) throws Exception
{
// 客户端连接工厂,这里只是做了最简单的实例化,还可以设置超时时间,密码等安全参数
HessianProxyFactory factory = new HessianProxyFactory();
return (T)factory.create(clazz,url);
}
//
public static void main(String[] args) {
// 服务器暴露出的地址
String url = "http://localhost:8080/SpringBootDemo/helloHessian.do";
// 客户端接口,需与服务端对象一样
try {
SayHelloHessian helloHessian = HessianProxyFactoryUtil.getHessianClientBean(SayHelloHessian.class,url);
String msg = helloHessian.SayHello("你好");
System.out.println(msg);
} catch (Exception e) {
e.printStackTrace();
}
}
}
这里直接在utils中写了个main方法,我们启动服务端后运行下man方法
服务端控制台输出
客户端控制台输出