服务分离的方式有时候显得很高深,总是觉得API的方式不那么靠谱,所以,玩玩远程调用来让系统显得性感一点。性感的装扮有多种,总得找个适合自己的玩 法,虽然本人不善打扮,对打扮系统的方法还是知道那么几个滴。Spring做了远程调用的封装,为了假装自己不是一个轮子的重复制造者,还是让系统在 Sping框架上实现了。
Spring的远程调用大概有以下几种:RMI,HttpInvoker,Hessian,Burlap,JAX RPC,JAX-WS,JMS,Jetty+Servlet 。偶只玩过RMI,HttpInvoker,JMS。其他几种也是听说了下。当然,同集群内的的服务,用 RMI,HttpInvoker,Jetty+Servlet都是较好选择(限本人了解的情况)。
Spring RMI:
推荐你去看文档了解具体的配置细节,这种玩法的优点是:在远程启动服务后,你可以像调用本地bean一样调用远程的bean,如果考虑下安全问题加一个 taken或密钥,简单,实用,满足同集群的多数需求。
Spring HttpInvoker:
继续去看文档吧!这个需要依赖HttpClient包,有个依赖,总是觉得不爽,而且在web.xml中也需要配置相关的servlet的信息,所以总是 感觉有点麻烦,然后还需要在远程调用的时候返回做相关的bean,能用,不够简洁。
Spring + Jetty:
Ya!这个不是我想出来的,这样玩只是孙*的建议。启动Spring的时候,就能把相关的servlet服务暴露出去。当然,返回的就是 HttpServlet了,没有你渴望的bean,我有点忽悠你了,可是如果返回一个流行的json,是不是也算玩远程调用了。玩嘛……
首先你还是需要到jetty的官网上去下载个jetty来,把lib/jetty-6.1.24.jar,jetty-util- 6.1.24.jar,servlet-api-2.5-20081211.jar加入到你的工程的编译目录下面,如果你用maven的话,在 pom.xml配置一下:
<dependency>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty</artifactId>
<version>6.1.24</version>
</dependency>
建一个servlet,简单的如下:
public class HelloWorldServlet extends HttpServlet {
private static final long serialVersionUID = 1347334624L;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String name = request.getParameter("name");
if (name != null) {
name = new String(name.getBytes("ISO-88590-1"),"utf-8");
} else {
name = "longhao";
}
PrintWriter out;
String title = "HelloWorld";
response.setContentType("text/html;charset=GB2312");
out = response.getWriter();
out.print("<html><head><title>" + title + "</title>");
out.print("</head><body>");
out.println("<h1><p> Hello " + name + "</p></h1>");
out.print("</body></html>");
out.close();
}
}
然后配置一把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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean name="WebServer" class="org.mortbay.jetty.Server"
init-method="start">
<property name="connectors">
<list>
<bean name="LocalSocket" class="org.mortbay.jetty.nio.SelectChannelConnector">
<property name="host" value="localhost" />
<property name="port" value="8080" />
</bean>
</list>
</property>
<property name="handlers">
<list>
<bean class="org.mortbay.jetty.servlet.Context">
<property name="contextPath" value="/" />
<property name="sessionHandler">
<bean class="org.mortbay.jetty.servlet.SessionHandler" />
</property>
<property name="resourceBase" value="d:/jetty" />
<property name="servletHandler">
<bean class="org.mortbay.jetty.servlet.ServletHandler">
<property name="servlets"> <!-- servlet definition -->
<list>
<!-- default servlet -->
<bean class="org.mortbay.jetty.servlet.ServletHolder">
<property name="name" value="DefaultServlet" />
<property name="servlet">
<bean class="org.mortbay.jetty.servlet.DefaultServlet" />
</property>
<property name="initParameters">
<map>
<entry key="resourceBase" value="d:/jetty" />
</map>
</property>
</bean>
<bean class="org.mortbay.jetty.servlet.ServletHolder">
<property name="name" value="HelloWorldServlet" />
<property name="servlet">
<bean class="com.longtask.spring.HelloWorldServlet" />
</property>
<property name="initParameters">
<map>
<entry key="resourceBase" value="d:/jetty" />
</map>
</property>
</bean>
</list>
</property>
<property name="servletMappings">
<list><!-- servlet mapping -->
<bean class="org.mortbay.jetty.servlet.ServletMapping">
<property name="pathSpecs">
<list>
<value>/</value>
</list>
</property>
<property name="servletName" value="DefaultServlet" />
</bean>
<bean class="org.mortbay.jetty.servlet.ServletMapping">
<property name="pathSpecs">
<list>
<value>/hello</value>
</list>
</property>
<property name="servletName" value="HelloWorldServlet" />
</bean>
</list>
</property>
</bean>
</property>
</bean>
<!-- log handler -->
<bean class="org.mortbay.jetty.handler.RequestLogHandler">
<property name="requestLog">
<bean class="org.mortbay.jetty.NCSARequestLog">
<property name="append" value="true" />
<property name="filename" value="d:/jetty/log/request.log.yyyy_mm_dd" />
<property name="extended" value="true" />
<property name="retainDays" value="999" />
<property name="filenameDateFormat" value="yyyy-MM-dd" />
</bean>
</property>
</bean>
</list>
</property>
</bean>
</beans>
打开你的浏览器,输入:http://localhost:8080/hello ,恭喜,看到了hello longhao 。什么原因,你懂滴!
由于个人不太喜欢用HttpInvoker的方式调用,所以推荐的排序是:RMI > Jetty + Servlet > HttpInvoker。环肥燕瘦啊!如果你的爱好不同,请低调的告诉我,保持低调。