RPC实现原理

本文简单记录下RPC框架的原理。

原理

RPC全称为Remote Procedure Call,译为远程过程调用

常见的RPC框架的包括DubboThriftHissanGRPC等。

组成

RPC主要是由提供者消费者注册中心三部分组成。

  1. 提供者是服务的提供方,需要把自身提供的服务注册到注册中心

  2. 消费者是服务的消费方,需要从注册中心获取最新的服务提供方的信息。

此外,为了集群消费状态的监控,消费者也需要把自己的地址注册到注册中心

  1. 注册中心是服务注册和发现的关键,用于保存服务提供者的地址端口以及消费者的地址

注册中心

常用的注册中心有ZookeeperEtcdConsulEuerka

Zookeeper使用zab一致性协议,属于CP

EtcdConsul均使用raft一致性协议,属于CP

Euerka属于AP,主要用于服务发现和注册(存在部分延迟影响不大),因此采用最终一致性。

注册中心的中心化问题?

服务的调用和发现都是依赖注册中心,其高可用尤为重要。

CAP理论是由一致性(C)可用性(A)分区备份(P)组成。

  • 可用性(A):服务是否一直可用,集群环境下选主的方式(多分区)。
  • 一致性(C):集群环境下的一致性算法包括paxos/zab/raft
  • 分区备份(P):数据多分备份。

注册

注册可以分为两种:节点注册服务注册

  1. 节点注册:提供者、消费者,其中,提供者一般需要提供IPPORT,而消费者仅提供IP

  2. 服务注册:提供者,仅需要提供当前节点所能提供的rpc服务。

注册存在失败的情况,因此需要设置合理的失败重试机制

注册的具体方式如图所示,

/frpcrpc服务注册的独立命名空间。

临时节点的生命周期与注册节点相同,可以用于实现实时监控。

非地址节点都属于持久节点地址节点属于临时节点

服务隔离是通过/frpc/groupx来实现的,通过把服务注册到不同的节点上来实现服务的隔离。

发现

发现仅作为消费者的依赖服务获取方式。

发现是通过监控器Watcher的方式来实现服务节点状态的实时更新。

调用

RPC框架一般采用直连调用的方式来建立消费者和提供者之间的通信。

直连调用的性能最佳,任何代理都会存在性能的损耗。

服务网格利用proxy来实现网格之间的调用,为了降低客户端的复杂度,牺牲了网络性能。

通信方式包括TCPUDPHTTPHTTP2,常用的是TCPHTTP2

TCP是传输层协议,存在粘包问题,需要自定义数据包格式。

  • Magic Number:用于识别数据包的起始位置;
  • Serialize Type:标识数据的序列化方式;
  • Packet Type:标识数据包的结构类型;
  • Data Length:标识数据的大小,用来读取完整的数据包;
  • Data Bytes:具体数据。

HTTP2是应用层协议,用于取代HTTP,是GRPC中的通信方式。

路由

路由是指同一服务下不同节点的选择策略,常见的选择策略包括轮询性能负载优先级

路由一般分为两种:基于客户端的路由基于代理的路由

基于客户端的路由是通过消费者自身的客户端来实现节点的选择策略,对消费者自身存在一定的性能消耗。

基于代理的路由是通过部署再消费者环境下的独立存在,不会与消费者产生资源竞争,但存在一层网络性能损耗。

此外,路由标签可以用于服务的隔离。

监控

监控的目标可分为两种:

  • 实体:生产者、消费者、服务状态;
  • 性能:接口耗时、接口QPS。

实体数据可以从注册中心直接拉取,不需要提供者和消费者参与。

性能数据的上报采用异步上报的方式,从而避免对服务性能的影响。

管理

管理可以分为服务管理节点管理

服务管理是指服务的生效失效

节点管理是指节点的上线下线路由权重