zoukankan      html  css  js  c++  java
  • 用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的支持。
  • 相关阅读:
    Get distinct count of rows in the DataSet
    单引号双引号的html转义符
    PETS Public English Test System
    Code 39 basics (39条形码原理)
    Index was outside the bounds of the array ,LocalReport.Render
    Thread was being aborted Errors
    Reportviewer Error: ASP.NET session has expired
    ReportDataSource 值不在预期的范围内
    .NET/FCL 2.0在Serialization方面的增强
    Perl像C一样强大,像awk、sed等脚本描述语言一样方便。
  • 原文地址:https://www.cnblogs.com/chenying99/p/2555458.html
Copyright © 2011-2022 走看看