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 依赖
com.caucho hessian 4.0.38
服务端代码
服务端在springBoot的启动类进行配置(@SpringBootApplication),或者在标记为配置类的代码中进行配置(@Configuration)。如果启动类中已经配置了很多东西,推荐做单独的配置类,也方便管理。
服务端业务代码接口
package com.wzh.demo.hessian.hessianService.service;/** * * * @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;/** * * * @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;/** * * * @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 * @return 业务对象 */ public static T getHessianClientBean(Class 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方法
服务端控制台输出
客户端控制台输出