理解RPC

Posted 跟我一起学技术

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了理解RPC相关的知识,希望对你有一定的参考价值。

RPC(remote procedure call)

  • 解释:只是一个概念,不是一个协议或者框架,是一种远程通讯方式,可以理解为远程调用一个方法

  • 产生原因:从单机到分布式,就产生很多分布式的通讯协议,机器和机器之间需要互相访问和通讯,是分布式通讯中的一种

  • 演进过程:

  1.  最原始的过程:二进制的数据传输(机器之间),使用tcp/ip协议,监听端口之后使用DataInputSteam、ByteArrayOutputStream、DataOutputStream,涉及到将属性或对象来回转换---非常麻烦,客户端服务端需要明确知道传输的对象是什么;并且网络传输处理和业务混淆在一起

  2. 增加代理将网络处理抽出去(严重问题:每次需要手工根据对象创建代理对象)

  3. 动态代理(解决手工创建)

     //动态代理:
     Object o=Proxy.newProxyTnstance(xx.class.getClassLoader(),new Class[]{A.service},h)
     
     //现根据原本的对象(xx.class)生成一个动态代理类(o),这个类将实现原对象的某个方法(A.service),使用调用处理器h
     InvocationHandler h = new InvocationHandler(){
     @Override
     public Object invoke(Object proxy,Method method,Object[] args){
      ...
     }
       //当在client端调用方法A时候,需要调用代理xx,再次调用h;因此proxy是传入的代理对象,method为对象调用的方法,args为传入方法的参数
     }
  4. 利用网络将不同方法名,参数类型,参数等都传过去,服务端依次去读方法名、参数类型、参数(解决一个接口多个方法的调用,进一步动态)

  5. 服务端、客户端不再拆解处理对象的属性而是直接传递属性(基于动态代理)

     User user = (User)method.invoke(service,args);
  6. 将类抽象起来,不直接传递某个方法而是直接传递对象,传递时指定xx.class(到此时,不管服务端多少个服务和接口,只要在客户端给出想调用的服务、服务的方法和参数,服务端就可以解析并找到其实现类,并将调用结果返回给客户端)

     CCService cc = (CCServiceproxy.getProxy(CCService.class)
  7. 更换网络协议(tcp、http等)

  8. 序列化框架管理(java自身、Jacson、FastJson等代理Stream,主要是为了缩短序列化等字节流的大小、序列化效率等)

    ...


以上是关于理解RPC的主要内容,如果未能解决你的问题,请参考以下文章

金蝶handler中 collection 代码片段理解

自定义RPC的完整实现---深入理解rpc内部原理

调用模板化成员函数:帮助我理解另一个 *** 帖子中的代码片段

徒手撸了一个RPC框架,理解更透彻了,代码已上传github,自取~

如何理解这段代码片段中的两对括号?

精心收集的 48 个 JavaScript 代码片段,仅需 30 秒就可理解