`
wendy_wxie
  • 浏览: 117980 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

基于spring-hessian的gwt系统前后台模块的分布式部署介绍

阅读更多

   本文主要介绍如何实现将 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实现分布式服务框架(DSF).docx

    Spring-DM(Dynamic Modules for Spring)是基于OSGi(Java模块系统)的一个扩展,它为Spring应用程序提供了一种模块化和动态管理的方式,使其成为构建DSF的理想选择。 选择Spring-DM而非直接使用Spring的原因在于...

    基于Spring-DM实现分布式服务框架(DSF).pdf

    总结来说,基于Spring-DM的DSF充分利用了Spring的灵活性和OSGi的模块化优势,为构建高效率、可扩展的分布式服务架构提供了一个强大而灵活的平台。通过精巧的设计,DSF实现了服务的高效查找、发布以及在不同环境下的...

    dubbo-rpc-hessian-2.8.4.jar

    java运行依赖jar包

    基于spring+hessian框架的webservice实例

    在Spring的配置文件(如`applicationContext.xml`)中,我们可以定义一个`hessian-service` bean,将服务接口绑定到服务实现: ```xml &lt;hessian:service id="myHessianService" ref="myService" url="/my/hessian/...

    spring-security3.1.4 完整的jar包

    这些jar包共同构成了Spring Security 3.1.4的完整框架,为企业级应用提供了强大的安全基础设施,涵盖了从Web应用到分布式系统,从本地用户认证到第三方服务集成的各种安全需求。开发者可以根据实际项目需求选择和...

    基于原生Hessian v4.0.51的SOFA-Hessian设计源码优化版

    该优化版SOFA-Hessian项目基于原生Hessian v4.0.51构建,经过蚂蚁金服多年内部稳定运行,现已进行多项改进。项目包含317个文件,其中Java源文件300个,XML、YML、Markdown、HTML等配置和说明文件共计7个,并支持...

    spring aop hessian 基础demo 部署即可运行

    Spring AOP和Hessian是两个在Java开发中广泛使用的技术,尤其在分布式系统和服务治理中。下面将详细解释这两个概念以及它们如何结合使用。 **Spring AOP(面向切面编程)** Spring AOP是Spring框架的一个重要组成...

    maven-spring-hessian:带有 Hessian 的 Hello world Spring Web 应用程序

    在 `maven-spring-hessian-master` 这个压缩包中,我们可以预期看到以下目录结构: 1. `src/main/java`: 包含项目的主要Java源代码,可能有一个或多个包,如com.example,其中包含Spring配置和服务类。 2. `src/main...

    flex-hessian-java实例.rar

    Flex-Hessian-Java实例是一个关于使用Flex客户端与Java服务器之间进行高效远程调用的实践案例。这个压缩包包含了实现这一技术所需的关键组件和文件。Flex是Adobe开发的一种开放源码的富互联网应用(RIA)开发框架,...

    Spring集成Hessian案例

    本案例主要关注如何将Spring与Hessian进行集成,实现远程服务调用,从而提高系统的分布式能力。 首先,我们要理解Spring的核心概念。Spring通过依赖注入(Dependency Injection, DI)和面向切面编程(Aspect-...

    dubbo-hessian-lite

    【标题】"dubbo-hessian-lite" 是一个与阿里巴巴的著名开源远程调用框架 Dubbo 相关的组件。Dubbo 提供了多种序列化方式,其中之一就是 Hessian 序列化,而 hessian-lite 是 Dubbo 在编译时依赖的一个轻量级 Hessian...

    dubbo-hessian协议http请求demo(java)

    在IT行业中,分布式服务框架Dubbo是阿里巴巴开源的一款高性能、轻量级的服务治理方案,它使得服务提供者可以在一个系统中发布服务,而服务消费者可以在任何地方调用这些服务。Hessian是Apache的一个子项目,它是一种...

    springsecurity所有jar包

    在Spring Security 3.1.2版本中,包含了多个jar包,每个jar包都有其特定的功能,下面将对这些关键jar包进行详细介绍。 1. **spring-security-config**:这个模块提供了配置Spring Security的核心API。它包含安全元...

    hessian与spring整合的jar包

    在IT行业中,Hessian是一种高效的远程...通过这种整合,开发者可以享受到Spring的灵活性和Hessian的高效网络通信,从而构建出高性能、可维护的分布式系统。在实际项目中,这种整合可以极大地提高开发效率和系统稳定性。

    sofa-hessian-node:由Ant Financial支持的性能增强版Hessian

    sofa-hessian-node 蚂蚁金服对 Hessian 序列化的定制版本 sofa-hessian-node 对应的 Java Hessian 版本是 v3.1.3。它对 模块做了进一步封装,通过预编译来提高性能。 安装 $ npm install sofa-hessian-node --save ...

    flex_spring_hessian框架(Java部分)

    《深入理解Flex-Spring-Hessian框架(Java部分)》 在Java开发中,Flex-Spring-Hessian框架常常被用于构建富客户端应用,它整合了Adobe Flex前端与Spring后端服务,利用Hessian协议进行二进制RPC通信,提高了数据...

    Spring中集成Hessian的问题

    在Spring框架中集成Hessian是为了实现远程方法调用(Remote Method Invocation, RMI),这是一种轻量级的序列化协议,可以高效地传输Java...通过深入学习和实践,我们可以更好地利用Hessian来构建高性能的分布式系统。

    S25-hessian反序列化1

    【S25-Hessian反序列化1】是一个关于Java中Hessian序列化库的讨论,主要涉及Hessian与原生Java序列化的差异以及在Spring框架中的应用。Hessian是一种二进制序列化协议,旨在提高远程过程调用(RPC)的效率。与原生Java...

    nacos-hessian-rce.pdf

    本篇文章将针对 `nacos-hessian-rce.md` 文件中提及的一个远程代码执行(Remote Code Execution, RCE)漏洞进行详细分析。该文档由 Y4er.com 在 2023 年 6 月 8 日撰写。此漏洞主要涉及 Nacos 的 7848 端口使用 ...

    hessian-lite-3.2.1-fixed-2.jar

    com.alibaba:hessian-lite:jar:3.2.1-fixed-2 hessian-lite hessian-lite-3.2.1-fixed-2.jar

Global site tag (gtag.js) - Google Analytics