当前位置: 代码迷 >> Java相关 >> 请求路由到业务方法设计(1)-小弟我们到底能走多远系列(43)
  详细解决方案

请求路由到业务方法设计(1)-小弟我们到底能走多远系列(43)

热度:326   发布时间:2016-04-22 20:06:16.0
请求路由到业务方法设计(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;    }}

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