RPC框架的实现原理,及RPC架构组件详解

RPC的由来

随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进。

  •  单一应用架构
  •  当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本。
  •  此时,用于简化增删改查工作量的 数据访问框架(ORM) 是关键。
  •  垂直应用架构
  •  当访问量逐渐增大,单一应用增加机器带来的加速度越来越小,将应用拆成互不相干的几个应用,以提升效率。
  •  此时,用于加速前端页面开发的 Web框架(MVC) 是关键。
  •  分布式服务架构
  •  当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,使前端应用能更快速的响应多变的市场需求。
  •  此时,用于提高业务复用及整合的 分布式服务框架(RPC),提供统一的服务是关键。

例如:各个团队的服务提供方就不要各自实现一套序列化、反序列化、网络框架、连接池、收发线程、超时处理、状态机等“业务之外”的重复技术劳动,造成整体的低效。

所以,统一RPC框架来解决提供统一的服务。

以下我将分别从如下四个方面详解RPC

RPC框架的实现原理,及RPC架构组件详解-mikechen的互联网架构

RPC的实现原理

RPC框架的实现原理,及RPC架构组件详解-mikechen的互联网架构

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

比如说,A服务器想调用B服务器上的一个方法:

Employee getEmployeeByName(String fullName)

整个调用过程,主要经历如下几个步骤:

1、建立通信

首先要解决通讯的问题:即A机器想要调用B机器,首先得建立起通信连接。

主要是通过在客户端和服务器之间建立TCP连接,远程过程调用的所有交换的数据都在这个连接里传输。连接可以是按需连接,调用结束后就断掉,也可以是长连接,多个远程过程调用共享同一个连接。

2、服务寻址

要解决寻址的问题,也就是说,A服务器上的应用怎么告诉底层的RPC框架,如何连接到B服务器(如主机或IP地址)以及特定的端口,方法的名称名称是什么。

通常情况下我们需要提供B机器(主机名或IP地址)以及特定的端口,然后指定调用的方法或者函数的名称以及入参出参等信息,这样才能完成服务的一个调用。

可靠的寻址方式(主要是提供服务的发现)是RPC的实现基石,比如可以采用redis或者zookeeper来注册服务等等。

RPC框架的实现原理,及RPC架构组件详解-mikechen的互联网架构
  1.  从服务提供者的角度看:当提供者服务启动时,需要自动向注册中心注册服务;
  2.  当提供者服务停止时,需要向注册中心注销服务;
  3.  提供者需要定时向注册中心发送心跳,一段时间未收到来自提供者的心跳后,认为提供者已经停止服务,从注册中心上摘取掉对应的服务。
  4.  从调用者的角度看:调用者启动时订阅注册中心的消息并从注册中心获取提供者的地址;
  5.  当有提供者上线或者下线时,注册中心会告知到调用者;
  6.  调用者下线时,取消订阅。

3、网络传输

3.1、序列化

当A机器上的应用发起一个RPC调用时,调用方法和其入参等信息需要通过底层的网络协议如TCP传输到B机器,由于网络协议是基于二进制的,所有我们传输的参数数据都需要先进行序列化(Serialize)或者编组(marshal)成二进制的形式才能在网络中进行传输。然后通过寻址操作和网络传输将序列化或者编组之后的二进制数据发送给B机器。

3.2、反序列化

当B机器接收到A机器的应用发来的请求之后,又需要对接收到的参数等信息进行反序列化操作(序列化的逆操作),即将二进制信息恢复为内存中的表达方式,然后再找到对应的方法(寻址的一部分)进行本地调用(一般是通过生成代理Proxy去调用,
通常会有JDK动态代理、CGLIB动态代理、Javassist生成字节码技术等),之后得到调用的返回值。

4、服务调用

B机器进行本地调用(通过代理Proxy)之后得到了返回值,此时还需要再把返回值发送回A机器,同样也需要经过序列化操作,然后再经过网络传输将二进制数据发送回A机器,而当A机器接收到这些返回值之后,则再次进行反序列化操作,恢复为内存中的表达方式,最后再交给A机器上的应用进行相关处理(一般是业务逻辑处理操作)。

