在成功的将hessian server端也和spring结合后,从整个分布式应用的架构可以看出,无论是服务端与客户端共有的业务接口,还是服务端业务实现类,以及客户端访问远程服务的应用代码里,已经没有一行关于远程操作的代码了。也就是spring让我们的分布式业务开发完全无关于远程访问协议了,这样我们就可以埋头开发服务端和客户端的业务接口、实现、应用等等,二不必关心远程调用究竟要怎么实现。很明显,这也是AOP(面向方面的编程)的一个比较完美的应用,它使远程访问接口和业务逻辑完全无耦合的分开了。设想一下,如果某天我们有需要,远程访问的接口要从rmi、jax-rpc、hessian、httpinvoker之间做切换,也只要改下配置文件就ok了,一行代码都不用改,真的非常exciting。
接着前面那篇日志,先把spring和hessian在服务端的结合帖上来:
接口,还是那个接口~;实现,还是那个实现~~;配置却不是了那个配置呀~~~
首先,servlet变成了:
其次,applicationContext.xml没有必要了,但是要有个remote-servlet.xml,内容如下:
这样一来这个hessian服务的发布地址就变成了 http://localhost:8080/test_web/remote/myService_server
客户端的配置改成:
客户端的代码依然是:
运行一下,输出:
HAHAHA: mmmmmmmmm
ok!
嗯,真是不错,下面尝试着不改一行代码,我们把远程协议由hessian改成rmi。
由于rmi server不用servlet,也就不用web server,所以可以由自己的进程之接启动,我们就把remote-servlet.xml改成beans.xml内容如下:
然后随便写个main程序启动服务,就不用启动web server了:
这样,我们的服务接口和实现类的代码一行不用动,而变成rmi协议的服务已经以rmi://localhost/myService_server 的url启动了。
然后在把客户端的配置略微调整一下:
客户端的代码也一行不动,在执行下,输出依然是:
HAHAHA: mmmmmmmmm
ok!
然而,我们的remoting其实已经由基于http的hessian改成了rmi。果然不错啊,除了hessian,rmi之外,现在spring支持的remoting协议还包括jax-rpc,burlap,httpinvoker,也就是说我们的remoting操作协议在这些中间切换时,利用spring remoting框架,都可以不用改一行代码,已经非常强大了,只是现在还没有corba的支持。
接着前面那篇日志,先把spring和hessian在服务端的结合帖上来:
接口,还是那个接口~;实现,还是那个实现~~;配置却不是了那个配置呀~~~
首先,servlet变成了:
Java代码
- <servlet>
- <servlet-name>remote</servlet-name>
- <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
- <load-on-startup>1</load-on-startup>
- </servlet>
- <servlet-mapping>
- <servlet-name>remote</servlet-name>
- <url-pattern>/remote/*</url-pattern>
- </servlet-mapping>
其次,applicationContext.xml没有必要了,但是要有个remote-servlet.xml,内容如下:
Java代码
- <?xml version="1.0" encoding="UTF-8"?>
- <!-- edited with XMLSPY v5 rel. 4 U (http://www.xmlspy.com); by whao (mdc); -->
- <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
- <beans>
- <description>server properties</description>
- <bean id="_myService_server" class="whao.test.hessian.server.impl.MyServiceImpl">
- </bean>
- <bean name="/myService_server" class="org.springframework.remoting.caucho.HessianServiceExporter">
- <property name="service">
- <ref bean="_myService_server"/>
- </property>
- <property name="serviceInterface">
- <value>whao.test.hessian.server.MyService</value>
- </property>
- </bean>
- </beans>
这样一来这个hessian服务的发布地址就变成了 http://localhost:8080/test_web/remote/myService_server
客户端的配置改成:
Java代码
- <bean id="myServiceClient" class="org.springframework.remoting.caucho.HessianProxyFactoryBean">
- <property name="serviceUrl">
- <value>http://localhost:8080/test_web/remote/myService_server</value>
- </property>
- <property name="serviceInterface">
- <value>whao.test.hessian.server.MyService</value>
- </property>
- </bean>
客户端的代码依然是:
Java代码
- MyService service = (MyService);SpringBeanFactory.getBean("myServiceClient");;
- System.out.println(service.doSomething("mmmmmmmmm"););;
运行一下,输出:
HAHAHA: mmmmmmmmm
ok!
嗯,真是不错,下面尝试着不改一行代码,我们把远程协议由hessian改成rmi。
由于rmi server不用servlet,也就不用web server,所以可以由自己的进程之接启动,我们就把remote-servlet.xml改成beans.xml内容如下:
Java代码
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
- <beans>
- <bean id="_myService_server" class="whao.test.hessian.server.impl.MyServiceImpl">
- </bean>
- <bean id="myService_server" class="org.springframework.remoting.rmi.RmiServiceExporter">
- <property name="serviceName"><value>myService_server</value></property>
- <property name="service"><ref bean="_myService_server"/></property>
- <property name="serviceInterface"><value>whao.test.hessian.server.MyService</value></property>
- </bean>
- </beans>
然后随便写个main程序启动服务,就不用启动web server了:
Java代码
- /*
- * Created on 2005-7-31
- *
- */
- package whao.test.rmi;
- import org.springframework.context.ApplicationContext;
- import org.springframework.context.support.FileSystemXmlApplicationContext;
- /**
- * @author Hao Wei
- *
- */
- public class Server {
- public static void main(String[] args); throws Exception{
- ApplicationContext ctx = new FileSystemXmlApplicationContext("D:\\whao-work\\src\\test_web\\src_server\\beans.xml");;
- ctx.getBean("myService_server");;
- System.out.println("Server started");;
- }
- }
这样,我们的服务接口和实现类的代码一行不用动,而变成rmi协议的服务已经以rmi://localhost/myService_server 的url启动了。
然后在把客户端的配置略微调整一下:
Java代码
- <bean id="myServiceClient" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
- <property name="serviceUrl">
- <value>rmi://localhost/myService_server</value>
- </property>
- <property name="serviceInterface">
- <value>whao.test.hessian.server.MyService</value>
- </property>
- </bean>
客户端的代码也一行不动,在执行下,输出依然是:
HAHAHA: mmmmmmmmm
ok!
然而,我们的remoting其实已经由基于http的hessian改成了rmi。果然不错啊,除了hessian,rmi之外,现在spring支持的remoting协议还包括jax-rpc,burlap,httpinvoker,也就是说我们的remoting操作协议在这些中间切换时,利用spring remoting框架,都可以不用改一行代码,已经非常强大了,只是现在还没有corba的支持。