RPC心跳机制

概述:

RPC 的全称是 Remote Procedure Call(远程过程调用) 是一种进程间通信方式。它允许程序调用另一个地址空间(通常是共享网络的另一台机器上)的过程或函数,而不用程序员显式编码这个远程调用的细节。即程序员无论是调用本地的还是远程的,本质上编写的调用代码基本相同

RPC 起源

1. 简单:RPC 概念的语义十分清晰和简单,这样建立分布式计算就更容易。

2. 高效:过程调用看起来十分简单而且高效。

3. 通用:在单机计算中过程往往是不同算法部分间最重要的通信机制。 通俗一点说,就是一般程序员对于本地的过程调用很熟悉,那么我们在通过网络做远程通信时,通过RPC 把远程调用做得和本地调用完全类似,那么就更容易被接受,使用起来也就毫无障碍。今天我们使用的 RPC 框架基本就是按这个目标来实现的。

RPC架构

用于RPC的程序结构类似于罗伊·尼尔森提出的程序结构。论文是基于存根的概念,涉及的模块有:

1)用户(User)

2)用户存根(User-Stub)

3)RPC通信包(称为RPCRuntime)

4)服务器存根(Server-Stub)

5)服务器(Server)

它们的关系如图所示。

 

当用户发起一个远程CALL时,过程如下:

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

2)User-stub(存根)接收到调用后负责将方法、参数等组装成能够进行网络传输的消息体,并交给RPCRuntime模块。

3)RPCRuntime找到服务地址,并将消息发送到服务端。

4)服务端的RPCRuntime收到消息后,传给Server-stub。

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

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

7)server stub将返回结果打包成消息并发送至消费方;

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

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

RPC调用细节

一、接口方式的调用

通过之前的介绍,以及上图的分析,我们知道,RPC设计的目的在于可以让调用者可以像以本地调用方式一样调用远程服务。具体实现的方式是调用接口的方式来调用。如果我们用的是java语言,则底层通过jdk动态代理方式生成接口的代理类,代理类中封装了与远程服务通信的细节。这些细节包括:

 

客户端的请求消息结构一般需要包括以下内容:

1)接口名称,如果不传,服务端就不知道调用哪个接口了;

2)方法名,一个接口内可能有很多方法,如果不传方法名服务端也就不知道调用哪个方法;

3)参数类型以及相应的参数值

4)requestID,标识唯一请求id

 

服务端返回的消息结构一般包括以下内容:

1)返回值

2)requestID

 

二、序列化

 

一旦确定了消息的数据结构后,下一步就是要考虑序列化与反序列化了。序列化就是将数据结构或对象转换成二进制串的过程,也就是编码的过程。反序列化将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程。

目前国内各大互联网公司广泛使用hessian、protobuf、thrift、avro等成熟的序列化解决方案来搭建RPC框架,这些都是久经考验的解决方案。

 

三、通信

 

消息数据结构被序列化为二进制串后,下一步就要进行网络通信了。目前有两种IO通信模型:

1)BIO

2)NIO

一般RPC框架都是基于NIO来通信。

1)使用java nio方式自研,这种方式较为复杂,而且很有可能出现隐藏bug,很少有互联网公司使用这种方式。

2)基于mina,mina在早几年比较火热,不过这些年版本更新缓慢,已淡出视野。

3)基于netty,netty网络通信框架,底层是基于NIO,现在很多RPC框架都直接基于netty这一通信框架,比如阿里巴巴的HSF、dubbo,Twitter的finagle,以及AVRO等。

 

主流的RPC框架

 

Thrift

facebook的开源RPC框架,现在贡献给apache。支持多语言之间的RPC通信,facebook当时在开发Thrift的时候,目的就是为了实现facebook系统内之间的各语言通信。2007年贡献给apache。

 

Protocol Buffer

是Google开源的RPC框架,可以跨平台使用,目前支持的语言:C++,java,python。(没有thrift多)。

 

Apache Avro

 

RPC框架具有的特点:

1.基于RPC的进程通信方式

2.有自定义的一套序列化和反序列的机制
3.客户端通过代理机制调用远程方法

4.服务端通过回调机制执行方法及返回结果

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

任错错

如果对您有帮助我很开心

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值