什么是RPC框架?

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

什么是RPC

In distributed computing, a remote procedure call (RPC) is when a computer program causes a procedure (subroutine) to execute in a different address space (commonly on another computer on a shared network), which is coded as if it were a normal (local) procedure call, without the programmer explicitly coding the details for the remote interaction. That is, the programmer writes essentially the same code whether the subroutine is local to the executing program, or remote. This is a form of client–server interaction (caller is client, executor is server), typically implemented via a request–response message-passing system.

RPCRemote Procedure Call即远程过程调用不同于本地调用RPC是指调用远端机器的函数或方法且不需要关心底层的调用细节如网络协议和传输协议等对于调用者来说和调用本地方法没有什么区别。RPC调用的是一个远端对象调用者和被调用者是处于不同的地址空间要想完成调用必须实现以下几个能力

服务发现
由于调用的是远端对象因此需要可以定位到调用的服务器地址以及调用的具体方法的进程一般可以通过注册中心或者哈希查找来实现将被调的接口注册到某个地方比如使用CallerId和函数名作为映射调用者通过CallerId进行调用服务端收到调用请求后通过CallerId查找到对应函数再执行后续处理流程。

序列化和反序列化
调用者和被调用者处于不同的机器上因此函数参数及其他一些Context信息需要经过网络传输才能到达服务端网络传输的是二进制数据因此RPC需要支持将函数参数如基本类型int、long、map以及自定义类型等可以序列化为网络可以传输的二进制数据同时也需要支持将二进制数据反序列化为程序可以处理的数据类型是序列化的逆过程。

网络传输
网络传输协议和RPC本身没有关系一般使用TCP进行网络传输通过HTTP或者UDP也是可以完成RPC所需要的功能的。

如上如果某个服务框架实现了上述这些功能就是一个RPC框架通过此框架便可以像调用本地方法一样来调用远端方法。

为什么使用RPC

如果是一个功能比较简单的应用可以将所有功能实现在一个服务中或者实现在多个服务中但是部署在一个机器上如此接口间调用要么在同一进程内或者是本地进程间通信。随着业务的发展服务功能持续迭代单体应用出现性能瓶颈因此需要考虑对服务进行拆分根据业务功能划分为不同的模块不同的模块部署到不同集群上模块间进行通信完成功能。如将服务的管理域和执行域进行拆分不仅是服务架构更合理清晰也方便根据不同的模块划分不同的资源保证服务的整体性能。

一个服务拆分为不同的模块或者单体应用拆分为多个微服务时此时便需要RPC出场了不同模块及不同服务间都需要RPC才能完成通信。可以说RPC是分布式系统架构或者微服务架构必不可少的实现手段。

RPC原理

理清了RPC的基本概念之后简单阐述下RPC框架的实现原理。首先看一张RPC调用的全貌图

RPC调用

当客户端发起一次远程调用时

  1. client以本地方式方式调用远程方法
  2. client stub收到调用后负责将方法以及参数等组装成网络可以传输的消息体
  3. client stub找到服务端地址通过系统调用将数据传输服务端
  4. server stub收到消息后进行反序列化
  5. server stub通过得到的参数调用本地方法
  6. 执行结果返回给server stub
  7. server stub将执行结果进行序列化
  8. server stub进行系统调用将数据发送给客户端
  9. client stub收到消息并进行解码
  10. cleint stub将结果返回给调用者。

RPC框架所要实现的便是将序列化、反序列化以及网络传输等流程进行封装这些流程对于调用者来说是透明的调用者并不需要了解这些细节以及调用流程。

常用的RPC框架有哪些

Thrift

Thrift是一个轻量级、跨语言的RPC框架主要用于各个服务之间的RPC通信最初由Facebook于2007年开发2008年进入Apache开源项目。它通过自身的IDL中间语言并借助代码生成引擎生成各种主流语言的RPC服务端和客户端模板代码。Thrift支持多种不同的编程语言包括C++、Java、Python、PHP、Ruby、Erlag、Haskell、C#、Cocoa、JavaScript、Nodejs、Smalltalk、OCaml和Golang等。

gRPC

gRPC是一个高性能、通用的开源RPC框架其由Google2015年主要面向移动应用开发并基于HTTP/2标准协议而设计基于ProtoBuf序列化协议开发且支持众多语言开发。gRPC提供了一种简单的方法来精确地定义服务和为iOS、Android和后台支持服务自动生成可靠性很强的客户端功能库。客户端充分利用高级流和链式功能从而有助于节省带宽、降低TCP连接次数、节省CPU使用、电池寿命。

支持C、C++、Node.js、Python、Ruby、Objective-C、PHP和C#等语言

Dubbo

Dubbo是一个分布式服务框架以及SOA治理方案。其功能主要包括高性能NIO通讯及多协议集成服务动态寻址与路由软负载均衡与容错依赖分析与降级等。 Dubbo是阿里巴巴内部的SOA服务化治理方案的核心框架Dubbo自2011年开源后已被许多非阿里系公司使用目前Dubbo已经交给Apache基金会维护。

gRPC VS Thrift

grpc-thrift-1

grpc-thrift-2

什么时候应该选择gRPC而不是Thrift

  • 需要良好的文档、示例
  • 喜欢、习惯HTTP/2、ProtoBuf
  • 对网络传输带宽敏感

什么时候应该选择Thrift而不是gRPC

  • 需要在非常多的语言间进行数据交换
  • 对CPU敏感
  • 协议层、传输层有多种控制要求
  • 需要稳定的版本
  • 不需要良好的文档和示例

参考文档

谁能用通俗的语言解释一下什么是 RPC 框架
RPC框架从原理到选型一文带你搞懂RPC
gRPC vs Thrift

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6