Hessian 是 Caucho 推出的輕量級遠程調用框架,特點鮮明:
對比傳統 WebService(SOAP/XML):Hessian 更簡單、更快、帶寬佔用更低。
客戶端 → 序列化 → HTTP Request → 服務端反序列化 → 調用實現 → 序列化結果 → HTTP Response → 客戶端反序列化
核心組件:
HessianServlet 處理請求分發HessianProxyFactory 創建動態代理HessianServiceExporter、HessianProxyFactoryBeanpackage michael.hessian;
import java.util.List;
import java.util.Map;
public interface HelloHessian {
String sayHello();
MyCar getMyCar();
List<String> myLoveFruit();
Map<String, String> myBabays();
}
package michael.hessian.impl;
import michael.hessian.HelloHessian;
import michael.hessian.MyCar;
import com.caucho.hessian.server.HessianServlet;
import java.util.*;
public class HelloHessianImpl extends HessianServlet implements HelloHessian {
public MyCar getMyCar() {
MyCar car = new MyCar();
car.setCarName("阿斯頓·馬丁");
car.setCarModel("One-77");
return car;
}
public Map<String, String> myBabays() {
Map<String, String> map = new HashMap<>();
map.put("son", "孫吳空");
map.put("daughter", "孫小美");
return map;
}
public List<String> myLoveFruit() {
return Arrays.asList("apple", "kiwi", "orange");
}
public String sayHello() {
return "welcome to Hessian";
}
}
package michael.hessian;
import java.io.Serializable;
public class MyCar implements Serializable {
private static final long serialVersionUID = 4736905401908455439L;
private String carName;
private String carModel;
// getter/setter/toString 省略
}
<servlet>
<servlet-name>HelloHessian</servlet-name>
<servlet-class>com.caucho.hessian.server.HessianServlet</servlet-class>
<init-param>
<param-name>home-class</param-name>
<param-value>michael.hessian.impl.HelloHessianImpl</param-value>
</init-param>
<init-param>
<param-name>home-api</param-name>
<param-value>michael.hessian.HelloHessian</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>HelloHessian</servlet-name>
<url-pattern>/HessianService</url-pattern>
</servlet-mapping>
String url = "https://localhost:8082/J2EE_sJSky/HessianService";
HessianProxyFactory factory = new HessianProxyFactory();
HelloHessian hello = (HelloHessian) factory.create(HelloHessian.class, url);
System.out.println(hello.sayHello());
MyCar car = hello.getMyCar();
System.out.println(car); // my car name:[阿斯頓·馬丁] model:[One-77].
hello.myBabays().forEach((k, v) -> System.out.println(k + " " + v));
hello.myLoveFruit().forEach(System.out::println);
<servlet>
<servlet-name>springhessian</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springhessian</servlet-name>
<url-pattern>/springhessian/*</url-pattern>
</servlet-mapping>
<?xml version="1.0" encoding="UTF-8"?>
<beans>
<bean id="helloHessianImpl" class="michael.hessian.impl.HelloHessianImpl" />
<bean name="/helloHessianService"
class="org.springframework.remoting.caucho.HessianServiceExporter">
<property name="service" ref="helloHessianImpl" />
<property name="serviceInterface" value="michael.hessian.HelloHessian" />
</bean>
</beans>
關鍵點:Bean 名稱 /helloHessianService 直接映射為 URL 路徑,完整訪問地址:/springhessian/helloHessianService。
<beans>
<bean id="helloHessianClient"
class="org.springframework.remoting.caucho.HessianProxyFactoryBean">
<property name="serviceUrl"
value="https://localhost:8082/J2EE_sJSky/springhessian/helloHessianService" />
<property name="serviceInterface" value="michael.hessian.HelloHessian" />
</bean>
</beans>
ApplicationContext ctx = new ClassPathXmlApplicationContext("hessian-client.xml");
HelloHessian hello = (HelloHessian) ctx.getBean("helloHessianClient");
// 後續調用同純 Java 模式
com.caucho.hessian.io.HessianProtocolException: expected string at 0x6d
at com.caucho.hessian.io.Hessian2Input.readString(Hessian2Input.java:1362)
at com.caucho.hessian.server.HessianSkeleton.invoke(HessianSkeleton.java:249)
-Dhessian.debug=trueserialVersionUID 顯式聲明且雙端一致| 場景 | 推薦模式 | 理由 |
|---|---|---|
| 微服務內部調用、高性能要求 | Spring + Hessian | 統一配置管理、AOP 支援、事務整合 |
| 輕量級獨立模塊、無 Spring 依賴 | 純 Hessian | 零配置、啟動快、部署簡單 |
| 跨語言調用 | 均可 | 協議標準化,客戶端只需實現 Hessian 協議 |
Hessian 以「簡單、高效、二進制」三大特性,在內部服務調用、移動端 API、異構系統集成中佔據一席之地。雖然 gRPC、Dubbo 等新框架功能更強,但 Hessian 的零學習成本、零配置複雜度、原生 HTTP 傳輸,使其在中小型項目、遺留系統改造、快速原型開發中依然極具競爭力。