摘要:Hessian经常作为服务内部RPC工具来使用,速度快效率高。重构代码的核心思想就是把共用的代码段提出来,使代码结构优化;架构设计类似,把基本的共用的服务提出来,使架构优化。下面讲述一下我在具体应用中使用Spring3.2.4在Tomcat7.0.47下发布Hessian4.0.37服务的过程。
关键词:Spring, Hessian, JAVA, 架构设计, Hibernate, Tomcat

 
Hessian经常作为服务内部RPC远程过程调用工具来使用,速度快效率高,我们的项目也不例外的使用了它。把一些基础的服务,被别的服务使用的服务,专门提出来,使用Hessian发布一个单独的服务,供别的服务使用。我发现这里的逻辑,设计理念与《重构》这本书里的思想如出一辙,重构代码的核心思想就是把共用的代码段提出来,采用优良的设计模式,来把代码结构优化。架构设计也是,把基本的共用的服务提出来,把架构优化。提出的服务当然要求性能很高,处理正确,运行稳定,Hessian是一个好的选择。
 
当然Netty和Mina也是常用的Java NIO框架,它们的性能同样优良,我们也可以利用它来发布服务,不过实现起来不如Hessian来的方便。因此,在工具的选择上,我选择了Hessian支持我们的系统架构。
 
Hessian的好处有很多,它可以支持C#客户端调用我们使用JAVA编写的服务,并且性能超群,传输速率很高。发布Hessian服务时,它也支持集成Spring,下面就讲述一下我在具体应用中使用Spring3.2.4在Tomcat7.0.47下发布Hessian4.0.37服务的过程。
 
一、将project发布成Hessian服务
 
首先在WEB-INF目录下配置web.xml文件,如下所示。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <servlet>  
        <servlet-name>remoting</servlet-name>  
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
        <load-on-startup>1</load-on-startup>  
  </servlet>  
  <servlet-mapping>  
        <servlet-name>remoting</servlet-name>  
        <url-pattern>/</url-pattern>  
  </servlet-mapping> 

</web-app>

 
由于使用了Spring框架,还需要Spring相关的配置,这里在WEB-INF目录下添加remoting-servlet.xml文件。
<?xml version="1.0" encoding="UTF-8"?>  
<beans xmlns="http://www.springframework.org/schema/beans"    xmlns:p="http://www.springframework.org/schema/p" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:aop="http://www.springframework.org/schema/aop"     xmlns:tx="http://www.springframework.org/schema/tx"     
    xsi:schemaLocation="http://www.springframework.org/schema/beans  
                        http://www.springframework.org/schema/beans/spring-beans-3.2.xsd 
                        http://www.springframework.org/schema/context  
                        http://www.springframework.org/schema/context/spring-context-3.2.xsd  
                        http://www.springframework.org/schema/tx  
                        http://www.springframework.org/schema/tx/spring-tx-3.2.xsd  
                        http://cxf.apache.org/jaxws   
                        http://cxf.apache.org/schemas/jaxws.xsd">            
    <bean id="sessionFactory"
        class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"
        p:configLocation="/WEB-INF/hibernate.cfg.xml">
    </bean>
 
    <bean id="transactionManager"
        class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>
    <tx:annotation-driven transaction-manager="transactionManager" />    
    <context:component-scan base-package="com.wang.anqi.model" />
    <context:component-scan base-package="com.wang.anqi.dao.impl" />      
    <!-- 发布bean -->      
    <bean id="roleBLLImpl" class="com.wang.anqi.dataBll.impl.RoleBLLImpl" />       
    <bean name="/role-svc"  
            class="org.springframework.remoting.caucho.HessianServiceExporter"> 
            <property name="service" ref="roleBLLImpl" />  
            <property name="serviceInterface" value="com.wang.anqi.dataBll.RoleBLL" />  
    </bean>    
    <!-- 发布bean --> 
</beans>  
 
可以看到remoting-servlet.xml文件中引用了hibernate.cfg.xml文件,自然也要将hibernate.cfg.xml添加到WEB-INF目录下来,大家可以配合我的另一篇博客 关于项目中的DAL数据接入层架构设计 理解这里的Spring配置。添加相关的JAR包,将project打包成WAR包放在Tomcat的webapps目录下,启动Tomcat。
 
