最近,研究了一下平台远程调用的过程,和service层插件执行的原理,记录一下。
1、远程service调用过程
首先看一下类的继承结构
封装调用处理过程
封装service调用接口
封装service请求信息
封装请求信息处理类
先描述一个调用过程:
平台在controller里面获取service的时候都是通过lookup方式(就是用了spring查找service的bean对象的代理对象),远程的service配到配置文件里面,所以在lookup的时候,如果配置文件中有的service,返回代理对象的时候,InvocationHandler其实是子类RemoteInvocationHandler,如果是本地service,那InvocationHandler其实是子类LocalInvocationHandler.
service执行相关方法的时候,调用的是AbstractInvocationHandler的invoke方法,这个方法做什么呢?这个方法封装ServiceRequest对象,如果是远程service,其实就是RemoteServiceRequest,本地service的话是LocalServiceRequest对象,然后调用ServiceInvoker的invokeService方法,参数就是ServiceRequest对象。
ServiceInvoker的invokeService方法做什么呢?这个方法里面调用AbstractServiceRequestHandler的handleReuqest方法,参数为ServiceRequest对象。根据ServiceRequest对象就能知道是否为远程请求,若是,AbstractServiceRequestHandler实例其实指向的是RemoteServiceRequestHandler对象。
2、service层插件执行
这个其实就是在上面所述的AbstractServiceRequestHandler的handleReuqest方法中,找到方法执行前的插件,方法执行后的插件,都执行了一遍。插件就是在service方法执行前后要进行的一些逻辑处理。
终于理清了思路,记录一下。