RPC和MQ是分布式技术大厦里最基础的两块基石。

RPC原理:

定义

像调用本地方法一样调用远程方法,基于接口的远程服务调用。核心是代理机制。
1.本地代理存根: Stub
2.本地序列化反序列化
3.网络通信
4.远程序列化反序列化
5.远程服务存根: Skeleton
6.调用实际业务服务
7.原路返回服务结果
8.返回给本地调用方
注意处理异常。
image.png

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

  1. 基于共享接口定义+POJO实体类 还是 基于IDL/WSDL/WADL(需要工具生成接口和实体类)
  2. 基于动态代理还是AOP切面

example:动态代理io.kimmking.rpcfx.client.Rpcfx#create

  1. 序列化内容用文本还是二进制,文本的话用JSON还是XML,二进制的话用Hessian还是Protocol Buffer
  2. 网络传输用TCP还是HTTP
  3. 服务器端如何查找实现类,服务器的桩skeleton实现类和接口的绑定注册如何设计。
  4. 异常处理:在服务器端catch住异常,封装异常数据后返回给客户端。

example:rpcfx