RPC原理:
定义
像调用本地方法一样调用远程方法,基于接口的远程服务调用。核心是代理机制。
1.本地代理存根: Stub
2.本地序列化反序列化
3.网络通信
4.远程序列化反序列化
5.远程服务存根: Skeleton
6.调用实际业务服务
7.原路返回服务结果
8.返回给本地调用方
注意处理异常。
1.设计
接口契约:POJO实体类定义,接口定义
REST/PB 下,真的不需要嘛?另一种选择:WSDL/WADL/IDL
远程->服务提供者,本地->服务消费者。
2.代理
- Java 下,代理可以选择动态代理,或者 AOP 实现
- C# 直接有远程代理
- Flex 可以使用动态方法和属性
3.序列化
- 语言原生的序列化,RMI,Remoting
- 二进制平台无关,Hessian,avro,kyro,fst 等
- 文本,JSON、XML 等
4.网络传输
- TCP/SSL/TLS
- HTTP/HTTPS
5.查找实现类
一般是注册方式通过接口查找服务端的实现类。
例如dubbo默认将接口和实现类配置到Spring,把远程接口Service注册成Bean。
就相当于远程服务存根Skeleton
常见的RPC技术
很多语言都内置了 RPC 技术: Java RMI,.NET Remoting
- Corba/RMI/.NET Remoting
- JSON RPC, XML RPC,WebService(Axis2, CXF)
- Hessian, Thrift, Protocol Buffer, gRPC
Hessian
二进制序列化方式,基于HTTP协议的RPC技术,性能较高,使用广泛Thrift
Facebook创建和开源的一个RPC技术,使用二进制序列化和TCP方式来实现。
早期版本中每个服务都要单独起一个Server,它自己启动一个进程就绑定一个端口,这样的话不能让一个服务器的一个端口放多个服务上去。这样调用一个server的时候不用关心它是哪个服务,因为只有一个服务。gRPC
云原生环境下的RPC技术标准
RPC设计DIY
- 基于共享接口定义+POJO实体类 还是 基于IDL/WSDL/WADL(需要工具生成接口和实体类)
- 基于动态代理还是AOP切面
example:动态代理io.kimmking.rpcfx.client.Rpcfx#create
- 序列化内容用文本还是二进制,文本的话用JSON还是XML,二进制的话用Hessian还是Protocol Buffer
- 网络传输用TCP还是HTTP
- 服务器端如何查找实现类,服务器的桩skeleton实现类和接口的绑定注册如何设计。
- 异常处理:在服务器端catch住异常,封装异常数据后返回给客户端。
example:rpcfx