通常,经过以上四个步骤之后,一次完整的RPC调用算是完成了。

PRC架构组件

一个基本的RPC架构里面应该至少包含以下4个组件:

1、客户端(Client):服务调用方(服务消费者)

2、客户端存根(Client Stub):存放服务端地址信息,将客户端的请求参数数据信息打包成网络消息,再通过网络传输发送给服务端

3、服务端存根(Server Stub):接收客户端发送过来的请求消息并进行解包,然后再调用本地服务进行处理

4、服务端(Server):服务的真正提供者

RPC调用过程

RPC框架的实现原理,及RPC架构组件详解-mikechen的互联网架构

1、服务消费者(client客户端)通过本地调用的方式调用服务

2、客户端存根(client stub)接收到调用请求后负责将方法、入参等信息序列化(组装)成能够进行网络传输的消息体

3、客户端存根(client stub)找到远程的服务地址,并且将消息通过网络发送给服务端

4、服务端存根(server stub)收到消息后进行解码(反序列化操作)

5、服务端存根(server stub)根据解码结果调用本地的服务进行相关处理

6、本地服务执行具体业务逻辑并将处理结果返回给服务端存根(server stub)

7、服务端存根(server stub)将返回结果重新打包成消息(序列化)并通过网络发送至消费方

8、客户端存根(client stub)接收到消息,并进行解码(反序列化

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

什么是RPC

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

简言之,RPC使得程序能够像访问本地系统资源一样,去访问远端系统资源。

  1.  比较关键的一些方面包括:
  2.  通讯协议
  3.  序列化
  4.  资源(接口)描述
  5.  服务框架
  6.  性能
  7.  语言支持等。

REST 和 SOAP、RPC的区别

主流RPC框架详解,以及与SOA、SOAP、REST的区别-mikechen的互联网架构

1.REST

可以看着是http协议的一种直接应用,默认基于json作为传输格式,使用简单,学习成本低效率高,但是安全性较低。

2.SOAP

SOAP是一种数据交换协议规范,是一种轻量的、简单的、基于XML的协议的规范。而SOAP可以看着是一个重量级的协议,基于xml,SOAP在安全方面是通过使用XML-Security和XML-Signature两个规范组成了WS-Security来实现安全控制的,当前已经得到了各个厂商的支持 。

它有什么优点?简单总结为: 易用,灵活,跨语言,跨平台。

3.RPC(远程过程调用)是什么?

简单的说,RPC就是从一台机器(客户端)上通过参数传递的方式调用另一台机器(服务器)上的一个函数或方法(可以统称为服务)并得到返回的结果。

REST 和 SOAP、RPC 有何区别呢?没什么太大区别,他们的本质都是提供可支持分布式的基础服务,最大的区别在于他们各自的的特点所带来的不同应用场景 。

RPC工作原理

运行时,一次客户机对服务器的RPC调用,其内部操作大致有如下十步:

1.调用客户端句柄;执行传送参数

2.调用本地系统内核发送网络消息

3.消息传送到远程主机

4.服务器句柄得到消息并取得参数

5.执行远程过程

6.执行的过程将结果返回服务器句柄

7.服务器句柄返回结果,调用远程系统内核

8.消息传回本地主机

9.客户句柄由内核接收消息

10.客户接收句柄返回的数据

主流RPC框架

简单介绍其中几种比较典型的:

主流RPC框架详解,以及与SOA、SOAP、REST的区别-mikechen的互联网架构

 

1.Hessian

是一个轻量级的remoting onhttp工具,使用简单的方法提供了RMI的功能。 基于HTTP协议,采用二进制编解码。

2.protobuf-rpc-pro

是一个Java类库,提供了基于 Google 的 Protocol Buffers 协议的远程方法调用的框架。基于 Netty 底层的 NIO 技术。支持 TCP 重用/ keep-alive、SSL加密、RPC 调用取消操作、嵌入式日志等功能。

3.Thrift

是一种可伸缩的跨语言服务的软件框架。它拥有功能强大的代码生成引擎,无缝地支持C + +,C#,Java,Python和PHP和Ruby。thrift允许你定义一个描述文件,描述数据类型和服务接口。依据该文件,编译器方便地生成RPC客户端和服务器通信代码。

最初由facebook开发用做系统内个语言之间的RPC通信,2007年由facebook贡献到apache基金 ,现在是apache下的opensource之一 。支持多种语言之间的RPC方式的通信:php语言client可以构造一个对象,调用相应的服务方法来调用java语言的服务,跨越语言的C/S RPC调用。底层通讯基于SOCKET。

4.Avro

出自Hadoop之父Doug Cutting, 在Thrift已经相当流行的情况下推出Avro的目标不仅是提供一套类似Thrift的通讯中间件,更是要建立一个新的,标准性的云计算的数据交换和存储的Protocol。支持HTTP,TCP两种协议。

5.Dubbo

Dubbo是 阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成。

简单的使用方法:

1、被远程调用的接口,需要在zookeeper中进行注册;

2、需要远程调用的服务在zookeeper中声明自己需要的接口;

3、zookeeper将已经注册的接口通知给需要的服务;

详解RPC远程调用和消息队列MQ的区别

什么是RPC

RPC(Remote Procedure Call)远程过程调用,主要解决远程通信间的问题,不需要了解底层网络的通信机制。

RPC服务框架有哪些

知名度较高的有Thrift(FB的)、Dubbo(阿里的)、grpc(google)等

详解RPC远程调用和消息队列MQ的区别-mikechen的互联网架构

RPC的一般需要经历4个步骤:

1、建立通信

首先要解决通讯的问题:即A机器想要调用B机器,首先得建立起通信连接,主要是通过在客户端和服务器之间建立TCP连接。

2、服务寻址

要解决寻址的问题,A服务器上如何连接到B服务器(如主机或IP地址)以及特定的端口,方法的名称是什么。

3、网络传输

1)序列化

