本文主要介绍如何实现将
spring-hessian
集成在gwt
系统中,完成系统的前后台模块的分离部署。集成了
hessian
后,可以实现将业务逻辑代码从原有系统中剥离,并部署到另外一个容器中,同时将这些业务逻辑代码发布成远程接口,原有系统的前台模块则通过调用这些远程接口实现原有的业务服务。这样实现可以很好的分担原服务器的压力,同时降低了前后台模块的耦合度,使向外提供高效的业务服务接口成为现实(区别于
webservice
)。
首先介绍简单介绍一下hessian,Hessian
是一个轻量级的
remoting on http
工具,使用简单的方法提供了
RMI
(
Remote Method Invocation
,远程方法调用)的功能。采用的是二进制
RPC
(
Remote Procedure Call Protocol
,远程过程调用协议)协议,因为采用的是二进制协议,所以它很适合于发送二进制数据。它提供
web
服务就像创建
Servlet
一样简单
.
使用服务就像使用
JDK
代理接口一样简单。
hessian
类似于
Webservice
,但是它不使用
soap
协议,它把协议报文封装到
http
封包中,通过
HTTP
信道传输。是一种高效简洁的远程调用框架,它采用的是二进制
RPC
协议(
Binary
),具有轻量、传输量小、平台无关的特点,特别适合于目前网络带宽比较小的手机网络应用项目。
Hessian
是通过
servlet
提供远程服务,完全使用动态代理来实现的
,
推荐采用面向接口编程,因此,
Hessian
服务建议通过接口暴露。
hessian
已经支持
Java
,
Flash/Flex
,
Python
,
C++
,
.NET C#
,
D
,
Erlang
,
PHP
,
Ruby
,
Objective C
。它不需要我们与
xml
“
打交道
”
,直接操作对象,省去了很多麻烦。
集成原理简介
基于
gwt
开发的
系统提供了一套默认的基于
servlet
开发的
RPC
服务。
它能够让我们直接在前后台传递对象
,而无需考虑中间的传递过
程。为开发提供了很大的便利。
事实上,当我们在前台模块定义一个
model
对象并作为参数传递给某个
service
时,就是发送了一个
servlet
请求,同时将该对象序列化为二进制流,发送到
RPC
接口中。之后再
RPC
接口中反序列化该对象并通过请求的
service
名反射后台业务服务进行业务处理,并将最终结果序列化传送回前台并显示。流程图如下:
Gwt
提供的
RPC
服务方便了我们的开发,但是他不支持将前后台模块分离部署,观看源码可知,
GWT
的
rpc
服务不支持传递的请求来自不同的
web
服务器:
/**
* The servlet base class for your RPC service implementations that
* automatically deserializes incoming requests from the client and serializes
* outgoing responses for client/server RPCs.
*/
public class RemoteServiceServlet extends AbstractRemoteServiceServlet
implements SerializationPolicyProvider {
static SerializationPolicy loadSerializationPolicy(HttpServlet servlet,
HttpServletRequest request, String moduleBaseURL, String strongName) {
// The request can tell you the path of the web app relative to the
// container root.
String contextPath = request.getContextPath();
String modulePath = null;
if (moduleBaseURL != null) {
try {
modulePath = new URL(moduleBaseURL).getPath();
} catch (MalformedURLException ex) {
// log the information, we will default
servlet.log("Malformed moduleBaseURL: " + moduleBaseURL, ex);
}
}
SerializationPolicy serializationPolicy = null;
注:
/*
* Check that the module path must be in the same web app as the servlet
* itself. If you need to implement a scheme different than this, override
* this method.
*/
。。。。
所以,本文确认使用集成
hessian
的方式来实现远程调用业务实现来完成前后台模块的分离。通过
hessian
提供的
rpc
方式,可以在
gwt rpc
中将反射调用服务接口的路径改成调用远程
hessian
提供的远程服务接口,通过该接口在反射调用对应的服务来进行相应的逻辑处理并返回序列化后的结果对象,在前台进行展现。流程图如下:
1.
创建业务层工程
1.1进入
eclipse
,新建一个
web
工程,本例中以我测试的gwt工程为基础,创建名为
TMHessianServer
的工程
1.2 将gwt工程的业务层代码都复制到该工程中
1.3在上步中检查各种实体
bean
,使其继承了序列化接口,这一步很重要,由于
hessian
需要将对象进行序列化,所以如果不这么做会产生异常
1.4打开
web.xml
,添加
hessian
的
servlet
配置。
Hessian
将每个服务都发不成一个
servlet,
前台模块可以通过该
servlet
调用远程服务
<servlet>
<servlet-name>Hessian</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:Hessian-servlet.xml
</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Hessian</servlet-name>
<url-pattern>/hessian/*</url-pattern>
</servlet-mapping>
1.5根据创建的
hessian
servlet
名创建对应的配置文件。该配置文件命名是以
xml
里
hessian servlet
名
+
“
-servlet
”为规则。该例中使用
hessian-servlet.xml
为
hessian
配置文件。将该配置文件放在
classpath
中。本例放在如下位置
1.6打开
hessian-servlet.xml,
将远程医疗中的业务
bean
定义全部复制到其中。并根据每个
service bean
定义远程服务。如下举例
<!-- 业务类 -->
<bean id="patientService" class="net.carefx.tm.manager.service.impl.PatientServiceImpl">
<property name="patientMapper" ref="patientMapper"></property>
</bean>
<!-- 远程服务 -->
<bean name="/patientService"
class="org.springframework.remoting.caucho.HessianServiceExporter">
<property name="service" ref="patientService" />
<property name="serviceInterface">
<value>
net.carefx.tm.manager.service.PatientService
</value>
</property>
</bean>
1.7
将gwt工程中中业务层的
spring
的配置文件拷贝到新建的业务工程中
1.8
在新工程的
xml
文件中添加
spring
配置以及业务文件的引用
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:framework-common.spring.xml,
classpath:framework-cache.spring.xml,
classpath:pms/pms-db.spring.xml,
classpath:pms/pms-manager.spring.xml,
classpath:pms/pms-service-local.spring.xml,
classpath:tm/tm-db.spring.xml,
classpath:Hessian-servlet.xml
</param-value>
</context-param>
<!-- spring 读取 log4jConfigLocation -->
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<listener>
<listener-class>
org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
<servlet>
<servlet-name>Hessian</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:Hessian-servlet.xml
</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Hessian</servlet-name>
<url-pattern>/hessian/*</url-pattern>
</servlet-mapping>
1.9将所有相关的
jar
包都放入
web-inf/lib
目录下。至此
hessian
工程配置完成。启动该工程。新发布的远程服务远程地址应该为
heep://ip:port/ProjectName/serviceName.
如上例中的
patientservice
的地址即为:
http://localhost:8080/TMHessianServer/patientService
2 修改源工程
2.1打开源工程系统,将所有业务相关的类删除。注意:由于开发时的不注意或者业务需要,有些业务类被前台引用,造成了紧耦合,不能删除(比如多线程控制等),为了尽量少的更改源代码可以将这些类保留,但是实际上最终执行可以再远程服务的工程里进行。
2.2 打开系统中的业务
bean
配置文件,本例中为
tm-manager.spring.xml
。修改原有的业务
bean
定义,修改为支持
hessian
的远程调用定义
<bean id="patientService"
class="org.springframework.remoting.caucho.HessianProxyFactoryBean">
<property name="serviceUrl"
value="${tm.patientService}" />//远程服务地址
<property name="serviceInterface" //服务接口
value="net.carefx.tm.manager.service.PatientService" />
</bean>
2.3新建属性文件
tm-service-location.properties
,将上步中的远程服务地址保存在内
2.4至此配置完成,启动远程医疗系统,同时启动远程服务系统
TMHessianServet
,将两个系统分置于不同的容器中,进行测试,如无异常,证明配置成功
3.可能产生的问题解决方案
1.
nested
exception is com.caucho.hessian.io.HessianProtocolException: expected hessian
reply at end of file
解决方案:这是因为接口中出现方法重载,在调用时,服务器端会跑出异常。
在整合
spring
中,在客户端的配置里面加上“
<property
name="overloadEnabled" value="true"></property>
”代码可以解决。如下:
<bean id="doctorService"
class="org.springframework.remoting.caucho.HessianProxyFactoryBean">
<property name="overloadEnabled" value="true"></property>
<property name="serviceUrl"
value="${tm.doctorService}" />
<property name="serviceInterface" value="net.carefx.tm.manager.service.DoctorService" />
</bean>
2.com.caucho.hessian.client.HessianRuntimeException: com.caucho.hessian.io.HessianProtocolException: expected integer at 0x53
java.lang.String
解决方案:检查
hessian
包是否存在服务器端和客户端不一致,或者是服务器自带了不同版本的
hessian.jar
包
。统一
jar
包可以解决
- 大小: 103.8 KB
- 大小: 92.4 KB
- 大小: 8.3 KB
- 大小: 27.5 KB
- 大小: 8 KB
- 大小: 18.1 KB
- 大小: 21.6 KB
- 大小: 38 KB
分享到:
相关推荐
Spring-DM(Dynamic Modules for Spring)是基于OSGi(Java模块系统)的一个扩展,它为Spring应用程序提供了一种模块化和动态管理的方式,使其成为构建DSF的理想选择。 选择Spring-DM而非直接使用Spring的原因在于...
总结来说,基于Spring-DM的DSF充分利用了Spring的灵活性和OSGi的模块化优势,为构建高效率、可扩展的分布式服务架构提供了一个强大而灵活的平台。通过精巧的设计,DSF实现了服务的高效查找、发布以及在不同环境下的...
java运行依赖jar包
在Spring的配置文件(如`applicationContext.xml`)中,我们可以定义一个`hessian-service` bean,将服务接口绑定到服务实现: ```xml <hessian:service id="myHessianService" ref="myService" url="/my/hessian/...
这些jar包共同构成了Spring Security 3.1.4的完整框架,为企业级应用提供了强大的安全基础设施,涵盖了从Web应用到分布式系统,从本地用户认证到第三方服务集成的各种安全需求。开发者可以根据实际项目需求选择和...
该优化版SOFA-Hessian项目基于原生Hessian v4.0.51构建,经过蚂蚁金服多年内部稳定运行,现已进行多项改进。项目包含317个文件,其中Java源文件300个,XML、YML、Markdown、HTML等配置和说明文件共计7个,并支持...
Spring AOP和Hessian是两个在Java开发中广泛使用的技术,尤其在分布式系统和服务治理中。下面将详细解释这两个概念以及它们如何结合使用。 **Spring AOP(面向切面编程)** Spring AOP是Spring框架的一个重要组成...
在 `maven-spring-hessian-master` 这个压缩包中,我们可以预期看到以下目录结构: 1. `src/main/java`: 包含项目的主要Java源代码,可能有一个或多个包,如com.example,其中包含Spring配置和服务类。 2. `src/main...
Flex-Hessian-Java实例是一个关于使用Flex客户端与Java服务器之间进行高效远程调用的实践案例。这个压缩包包含了实现这一技术所需的关键组件和文件。Flex是Adobe开发的一种开放源码的富互联网应用(RIA)开发框架,...
本案例主要关注如何将Spring与Hessian进行集成,实现远程服务调用,从而提高系统的分布式能力。 首先,我们要理解Spring的核心概念。Spring通过依赖注入(Dependency Injection, DI)和面向切面编程(Aspect-...
【标题】"dubbo-hessian-lite" 是一个与阿里巴巴的著名开源远程调用框架 Dubbo 相关的组件。Dubbo 提供了多种序列化方式,其中之一就是 Hessian 序列化,而 hessian-lite 是 Dubbo 在编译时依赖的一个轻量级 Hessian...
在IT行业中,分布式服务框架Dubbo是阿里巴巴开源的一款高性能、轻量级的服务治理方案,它使得服务提供者可以在一个系统中发布服务,而服务消费者可以在任何地方调用这些服务。Hessian是Apache的一个子项目,它是一种...
在Spring Security 3.1.2版本中,包含了多个jar包,每个jar包都有其特定的功能,下面将对这些关键jar包进行详细介绍。 1. **spring-security-config**:这个模块提供了配置Spring Security的核心API。它包含安全元...
在IT行业中,Hessian是一种高效的远程...通过这种整合,开发者可以享受到Spring的灵活性和Hessian的高效网络通信,从而构建出高性能、可维护的分布式系统。在实际项目中,这种整合可以极大地提高开发效率和系统稳定性。
sofa-hessian-node 蚂蚁金服对 Hessian 序列化的定制版本 sofa-hessian-node 对应的 Java Hessian 版本是 v3.1.3。它对 模块做了进一步封装,通过预编译来提高性能。 安装 $ npm install sofa-hessian-node --save ...
《深入理解Flex-Spring-Hessian框架(Java部分)》 在Java开发中,Flex-Spring-Hessian框架常常被用于构建富客户端应用,它整合了Adobe Flex前端与Spring后端服务,利用Hessian协议进行二进制RPC通信,提高了数据...
在Spring框架中集成Hessian是为了实现远程方法调用(Remote Method Invocation, RMI),这是一种轻量级的序列化协议,可以高效地传输Java...通过深入学习和实践,我们可以更好地利用Hessian来构建高性能的分布式系统。
【S25-Hessian反序列化1】是一个关于Java中Hessian序列化库的讨论,主要涉及Hessian与原生Java序列化的差异以及在Spring框架中的应用。Hessian是一种二进制序列化协议,旨在提高远程过程调用(RPC)的效率。与原生Java...
本篇文章将针对 `nacos-hessian-rce.md` 文件中提及的一个远程代码执行(Remote Code Execution, RCE)漏洞进行详细分析。该文档由 Y4er.com 在 2023 年 6 月 8 日撰写。此漏洞主要涉及 Nacos 的 7848 端口使用 ...
com.alibaba:hessian-lite:jar:3.2.1-fixed-2 hessian-lite hessian-lite-3.2.1-fixed-2.jar