您的位置:首页 > 其它

揭秘系统远程调用思想

2018-03-20 15:51 169 查看

前言

在xxl-job中存在调度中心远程调用执行器的过程, 在此可以很清晰的学习到远程调用的思想。  常规的远程调用协议,dubbo, thrift , Protocol Buffer, 以及更轻量级的hessian协议。 这些市面上大同小异的框架,在我们集成这些框架的时候,我们总会在调用端引用服务端暴露出来的接口,然后通过代理工厂创建代理对象最终通过spring的自动注入的方式,在我们的容器里面生成代理对象,然后当我们需要使用的时候,直接使用代理对象,就可以调用到另一个系统里面的服务了, 常规的配置我们都知道,但是真正内部是怎么实现的,为何我们调用代理对象的方法,就能调用到远程系统的服务,这是我们值得思考的。 此处主要以xxl-job为原型,讲解这种模式, 其他专业的RPC框架肯定比这个更加复杂, 所以这里主要是讲解一个思想。 

例:当A系统需要调用B系统的方法时,我们通常的做法是这样的。B系统 暴露一个interface, 如:   exampleInterface.jar A系统引用exampleInterface.jar ,   同时在spring.xml 文件中配置B系统暴露出来的接口类(例:userService)最终我们的使用方式如下: Example
上面那一段,非常简短的代码, 还原了一个非常简短的系统之间的调用, 但是为什么在A系统调用userService.getUsers() , 这个方法最终就能调用到B系统去呢? 

代理对象生成

在xxl-job中调度中心需要调用执行器的代码, 下面来仔细分析一下、 获取代理对象
从下面的代码中,可以看到NetComClientProxy 这个代理类,是一个factoryBean, 所以主要看他的getObject方法即可NetComClientProxy
从上面可以清晰的看到,生成的代理对象里面的 InvocationHandler 中的invoke方法,并没有真实的执行方法,而是将类名,方法名,参数等信息发送给远程服务器。 仅仅只是做了这些操作而已。 这就是他的设计比较巧妙的地方。 下面可以看一下,远程服务器拿到请求之后如何处理的。 
由此我们就可以知道,远程调用的大致思想。 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  分布式 远程调用 RPC