RPC远程调用协议

简介: RPC远程调用协议

定义

RPC(Remote Procedure Call,远程过程调用)是一种计算机通信协议,它允许一个计算机程序调用另一个计算机上的子程序,而不需要程序员显式编写远程调用的代码。RPC使得分布式计算更加容易,因为它隐藏了底层的网络通信细节(底层是TCP/UDP),使得程序员可以像调用本地函数一样调用远程函数。

执行流程

在RPC中,客户端程序通过发送一个请求消息给服务器端程序来调用远程函数。服务器端程序接收到请求消息后,执行相应的函数,并将结果返回给客户端程序。RPC协议通常使用TCP或UDP作为底层的传输协议,以保证数据的可靠传输。

特点

RPC的优点是可以使得分布式系统的开发更加容易,因为它隐藏了底层的网络通信细节,使得程序员可以像调用本地函数一样调用远程函数。RPC的缺点是需要额外的网络通信开销,因为每次调用远程函数都需要发送请求消息和接收响应消息。此外,RPC也需要考虑安全性和可靠性等问题。

成熟的RPC框架

Ice、gRPC、Tars

RPC实现问题

实现一个基础的RPC需要考虑两点:

  • 函数映射
  • 网络传输

RPC实现流程

1.定义IDL文件(像使用protobuf编写的pb文件)、编译工具根据使用语言生成stub文件(比如使用protoc编译器生成的C++的.cc和.h文件,),相当于静态库的方法实现函数映射;

2.网络传输的数据在RPC中通常还需要编码,解码操作。例如gRPC中用到protobuf来编码成二进制数据。

3.根据RPC协议约定数据头、元数据、消息体等,时请求和返回结果能够一一映射。

4.使用成熟的网络库进行TCP/UDP传输。

HTTP和RPC对比

HTTP是应用层协议;

RPC是远程过程调用方法,所谓的RPC协议实际上是在TCP、UDP,甚至是HTTP2的基础上改造的自定义协议;

编解码层

HTTP1.1

  • 序列化协议:json

RPC

  • 序列化协议:通常是protobuf。

序列化后体积比json小=》传输效率高。

协议层

基于TCP传输,都有消息头和消息体,区别是消息头。

  • HTTP1.1

优点是灵活,但是消息头有一些冗余字段。例如还会带浏览器行为等。

  • RPC

可定制化。

网络传输层

本质都是基于socket通信

  • HTTP1.1

建立一个TCP长连接,通过keep-alive来复用连接;可以引入成熟的网络库,给HTTP加连接池,保证不只有一个TCP连接可用。

  • RPC

建立TCP连接池,也会使用成熟的网络库来提高传输性能。gRPC基于HTTP2.0,拥有多路复用等优势。

优势与不足

优势

  • 相较于HTTP1.1,数据包更小、序列化更快、所以传输效率更高。
  • 基于TCP和HTTP2.0的RPC协议(用到TCP连接池或多路复用等技术),效率更高。
  • 适用于微服务架构。

不足

  • 本身无法解决微服务集群问题,例如:服务发现、服务治理等;
  • 调用方对服务端的RPC接口有强依赖关系,例如远程调用函数如果有修改,stub桩文件需要频繁更新,否则接口可能会调用出错。可以通过自动化工具、版本管理工具来保证代码级别的强依赖关系。

RPC和HTTP的使用场景

微服务架构下,内部服务调用频繁,适用于RPC。

对外服务、单体服务、例如为浏览器提供服务,适合用HTTP,特别是HTTP2.0。

RPC框架

编解码层

  • 代码编译工具将IDL文件转换成不同语言可以依赖得lib代码
  • 序列化&反序列化:对象↔二进制字节流

尽量序列化后的数据体积更小,网络传输带宽消耗越小。

协议层

支持解析多种协议,或者自定协议。

作用:TCP通道中的二进制包,传输时会被拆分、合并,因此需要应用层确定消息边界。

网络传输层

一般可以使用成熟的网络通信框架(例如netty)。

会封装基础的socket来实现,或者使用IO多路复用来实现高并发、可靠传输。

RPC热门框架

gRPC

  • 提供基础的RPC通信能力。
  • 提供跨语言调用,适合不同语言提供服务的场景。
  • 没有服务治理机制。需要开源工具实现服务发现、负载均衡、熔断限流等功能。

服务治理型

rpcx、dubbo

  • 提供基础的RPC通信能力。
  • 提供服务治理能力。服务发现、负载均衡、熔断限流。

服务治理

  • 服务端

服务注册:上报服务名和服务的IP、端口

健康检测:心跳,让调用方知道服务出现问题

限流:过载保护、访问量过大

  • 客户端

服务发现:根据服务名发现服务的IP、端口

路由策略:实现流量隔离,隔离联调环境

负载均衡:分发请求到服务集群的每一个节点

重试机制:故障重连

故障熔断:确认下游异常,直接截断请求,快速执行失败

目录
相关文章
|
6月前
|
编解码 JSON 网络协议
Golang 语言使用标准库 net/rpc/jsonrpc 包跨语言远程调用
Golang 语言使用标准库 net/rpc/jsonrpc 包跨语言远程调用
62 0
|
3月前
|
网络协议 Java 程序员
SpringCloud 远程调用为啥要采用HTTP,而不是RPC?
关于SpringCloud远程调用采用HTTP而非RPC。
68 0
|
3月前
|
Go
Go语言RPC实战:打造自己的远程调用服务
Go语言RPC实战:打造自己的远程调用服务
36 0
|
6月前
|
消息中间件 存储 缓存
远程调用RPC和消息MQ区别
远程调用RPC和消息MQ区别
48 0
|
10月前
|
网络协议 Dubbo Java
【远程调用框架概述 一】基于HTTP和RPC的远程调用方式
【远程调用框架概述 一】基于HTTP和RPC的远程调用方式
253 0
|
11月前
|
消息中间件 XML JSON
一文就读懂RPC远程调用核心原理
rpc的全称是Remote Procedure Call,即远程过程调用,是分布式系统的常用通信方法。 Remote,简单来说的话就是两个不同的服务之间,两个服务肯定是两个不同的进程。因此,我们就从跨进程进行访问的角度去理解就行了。 Procedure,意思是一串可执行的代码,我们写Java的方法,就是一段课程行的代码。 Call,即调用,调用的就是跨了进程的方法。
264 0
一文就读懂RPC远程调用核心原理
|
XML 监控 Dubbo
Dubbo+Zookeeper的简单使用---实现RPC远程调用
通过本篇博文,快速了解分布式相关知识并快速上手dubbo+Zookeeper实现RPC的远程调用。
Dubbo+Zookeeper的简单使用---实现RPC远程调用
|
JavaScript 网络协议 PHP
PHP 远程调用以及RPC框架
PHP 远程调用以及RPC框架
319 0
|
Android开发
【Android Binder 系统】一、Binder 系统核心 ( IPC 进程间通信 | RPC 远程调用 )
【Android Binder 系统】一、Binder 系统核心 ( IPC 进程间通信 | RPC 远程调用 )
164 0
【Android Binder 系统】一、Binder 系统核心 ( IPC 进程间通信 | RPC 远程调用 )