IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

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

    longhao (longtask@gmail.com)发表于 2010-07-26 20:04:07
    love 0

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



沪ICP备19023445号-2号
友情链接