能配合Eclipse调试是最好不过了,你需要在Eclipse/Window/Preferences下的Server/Runtime Environments配置上你的Apache Tomcat v7.0,主要是把下载的apache-tomcat-7.0.47路径设好。然后去Window/Show View把Servers界面调出来,添加Tomcat v7.0 Server at localhost。File/New建立Dynamic Web Project,新建的Dynamic Web Project如果要使用其它的project里的代码,则右键它,打开Properties,在Deplyment Assembly中Add其它的project。右键它,点击Debug As/Debug on Server,就可以看到它在Tomcat v7.0 Server at localhost中运行了。可能会报错,记住把所有引用的jar包丢到apache-tomcat-7.0.47路径lib下,注意jar版本号不一致要去除。
 
启动成功后,在浏览器地址栏中输入:http://localhost/***HessianService/role-svc,如果在浏览器中出现的是 HTTP Status 405 - HessianServiceExporter only supports POST requests 而不是404便说明发布成功。
 
二、调用Hessian服务
 
那么其它的使用此基础服务的服务便可以以“客户"的形式来使用Hessian服务了,同样,在JAVA中调用Hessian服务也可以使用Spring,下面是spring.xml配置文件。
<?xml version="1.0" encoding="UTF-8"?>  
<beans xmlns="http://www.springframework.org/schema/beans"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"  
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"  
    xsi:schemaLocation="http://www.springframework.org/schema/beans  
                        http://www.springframework.org/schema/beans/spring-beans-3.2.xsd 
           http://www.springframework.org/schema/context  
           http://www.springframework.org/schema/context/spring-context-3.2.xsd  
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd  

http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd">

    <bean id="roleBLLImpl"  
        class="org.springframework.remoting.caucho.HessianProxyFactoryBean">  
        <property name="serviceUrl">  
        <value>http://localhost/***HessianServcie/role-svc</value>  
        </property>  
        <property name="serviceInterface">  
            <value>com.wang.anqi.dataBll.RoleBLL</value>
        </property>

</bean> 
</beans> 

 
我们自己来管理这Spring上下文,RoleBLL的实例可以通过下面的代码:RoleBLL m_roleBLL = (RoleBLL) SpringServiceSupport.getContext().getBean("roleBLLImpl"); 来获取到。如此一来,就可以其它编写其它服务啦,真是带劲。
 
补充说一句,《重构》这本书里处处使用着测试驱动开发的思想,当然这对于充分保证代码逻辑的正确性是非常有好处的;类似的,把共用服务提取出来,作为基础服务,与不提出来代码、架构都变化许多,这时我们也需要有充分的保证,业务逻辑的正确性,毕竟是通过网络来RPC远程过程调用的,对象的网络传输还是有一定的风险的,不过从目前的使用来看,JAVA之间的远程过程调用一点问题都没有,我们也对每个接口写了网络调用的测试,开发简单,正确性高,性能优良!
 
Hessian的服务发布及使用倒是很简单,不简单的是这种系统架构设计的思想。《重构》是一本好书,值得我再读很多遍。
 
现期的任务真是很多啊,责任又很重大。
 
后台服务架构设计完了,JAVA服务编码、服务发布不要紧,要紧的是还要开发部分很久没写的C#前端,更要紧的是尽快开发完毕(我真是个厉害的角色),最要紧的是我来负责管理这个项目的开发进度,并且鼓舞大家开发的士气,有什么疑难杂症要不断的解决处理,还要带俩实习生。
 
做了不止两个PM的活,真是既当爹又当妈又当小孩,疼并快乐着,且码且珍惜啊!
 
加油,王安琪!
 
 

来自王安琪http://www.cnblogs.com/wgp13x/

