关于RMI的基础理解在我之前的文章中有所介绍。点我
这次是根据RMI的基础理解从而想到尝试模拟实现RMI。
大体思路:
- 我们的目标是建立RpcServer以及RpcClient后,从RpcClient中得到相应接口或类的代理对象,并且执行接口中的方法。
- 而这的执行是通过代理机制,把需要执行的方法和参数在通过RpcClientExecutor发送到RpcServerExecutor中执行。
- 再将执行后的结果发回RpcClientExecutor,从而得到执行后的结果,即实现了远程方法的调用。
问题:
应该采用哪种代理机制?
在产生代理前判断参数是接口还是类,若是接口则采用JDK代理的方式,若是类则采用CGLib代理的方式。
服务器端如何通过发过来的方法和参数执行该方法?
- 建立一个RpcBeanFactory,用来注册Bean以及获得Bean,其中提供一个Map,以唯一Id为键,以RpcBeanDefination为值。RpcBeanDefination由类、对象和方法组成。
- 注册Bean当然可以提供多种方法,如扫描注解注册、XML注册、调用专门用来注册的方法注册等。
- 注册之后,当RpcClientExecutor发过来参数和唯一标识Id时候,RpcServerExecutor通过发过来的Id定位相关类、对象方法并且结合发过来的参数反射执行该方法,再将结果返回。
为什么要使用代理机制?
使用代理是为了在调用这个类的代理对象的方法时候拦截这个方法,将执行所需要的这个方法的参数、类、方法名传输给rpc服务器端执行。
如何保证唯一Id?
可以通过方法的toString().hashCode()确定唯一rpcBeanId。