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的支持。
  • 相关阅读:
    MySQL练习题
    MySql基础操作
    解决使用IDEA启动Tomcat成功但localhost:8080无法访问的问题
    1417. 重新格式化字符串--来源:力扣(LeetCode)
    字符消除
    Comsol中Absolute Pressure的解释
    气体流量与质量流率换算
    FileZilla MLSD错误:连接超时、读取目录列表失败
    Avalon总线的地址对齐与NIOS编程
    同步复位和异步复位--好文章就是要记录下来
  • 原文地址:https://www.cnblogs.com/chenying99/p/2555458.html
Copyright © 2011-2022 走看看