0
0

Spring的同集群内的远程调用的3种方法

longhao 发表于 2010年07月27日 10:04 | Hits: 2543
Tag: Java | httpclient | httpinvoker | jetty | rmi | servlet | 远程调用

    服务分离的方式有时候显得很高深,总是觉得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。环肥燕瘦啊!如果你的爱好不同,请低调的告诉我,保持低调。

原文链接: http://www.longtask.com/blog/?p=578

0     0

评价列表(0)