理解RPC
Posted 跟我一起学技术
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了理解RPC相关的知识,希望对你有一定的参考价值。
RPC(remote procedure call)
解释:只是一个概念,不是一个协议或者框架,是一种远程通讯方式,可以理解为远程调用一个方法
产生原因:从单机到分布式,就产生很多分布式的通讯协议,机器和机器之间需要互相访问和通讯,是分布式通讯中的一种
演进过程:
最原始的过程:二进制的数据传输(机器之间),使用tcp/ip协议,监听端口之后使用DataInputSteam、ByteArrayOutputStream、DataOutputStream,涉及到将属性或对象来回转换---非常麻烦,客户端服务端需要明确知道传输的对象是什么;并且网络传输处理和业务混淆在一起
增加代理将网络处理抽出去(严重问题:每次需要手工根据对象创建代理对象)
动态代理(解决手工创建)
//动态代理:
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为传入方法的参数
}利用网络将不同方法名,参数类型,参数等都传过去,服务端依次去读方法名、参数类型、参数(解决一个接口多个方法的调用,进一步动态)
服务端、客户端不再拆解处理对象的属性而是直接传递属性(基于动态代理)
User user = (User)method.invoke(service,args);
将类抽象起来,不直接传递某个方法而是直接传递对象,传递时指定xx.class(到此时,不管服务端多少个服务和接口,只要在客户端给出想调用的服务、服务的方法和参数,服务端就可以解析并找到其实现类,并将调用结果返回给客户端)
CCService cc = (CCService) proxy.getProxy(CCService.class)
更换网络协议(tcp、http等)
序列化框架管理(java自身、Jacson、FastJson等代理Stream,主要是为了缩短序列化等字节流的大小、序列化效率等)
...
以上是关于理解RPC的主要内容,如果未能解决你的问题,请参考以下文章
调用模板化成员函数:帮助我理解另一个 *** 帖子中的代码片段