发布Hessian服务作为服务内部基础服务的更多相关文章

  1. 朱晔的互联网架构实践心得S2E7:漫谈平台架构的工作(基础架构、基础服务、基础平台、基础中间件等等)

    前言 程序开发毕竟还不是搬砖这种无脑体力劳动,需要事先有标准,有架构,有设计,绝对不是新公司今天创立,明天就可以开始编码的.其实很多公司在起步的时候没有财力和资源建设独立的基础架构或平台架构部门,甚至 ...

  2. Nmap扫描教程之网络基础服务DHCP服务类

    Nmap扫描教程之网络基础服务DHCP服务类 Nmap网络基础服务 网络基础服务是网络正常工作的基石,常见的网络基础服务包括DHCP服务和DNS服务.其中,DHCP服务用来为计算机动态分配IP地址:D ...

  3. .Net 分布式云平台基础服务建设说明概要

    1)  背景 建设云平台的基础框架,用于支持各类云服务的业务的构建及发展. 2)  基础服务 根据目前对业务的理解和发展方向,总结抽象出以下几个基础服务,如图所示 3)  概要说明 基础服务的发展会根 ...

  4. SOA 架构中的ESB是更好的应用于异构系统集成整合还是用于统一服务调用/基础服务实施

    一.讨论主题与观点 写一篇文章.发现一次自觉得有意思的SOA架构方面的讨论,源于昨天AgileEAS.NET SOA 平台群(113723486)里几个群友的一次关于ESB的一次讨论. 大家的讨论观点 ...

  5. .net 基础服务开源战略规划备忘录

    公司现状 1. 技术人员水平限制: 基础研发人员技术细节,性能处理能力不足,技术视野不够开阔;甚至一些高可用,高性能方案的概念都未听闻,更别提发展方向和思路了,令人痛心. 2. 技术反馈渠道限制: 公 ...

  6. 深入浅出微服务框架dubbo(一):基础篇

    一.基础篇 1.1 开篇说明 dubbo是一个分布式服务框架,致力于提供高性能透明化RPC远程调用方案,提供SOA服务治理解决方案.本文旨在将对dubbo的使用和学习总结起来,深入源码探究原理,以备今 ...

  7. .Net 大型分布式基础服务架构横向演变概述

    一. 业务背景 构建具备高可用,高扩展性,高性能,能承载高并发,大流量的分布式电子商务平台,支持用户,订单,采购,物流,配送,财务等多个项目的协作,便于后续运营报表,分析,便于运维及监控. 二. 基础 ...

  8. 安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情7. 安装 PHP PHP 是用于 web 基础服务的服务器端脚本语言。它也经常被用作通用编程语言。在最小化安装的 CentOS 中安

    CentOS 是一个工业标准的 Linux 发行版,是红帽企业版 Linux 的衍生版本.你安装完后马上就可以使用,但是为了更好地使用你的系统,你需要进行一些升级.安装新的软件包.配置特定服务和应用程 ...

  9. SpringCloud系列二:Restful 基础架构(搭建项目环境、创建 Dept 微服务、客户端调用微服务)

    1.概念:Restful 基础架构 2.具体内容 对于 Rest 基础架构实现处理是 SpringCloud 核心所在,其基本操作形式在 SpringBoot 之中已经有了明确的讲解,那么本次为 了清 ...

随机推荐

  1. 【微信小程序】采坑之scroll-view组件

    一.摘要 今天在使用scroll-view组件的时候发现结果跟预想的不一样.其实也不是第一次用了,同样的写法却出现了意料之外的效果,所以认定是bug了.博主使用的是2.3.0版本,所以之前的版本应该也 ...

  2. WPF的ComboBox简单用法

    1. ComboBox:下拉列表框 效果如下: 2.通常用法是 显示内容 + 选中内容后获得的值(也就是 Name = Value的键值对) 故以键值对来定义一个类,如: public class C ...

  3. 【c++】构造函数初始化列表中成员初始化的次序性

    上代码 #include <iostream> using namespace std; class A { public: A(int v): j(v + 2), i(j) {} voi ...

  4. Exception from System.loadLibrary(smjavaagentapi) java.lang.UnsatisfiedLinkError: no smjavaagentapi in java.library.path

    可能原因: 缺少smjavaagentapi.jar文件或者libsjavaagentapi.so缺少相关的依赖包. 解决方法: 1. 检查sso的lib下面是否有smjavaagentapi.jar ...

  5. 【ES6】var、let、const三者的区别

    首先,一个常见的问题是,ECMAScript 和 JavaScript 到底是什么关系? ECMAScript是一个国际通过的标准化脚本语言.JavaScript由ECMAScript和DOM.BOM ...

  6. online contest

    http://atcoder.jp/contest https://nanti.jisuanke.com/contest http://codeforces.com/ https://www.nowc ...

  7. win8及以上2012 R2,virtualbox 5.0.20安装centOS6以上各种注意事项

    问题: Virtul Box 安装增强功能时, 未能加载虚拟光盘VBoxGuestAdditions.iso 1.先下载适合win8及2012 R2以上系统适用的virtualbox最新版5.0.20 ...

  8. [android] 安卓自定义样式和主题

    简单练习自定义样式和主题,样式是加在View上,主题是加在Application或者Activity上 styles.xml <?xml version="1.0" enco ...

  9. Python中元组和列表

    一.list列表的操作包括以下函数: 列表操作包括以下函数: 1.cmp(list1,list2) :比较两个列表的元素 2.len(list) :列表元素个数 3.max(list) :返回列表元素 ...

  10. 用iframe踩的坑

    1.无法监控iframe加载成功与否 经测试,火狐及chorme都不支持onerror事件,而且,不管iframe加载是否成功,都会触发onload事件. 1)通过postmessage消息提示是否加 ...