一、实现RPC需要用到哪些技术?
1.动态代理
生成client stub 和 server stub 需要用到Java动态代理技术。比如:JDK动态代理,cglib,Javassist等。
2.序列化 为了能在网络上传输和接受Java对象,我们需要对它进行序列化和反序列化。 可以使用Java原生的序列化机制,但是效率度。也可以使用其他的,如:protobuf、Thrift、Hessian、Kryo、Msgpack。
PS:(Hessian是一个轻量级的RPC框架。 它基于HTTP协议传输,使用Hessian二进制序列化,对于数据包比较大的情况比较友好。 但是它的参数和返回值都需要实现Serializable接口。)
3.NIO 很多RPC框架都直接使用netty 作为通信框架,比如 HSF、dubbo、Avro。
4.服务注册中心 Redis、Zookeeper、Consul、Etcd。
二、开源RPC框架:
1.dubbo 阿里巴巴
2.Motan 新浪微博
3.gRPC Google 基于HTTP/2协议 与 Protobuf 序列化协议。本身不是分布式,需要进一步开发。
4.thrift Apache
三、RPC与RMI的区别 (这段是转载,原文地址:http://www.cnblogs.com/ygj0930/p/6542811.html )
1:方法调用方式不同: RMI中是通过在客户端的Stub对象作为远程接口进行远程方法的调用。每个远程方法都具有方法签名。如果一个方法在服务器上执行,但是没有相匹配的签名被添加到这个远程接口(stub)上,那么这个新方法就不能被RMI客户方所调用。 RPC中是通过网络服务协议向远程主机发送请求,请求包含了一个参数集和一个文本值,通常形成“classname.methodname(参数集)”的形式。RPC远程主机就去搜索与之相匹配的类和方法,找到后就执行方法并把结果编码,通过网络协议发回。
2:适用语言范围不同: RMI只用于Java; RPC是网络服务协议,与操作系统和语言无关。
3:调用结果的返回形式不同: Java是面向对象的,所以RMI的调用结果可以是对象类型或者基本数据类型; RMI的结果统一由外部数据表示 (External Data Representation, XDR) 语言表示,这种语言抽象了字节序类和数据类型结构之间的差异。
四、