微服务之RPC简述

卷心菜

发布时间: 20-08-0616:28

一、什么是RPC

RPC(Remote Procedure Call)—远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。

比如说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法,由于不在一个内存空间,不能直接调用,就需要通过网络来表达调用的语义和传达调用的数据,而这种方式就是rpc

RPC 的主要功能目标是让构建分布式计算(应用)更容易,在提供强大的远程调用能力时不损失本地调用的语义简洁性。为实现该目标,RPC 框架需提供一种透明调用机制让使用者不必显式的区分本地调用和远程调用。

二、为什么需要rpc

1、分布式部署及微服务

当我们的系统访问量增大、业务增多时,我们会发现一台单机运行此系统已经无法承受。此时,我们可以将业务拆分成几个互不关联的应用,分别部署在各自机器上,以划清逻辑并减小压力。

2、不同技术选型

公司业务规模扩大,有可能引入不同的语言,比如A团队要开发CPU密集型的采用c++语言,B团队要开发IO密集型的采用了PHP,不同语言之间如何通讯。

3、系统高可用性差

因为所有的功能开发最后都部署到同一个框架里,运行在同一个进程之中,一旦某一功能涉及的代码或者资源有问题,那就会影响整个框架中部署的功能。

三、RPC的调用分类

同步调用客户方等待调用执行完成并返回结果。

异步调用客户方调用后不用等待执行结果返回,但依然可以通过回调通知等方式获取返回结果。

若客户方不关心调用返回结果,则变成单向异步调用,单向调用不用返回结果。

异步和同步的区分在于是否等待服务端执行完成并返回结果。

四、如何调用他人的远程服务

由于各服务部署在不同机器,服务间的调用免不了网络通信过程,服务消费方每调用一个服务都要写一坨网络通信相关的代码,不仅复杂而且极易出错。

如果有一种方式能让我们像调用本地服务一样调用远程服务,而让调用者对网络通信这些细节透明,那么将大大提高生产力,比如服务消费方在执行$client->getUserInfo()时,实质上调用的是远端的服务。这种方式其实就是RPC(Remote Procedure Call Protocol),在各大互联网公司中被广泛使用,如阿里巴巴的hsf、dubbo(开源)、Facebook的thrift(开源)、Google grpc(开源)。

要让网络通信细节对使用者透明,我们自然需要对通信细节进行封装,我们先看下一个RPC调用的流程:

1)、服务消费方(client)调用以本地调用方式调用服务;

2)、client stub接收到调用后负责将方法、参数等组装成能够进行网络传输的消息体;

3)、client stub找到服务地址,并将消息发送到服务端;

4)、server stub收到消息后进行解码;

5)、server stub根据解码结果调用本地的服务;

6)、本地服务执行并将结果返回给server stub;

7)、server stub将返回给客户端;

8)、client stub接收到消息,并进行解码;

9)、服务消费方得到最终结果。

4.1 传输协议的选择

不过需要稍稍注意的是其调用协议通常包含传输协议和编码协议。

传输协议:可以是自定义的tcp协议,也可以是http、udp等

编码协议: 如基于文本编码的 xml、json,也有二进制编码的 protobuf、binpack 等。

使用什么协议?

RPC是一个软件结构概念,是构建分布式应用的理论基础。就好比为啥你家可以用到发电厂发出来的电?是因为电是可以传输的。至于用铜线还是用铁丝还是其他种类的导线,也就是用http还是用其他协议的问题了。这个要看什么场景,对性能要求怎么样。

五、RPC实例

客户端通过发送一个规定的rpc协议,请求服务的注册中心,由服务注册中心检索可用服务,并且实现调用转发,服务内容由各服务在启动的时候,注册到服务中心。

服务中心

1、通过consul方式存储代码服务器发送过来的注册服务

2、心跳维持、健康检查

3、定时检测代码服务端健康状态,如果服务宕机,将改变当前服务的状态

4、协议的统一转换

将客户端的不同协议的请求在转发到代码服务架构时,转换成统一的协议,去请求

代码服务端

1、注册服务到注册中心

进程启动时将当前的代码服务端提供的服务,发送请求注册到注册中心

2、接收服务中心的服务检测心跳维持

客户端

1、缓存各服务地址,定时更新地址

2、通过请求服务中心获取服务内容,拥有重试的功能

举报/反馈