RPC基本原理

概念

  • RPC远程过程调用RemoteProcedureCall
  • 用于支持异构型分布式系统间的通信
  • 像调用本地方法一样调用远程方法 ```java UserService service = new UserService(); User user = service.findById(1);

UserService service = Rpcfx.create(UserService.class,url); User user = service.findById(1); ```

原理

  • 核心是代理机制
  • 本地代理存根Stub
  • 远程服务存根Skeleton
  • 注意处理异常

    设计

  • RPC是基于接口的远程服务调用

  • 本地和远程需要共享

    • POJO实体类定义 (User)
    • 接口定义 (UserService)

      代理

  • Java下,可以选择动态代理或者AOP

    序列化

  • 语言原生的序列化:RMI(Java语言互通),Remoting(.net语言互通)

  • 二进制平台无关:Hession,avro,kyro,fst
  • 文本:JSON,XML

    网络传输

  • TCP/SSL

  • HTTP/HTTPS

    查找实现类

  • 通过接口查找服务端的实现类

  • 一般是注册方式,例如dubbo默认将接口和实现类配置到spring

RPC原理.png

RPC技术框架

  • Corba/Java的RMI/.net的Remoting
  • JSON RPC/XML RPC/ WebService(Axis2,CXF) 基于文本的
  • Hessian/ Thrift/ProtocolBuffer/ gRPC 基于二进制的

    如何设计一个RPC

    如何考虑

  • 基于共享接口还是IDL?

  • 动态代理还是AOP?
  • 序列化用文本还是二进制?
  • 基于TCP还是HTTP?
  • 服务端如何查找实现类?

    选型

  • 共享接口和实体类定义

  • 动态代理
  • 序列化使用JSON
  • 基于HTTP
  • Bean注解

    从RPC到分布式服务化

    微服务架构

  • 多个相同服务如何管理?

  • 服务的注册发现机制?
  • 如何负载均衡,路由等集群功能?
  • 熔断、限流等治理能力?
  • 重试等策略?
  • 高可用、监控、性能等