当A服务器上的应用发起一个RPC调用时,调用方法和参数数据都需要先进行序列化。

2)反序列化

当B服务器接收到A服务器的请求之后,又需要对接收到的参数等信息进行反序列化操作。

4、服务调用

B服务器进行本地调用(通过代理Proxy)之后得到了返回值,此时还需要再把返回值发送回A服务器,同样也需要经过序列化操作,然后再经过网络传输将二进制数据发送回A服务器。

通常,一次完整的PRC调用需要经历如上4个步骤。

更加详细RPC 通信流程深入的视频讲解,点击查看RPC通信核心流程剖析,大厂面试必看!

MQ(消息队列)

消息队列(MQ)是一种能实现生产者到消费者单向通信的通信模型,一般来说是指实现这个模型的中间件。

MQ消息中间件比较:

RocketMQ、Kafka、RabbitMQ的架构设计与选型

典型的特点:

1、解耦

2、可靠投递

3、广播

4、最终一致性

5、流量削峰

6、消息投递保证

7、异步通信(支持同步)

8、提高系统吞吐、健壮性

典型的使用场景:秒杀业务中利用MQ来实现流量削峰,以及应用解耦使用。

RPC和MQ的区别和关联

1.在架构上,RPC和MQ的差异点是,Message有一个中间结点Message Queue,可以把消息存储。

详解RPC远程调用和消息队列MQ的区别-mikechen的互联网架构

2.同步调用:对于要立即等待返回处理结果的场景,RPC是首选。

3.MQ 的使用,一方面是基于性能的考虑,比如服务端不能快速的响应客户端(或客户端也不要求实时响应),需要在队列里缓存。

另外一方面,它更侧重数据的传输,因此方式更加多样化,除了点对点外,还有订阅发布等功能。

4.而且随着业务增长,有的处理端处理量会成为瓶颈,会进行同步调用改造为异步调用,这个时候可以考虑使用MQ。

posted @ 2022-02-07 11:11  hanease  阅读(978)  评论(0编辑  收藏  举报