这里是回忆一下2017年的时候,用到的hession通信,需求是将索道的上位机传感器数据上传到云端,2个client端,向1个server端发送数据,这个模式想对比较简单。
hessian首先是一个RPC框架,基于HTTP协议传输,使用hessian进行二进制序列化,效率高于 WebService 和 Java 自带的序列化。我们知道序列化是便于持久化存储和网络传输,这里再对比一下其他的序列化协议,java序列化框架(protobuf、thrift、kryo、fst、fastjson、Jackson、gson、hessian)性能对比,protobuf、thrift、avro对比
每种协议都有特定的场景,hessian可以提升开发效率,dubbo就支持dubbo 支持的9种协议
1 服务端
这个项目采用的springmvc的模式,不像现在springboot这么火
<dependency>
<groupId>com.caucho</groupId>
<artifactId>hessian</artifactId>
<version>4.0.38</version>
</dependency>
hession的spring配置,想对比较简单,定义接口和实现类即可
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"
default-lazy-init="false">
<description>Spring Hession 服务端配置</description>
<!-- 同步传感器数据采集 -->
<bean name="/syncMonitorAutoCollectData" class="org.springframework.remoting.caucho.HessianServiceExporter">
<property name="service" ref="syncMonitorAutoCollectDataServiceImpl"/>
<property name="serviceInterface" value="com.dzmsoft.monitor.api.service.SyncMonitorAutoCollectDataService"/>
</bean>
</beans>
定义接口sdk,这个monitor-api将在client端的pom中引用进去
2 客户端
引用刚刚看到的monitor-api
,拼接url地址,向服务端发送请求
@Transactional(readOnly = false)
@Override
public void sync() {
List<FontalAutoCollectData> fontalAutoCollectDatas = fontalAutoCollectDataService.selectNoSyncDatas();
if (!CheckEmptyUtil.isEmpty(fontalAutoCollectDatas)){
String datas = gson.toJson(fontalAutoCollectDatas);
String merchCode = fontalConfigService.getMerchCode();
String url = fontalConfigService.getMonitorUrl() + WorkerEnum.syncMonitorAutoCollectData.value();
String upDown = fontalConfigService.getUpDown();
//
HessianProxyFactory factory = new HessianProxyFactory();
SyncMonitorAutoCollectDataService syncMonitorAutoCollectDataService;
String result = null;
try {
syncMonitorAutoCollectDataService = (SyncMonitorAutoCollectDataService)factory.create(SyncMonitorAutoCollectDataService.class,url);
result = syncMonitorAutoCollectDataService.sync(datas, merchCode, upDown);
if (!CheckEmptyUtil.isEmpty(result)){
// 更改上传结果
callback(result);
}
} catch (MalformedURLException e) {
logger.error("远程调用monitor 失败,失败原因:{}",e.getMessage());
e.printStackTrace();
}
}
}
@Override
public String getMonitorUrl() {
CcsDataDictionary ccsDataDictionary = getMonitorDataDictionary();
StringBuffer url = new StringBuffer("");
if (ccsDataDictionary != null){
url.append("http://").append(ccsDataDictionary.getValueField()).append("/monitor/hessian/");
}
return url.toString();
}
同样客户端pom也需要引入
<dependency>
<groupId>com.caucho</groupId>
<artifactId>hessian</artifactId>
<version>4.0.38</version>
</dependency>