分布式RPC框架

一、RPC框架概述

 1.RPC的定义

 RPC(Remote Procedure Call,远程过程调用)是一种进程间的通信方式。它允许程序调用另一个地址空间(通常是共享网络的另一台机器上)的过程或函数,而不用程序员显式地编码远程调用的细节,即程序员无论是调用本地的还是远程的函数,本质上编写的调用代码基本相同。目前,主流的平台都支持各种远程调用技术,以满足分布式系统架构中不同系统之间的远程通信和相互调用。

 2、RPC核心组件

完整的RPC框架主要包含4个核心的组件:Client、Server、Client Stub以及Server Stub,具体如图3-1所示。

客户端(Client):服务调用方。
服务端(Server):服务提供者。
客户端存根(Client Stub):存放服务端的地址消息,再将客户端的请求参数打包成网络消息,然后通过网络远程发送给服务方。
服务端存根(Server Stub):接收客户端发送过来的消息,将消息解包,并调用本地的方法。

  3、RPC调用过程

 

(1)客户端(Client)以本地调用方式调用服务(依赖服务接口,以接口的方式调用)。
(2)客户端存根(Client Stub)接收到调用请求后,负责将方法、参数等组装成能够进行网络传输的消息体(将消息体对象序列化为二进制)。
(3)客户端通过Socket将消息发送到服务端。
(4)服务端存根(Server Stub)收到消息后对消息进行解码(将消息对象反序列化)。
(5)服务端存根(Server Stub)根据解码结果调用本地的服务(利用反射原理)。
(6)本地服务执行并将结果返回给服务端存根(Server Stub)。
(7)服务端存根(Server Stub)将返回结果打包成消息(将结果消息对象序列化)。
(8)服务端(Server)通过Socket将消息发送到客户端。
(9)客户端存根(Client Stub)接收到结果消息,并进行解码(将结果消息反序列化)。
(10)客户端(Client)得到最终结果。

无论是哪种类型的数据,最终都需要转换成二进制流在网络上进行传输,数据的发送方需要将对象转换为二进制流,而数据的接收方则需要把二进制流再恢复为对象。RPC的目标是把(2)、(3)、(4)、(7)、(8)、(9)这些步骤都封装起来,具体如图3-3所示。

二、RPC框架调用分类
RPC调用主要分为两种:同步调用和异步调用
同步调用:客户端调用服务端方法,等待直到服务端返回结果或者超时,再继续自己的操作。
异步调用:客户端调用服务端方法,不再等待服务端返回,直接继续自己的操作。

1. 同步调用
在分布式微服务架构中,一个业务的调用会跨N(N≥2)个服务进程,整个调用链路上的同步调用等待的瓶颈会由最慢(或脆弱)的服务决定。比如A-B-C这样一个调用链路,A同步调用B并等待返回结果,B同步调用C并等待返回结果,以此类推,就像一组齿轮链,级级传动,这很容易产生雪崩效应。若C服务挂了,则会导致前面的服务全部因为等待超时而占用大量不必要的线程资源。对于雪崩效应,常用解决方法有:使用超时策略和熔断器机制。

(1)超时策略:在一个服务调用链中,某个服务的故障可能会导致级联故障。调用服务的操作可以配置为执行超时,如果服务未能在这个时间内响应,就回复一个失败消息。然而,这种策略可能会导致许多并发请求到同一个操作被阻塞,直到超时期限届满。这些阻塞的请求可能会存储关键的系统资源,如内存、线程、数据库连接等。因此,这些资源可能会枯竭,导致需要使用相同的资源系统出现故障。设置较短的超时可能有助于解决这个问题,但是一个请求从发出到收到成功或者失败的消息需要的时间是不确定的。在分布式微服务架构下,我们需要根据成功调用一个服务调用链的平均时间来合理配置服务接口超时时间。

(2)熔断器机制:熔断器的模式使用断路器来检测故障是否已得到解决,防止请求反复尝试执行一个可能会失败的操作,从而减少等待纠正故障的时间,相对于超时策略更加灵活。熔断器机制在后续的章节中会有详细描述。

2、异步调用
RPC的异步调用意味着RPC框架不阻塞调用方线程,调用方不需要立刻拿到返回结果,甚至调用方根本就不关心返回结果。RPC的异步交互场景如图3-4所示。

国内RPC框架如下:

Dubbo:国内较早开源的服务治理的Java RPC框架,虽然在阿里巴巴内部竞争中落败于HSF,沉寂了几年,但是在国内得到了广泛的应用,目前Dubbo项目又获得了支持,并且Dubbo 3.0也开始开发。

Motan:微博内部使用的RPC框架,底层支持Java,生态圈往Service Mesh发展以支持多语言。
RPCX:基于Go的服务治理的RPC框架,客户端支持跨语言。
腾讯Tars:腾讯公司的RPC框架。
百度BRPC:百度公司的RPC框架。

国外RPC框架如下:
Thrift:跨语言的RPC框架,由Facebook贡献。
Hessian:由Caucho Technology开发的轻量级二进制RPC框架。
Avro:来自Hadoop子项目。

gRPC:Google出品的跨语言RPC框架,很弱的(实验性的)负载均衡。

twirp:twitch.tv开源的一个RESTful风格的RPC框架。
go-micro:Go语言的一个服务治理RPC框架。
Spring Cloud:新兴产物。

原文地址:https://www.cnblogs.com/callbin/p/14591126.html