zoukankan      html  css  js  c++  java
  • 请求路由到业务方法设计(1)-我们到底能走多远系列(43)

    我们到底能走多远系列(43)  

      常规的web项目,比如用springmvc这种框架,要来将某个url的请求指定到某个 Controller 里的某个方法,这个方法负责将具体的业务完成即可。这件事我们熟悉不过,可是它是怎么做到的,也可以翻看源码阅读
    像这种,需要完成路由工作的事情在实际项目中可能也会出现,其实任何一个需要处理请求的框架都需要解决这个问题。
    先抛出问题,后续文章用一个例子来完整设计一个方案。还有可以看一下其他各种框架都是如何解决这个问题的,值得研究。
     
    简化这件事情:
    我们就干一件事,哪就是如何在处理请求时,安排对应的具体的业务方法来执行。
    1,用一个map,把对用的请求中key(假设传的事json,里面有个key,来表示什么业务),和对应的类关联起来,
    2,用模版方法,把图中三个流程串起来,其中业务处理子类实现,每个子类都有一个doservice方法
    3,处理请求时都会解析json,拿到key,再从map中取出指定的实例,执行doservice方法即可。
     
    代码简略如下: 
    请求假设先到达RemoteOpenServiceImpl的executeOpenService方法,直接路由找到要执行的业务实例。
    public interface RemoteOpenService {
    
        public JSON executeOpenService(JSON json, String method);
    }
    public class RemoteOpenServiceImpl implements RemoteOpenService{
    
        @Override
        public JSON executeOpenService(JSON json, String method) {
            JSON returnJson = null;
            BaseService service = (BaseService) OpenServiceRouter.getRouterMap().get(method);
            returnJson = service.execute(json, ExampleRequest.class);
            
            return returnJson;
        }
    
        
    }
    OpenServiceRouter:
    public class OpenServiceRouter {
    
        private static Map<String, Object> routerMap;
        
        public static Map<String, Object> getRouterMap(){
            if(routerMap != null){
                return routerMap;
            }
            routerMap = new HashMap<String, Object>();
            routerMap.put("example", "exampleService");
            return routerMap;
        }
        
        
    }

    模版方法设计:实际执行的时service的excute方法,而这个方法执行中把业务部分的实现留给子类实现。

    public interface BaseService {
    
        public JSON execute(JSON json, Class c);
    }
    public abstract class AbstractBaseService implements BaseService{
    
        // TODO
        public final Request decode(JSON json, Class c){
            ObjectMapper mapper = new ObjectMapper();
            Request request = null;
            try {
                request = mapper.readValue(json.toJSONString(), c);
            } catch (JsonParseException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (JsonMappingException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } 
            return request;
        }
        // TODO
        public final JSON encode(Response response){
            ObjectMapper mapper = new ObjectMapper();  
            
            // Convert object to JSON string  
            JSON json = null;
            try {
                String j =  mapper.writeValueAsString(response);
                json = JSON.parseObject(j);
            } catch (JsonGenerationException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (JsonMappingException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return json;
        }
        
        /**
         * 子类不同实现具体逻辑
         * @param request
         */
        public abstract Response doService(Request request);
        
        /**
         * 模版执行方法
         * @param json
         */
        public final JSON execute(JSON json, Class c){
            Request request = this.decode(json, c);
            Response response = doService(request);
            JSON retrunJson = this.encode(response);
            return retrunJson;
        }
    }

    子类的实现:

    public class ExampleServiceImpl extends AbstractBaseService{
    
        @Override
        public Response doService(Request request) {
            ExampleRequest exampleRequest = (ExampleRequest)request;
            
            return null;
        }
    
    }

    因为刚好需要设计一个这样的被调用的组件,我就想好多地方会遇到这个场景,所以值得深入进来研究一下,以上是我想,不参考任何框架,以最原始的方式去实现一个这样的请求路由。
    作为笔记的一部分,先开个头,后续研究下其他框架对这个问题的设计。
    后续文章:

    《请求路由到业务方法设计(2)》
  • 相关阅读:
    数据导入
    数据库导入导出命令
    题库
    struts2的配置文件简洁
    修改oralce11g 字符集为ZHS16GBK
    Linux上安装JDK+Tomcat
    Android中adb的使用
    【转】Android获取IP的方法,并可以判断手机是否联网
    Android中R.java没有自动生成问题
    Android中SQLiteOpenHelper的理解
  • 原文地址:https://www.cnblogs.com/killbug/p/4557610.html
Copyright © 2011-2022 走看看