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)》
  • 相关阅读:
    动态生成 Excel 文件供浏览器下载的注意事项
    JavaEE 中无用技术之 JNDI
    CSDN 泄露用户密码给我们什么启示
    刚发布新的 web 单点登录系统,欢迎下载试用,欢迎提建议
    jQuery jqgrid 对含特殊字符 json 数据的 Java 处理方法
    一个 SQL 同时验证帐号是否存在、密码是否正确
    PostgreSQL 数据库在 Windows Server 2008 上安装注意事项
    快速点评 Spring Struts Hibernate
    Apache NIO 框架 Mina 使用中出现 too many open files 问题的解决办法
    解决 jQuery 版本升级过程中出现 toLowerCase 错误 更改 doctype
  • 原文地址:https://www.cnblogs.com/killbug/p/4557610.html
Copyright © 2011-2022 走看看