用spirng和hessian构建分布式应用(远程接口)的方法(2)

在成功的将hessian server端也和spring结合后,从整个分布式应用的架构可以看出,无论是服务端与客户端共有的业务接口,还是服务端业务实现类,以及客户端访问远程服务的应用代码里,已经没有一行关于远程操作的代码了。也就是spring让我们的分布式业务开发完全无关于远程访问协议了,这样我们就可以埋头开发服务端和客户端的业务接口、实现、应用等等,二不必关心远程调用究竟要怎么实现。很明显,这也是AOP(面向方面的编程)的一个比较完美的应用,它使远程访问接口和业务逻辑完全无耦合的分开了。设想一下,如果某天我们有需要,远程访问的接口要从rmi、jax-rpc、hessian、httpinvoker之间做切换,也只要改下配置文件就ok了,一行代码都不用改,真的非常exciting。 

接着前面那篇日志,先把spring和hessian在服务端的结合帖上来: 

接口,还是那个接口~;实现,还是那个实现~~;配置却不是了那个配置呀~~~ 

首先,servlet变成了: 
Java代码    收藏代码
  1. <servlet>  
  2.   
  3.    <servlet-name>remote</servlet-name>  
  4.   
  5.    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
  6.   
  7.    <load-on-startup>1</load-on-startup>  
  8.   
  9. </servlet>  
  10.   
  11. <servlet-mapping>  
  12.   
  13.    <servlet-name>remote</servlet-name>  
  14.   
  15.    <url-pattern>/remote/*</url-pattern>  
  16.   
  17. </servlet-mapping>  

其次,applicationContext.xml没有必要了,但是要有个remote-servlet.xml,内容如下: 

Java代码    收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2.   
  3. <!-- edited with XMLSPY v5 rel. 4 U (http://www.xmlspy.com); by whao (mdc); -->  
  4.   
  5. <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">  
  6.   
  7. <beans>  
  8.   
  9.     <description>server properties</description>  
  10.   
  11.     <bean id="_myService_server" class="whao.test.hessian.server.impl.MyServiceImpl">  
  12.   
  13.     </bean>  
  14.   
  15.     <bean name="/myService_server" class="org.springframework.remoting.caucho.HessianServiceExporter">  
  16.   
  17.        <property name="service">  
  18.   
  19.            <ref bean="_myService_server"/>  
  20.   
  21.        </property>  
  22.   
  23.        <property name="serviceInterface">  
  24.   
  25.            <value>whao.test.hessian.server.MyService</value>  
  26.   
  27.        </property>  
  28.   
  29.     </bean>      
  30.   
  31. </beans>  
  32.   
  33.    


这样一来这个hessian服务的发布地址就变成了 http://localhost:8080/test_web/remote/myService_server 

客户端的配置改成: 
Java代码    收藏代码
  1. <bean id="myServiceClient" class="org.springframework.remoting.caucho.HessianProxyFactoryBean">  
  2.   
  3.    <property name="serviceUrl">  
  4.   
  5.        <value>http://localhost:8080/test_web/remote/myService_server</value>  
  6.   
  7.    </property>  
  8.   
  9.    <property name="serviceInterface">  
  10.   
  11.        <value>whao.test.hessian.server.MyService</value>  
  12.   
  13.    </property>  
  14.   
  15. </bean>  



客户端的代码依然是: 
Java代码    收藏代码
  1. MyService service = (MyService);SpringBeanFactory.getBean("myServiceClient");;  
  2.   
  3. System.out.println(service.doSomething("mmmmmmmmm"););;  


运行一下,输出: 

HAHAHA: mmmmmmmmm 

ok! 



嗯,真是不错,下面尝试着不改一行代码,我们把远程协议由hessian改成rmi。 

由于rmi server不用servlet,也就不用web server,所以可以由自己的进程之接启动,我们就把remote-servlet.xml改成beans.xml内容如下: 

Java代码    收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2.   
  3. <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">  
  4.   
  5. <beans>  
  6.   
  7.     <bean id="_myService_server" class="whao.test.hessian.server.impl.MyServiceImpl">  
  8.   
  9.     </bean>  
  10.   
  11.     <bean id="myService_server" class="org.springframework.remoting.rmi.RmiServiceExporter">  
  12.   
  13.        <property name="serviceName"><value>myService_server</value></property>  
  14.   
  15.        <property name="service"><ref bean="_myService_server"/></property>  
  16.   
  17.        <property name="serviceInterface"><value>whao.test.hessian.server.MyService</value></property>  
  18.   
  19.     </bean>  
  20.   
  21. </beans>  
  22.   
  23.    


然后随便写个main程序启动服务,就不用启动web server了: 

Java代码    收藏代码
  1. /* 
  2.  
  3.  * Created on 2005-7-31 
  4.  
  5.  * 
  6.  
  7.  */  
  8.   
  9. package whao.test.rmi;  
  10.   
  11.    
  12.   
  13. import org.springframework.context.ApplicationContext;  
  14.   
  15. import org.springframework.context.support.FileSystemXmlApplicationContext;  
  16.   
  17.    
  18.   
  19. /** 
  20.  
  21.  * @author Hao Wei 
  22.  
  23.  * 
  24.  
  25.  */  
  26.   
  27. public class Server {  
  28.   
  29.          public static void main(String[] args); throws Exception{  
  30.   
  31.              ApplicationContext ctx = new FileSystemXmlApplicationContext("D:\\whao-work\\src\\test_web\\src_server\\beans.xml");;  
  32.   
  33.              ctx.getBean("myService_server");;  
  34.   
  35.                    System.out.println("Server started");;  
  36.   
  37.          }  
  38.   
  39. }  



这样,我们的服务接口和实现类的代码一行不用动,而变成rmi协议的服务已经以rmi://localhost/myService_server 的url启动了。

然后在把客户端的配置略微调整一下: 
Java代码    收藏代码
  1. <bean id="myServiceClient" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">  
  2.   
  3.    <property name="serviceUrl">  
  4.   
  5.        <value>rmi://localhost/myService_server</value>  
  6.   
  7.    </property>  
  8.   
  9.    <property name="serviceInterface">  
  10.   
  11.        <value>whao.test.hessian.server.MyService</value>  
  12.   
  13.    </property>  
  14.   
  15. </bean>  

客户端的代码也一行不动,在执行下,输出依然是: 

HAHAHA: mmmmmmmmm 

ok! 

然而,我们的remoting其实已经由基于http的hessian改成了rmi。果然不错啊,除了hessian,rmi之外,现在spring支持的remoting协议还包括jax-rpc,burlap,httpinvoker,也就是说我们的remoting操作协议在这些中间切换时,利用spring remoting框架,都可以不用改一行代码,已经非常强大了,只是现在还没有corba的支持。

你可能感兴趣的:(hessian)