挽救老旧工程,记桥接SpringMVC与Stripes框架_玖富娱


玖富娱乐是一家为代理招商,直属主管信息发布为主的资讯网站,同时也兼顾玖富娱乐代理注册登录地址。

配景:

  公司基础设施部分推出了本身的微效劳框架(以下简称M),要求一切营业运用都要接入进去,但坑爹的是M只供应了SpringMVC工程的support,关于接纳Stripes作为MVC框架的运用其实不支撑,以是就必须重构这个Stripes运用。

  M虽然替代Tomcat本身完成了IO,事变线程池,效劳注册发明等等,但照样供应了对Servlet范例的简朴支撑(移除web.xml,filter,listener, 打包体式格局也改成了tar.gz,保留了ServletContext,request,response等等)。

思绪与剖析:

  由于现有运用的营业逻辑照样比较复杂(沉淀了3,4年),且涉及到多个APP端和其他第三方的交互,以是若是想对运用做完整的重构是一件非常头痛的事变,不只要投入大批的后端,测试等人力本钱,并且全部重构周期也会比较长,影响到对其他需求的相应。

  因而在想:既然SpringMVC和Stripes都遵照Servlet范例,而M又能支撑SpringMVC,是不是能够经由过程SpringMVC阻拦到一切要求后,把之前的老接口的要求转发给Stripes处置惩罚,今后新开辟的接口就直接走SpringMVC,如许既兼容了公司的M框架也对原有运用的修改较小,开辟周期短,测试职员只须要考证一些体系界限和重要流程,不消再挨个挨个考证已有的营业逻辑,如许能够节约大批人力本钱,收缩开辟周期。

  SpringMVC是现在最盛行的MVC框架,是Spring重大家属的一员,而Stripes也是一个非常轻量的MVC框架,然则SpringMVC的Controller跟Stripes的ActionBean有个很明显的区分就是前者是单例的,跟状况无关,一切的要求参数都是封装在ServletRequest中的,而后者是prototype,每次要求都邑从新天生一个ActionBean工具。

 

着手完成原型:

-玖富娱乐是一家为代理招商,直属主管信息发布为主的资讯网站,同时也兼顾玖富娱乐代理注册登录地址。-

       新建桥接工程XXX-bridge,一切新增代码均放在新工程,对老工程零侵入,仅新增了pom文件里的两个plugin,能够完成Stripes和SpringMVC两种框架形式下的并行开辟,(本来的老工程延续有需求进来)。

    /**
     * 阻拦一切要求,若是能映照到Stripes则直接派发给Stripes并return false;
     * 若是不克不及映照则回退给SpringMVC
     */
    @Override
    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
        if (handlerMapping.isEmpty()) {
            return true;
        }
        String url = httpServletRequest.getRequestURI();
        String contextPath = httpServletRequest.getContextPath();
        url = url.replace(contextPath, "").replaceAll("/ ", "/");
        LOGGER.info("以后要求途径: {}", url);
        if (!StripesContextHandlerInterceptor.handlerMapping.containsKey(url)) {
            LOGGER.info("要求由SpringMVC处置惩罚: {}", url);
            return true;
        }
        try {
            LOGGER.info("要求由Stripes处置惩罚: {}", url);
            StripesContextHolder.doService(httpServletRequest.getServletContext(), getApplicationContext(),
                    httpServletRequest, httpServletResponse);
            return false;
        } catch (Exception e) {
            LOGGER.error("处置惩罚要求非常:", e);
            return false;
        }
    }

       症结点在于要剖析到一切的老接口地点,然后经由过程阻拦器来推断以后要求是不是是老接口,是的话就转发给Stripes来处置惩罚。其他细致的代码托管在github(已排撤除公司相干信息)

       https://github.com/hiccup234/web-advance/blob/master/bridge.rar

题目与考证:

       1、由于初始化Stripes须要 ServletContext,然则运用启动时却没设施获取到 ServletContext 工具,以是在 StripesContextHolder 里做了懒加载,只有当第一个要求进来后才初始化Stripes。

  2、Stripes是支撑queryString为空的查询的,相似:http://127.0.0.1/server/test?list 这类,而M会在剖析要求参数的时刻对这类状况直接抛非常,经由与基础设施同事协商,他们做出妥协,对这类要求的状况直接放行给运用,从而避免了前端和第三方做革新。

 

今晚上线胜利,现在跟Tomcat并行宣布,5%的流量灰度,视察日记一切正常。前期的手艺考证加上近一月的开辟测试到本日的上线,算是向着架构的偏向迈出了小小一步。

 

未完待续...

-玖富娱乐是一家为代理招商,直属主管信息发布为主的资讯网站,同时也兼顾玖富娱乐代理注册登录地址。