RPC远程调用介绍

《林老师带你学编程》知识星球是由多个工作10年以上的一线大厂开发人员联合创建,希望通过我们的分享,帮助大家少走弯路,可以在技术的领域不断突破和发展。

🔥 具体的加入方式:

RPC简介

RPC,英文全名remote procedure call,即远程过程调用。就是说一个应用部署在A服务器上,想要调用B服务器上应用提供的方法,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据。

可以这么说,RPC就是要像调用本地的函数一样去调远程函数。

RPC是一个完整的远程调用方案,它通常包括通信协议和序列化协议。

其中,通信协议包含http协议(如gRPC使用http2)、自定义报文的tcp协议(如dubbo)。序列化协议包含基于文本编码的xml、json,基于二进制编码的protobuf、hessian等。

protobuf 即 Protocol Buffers,是一种轻便高效的结构化数据存储格式,与语言、平台无关,可扩展可序列化。protobuf 性能和效率大幅度优于 JSON、XML 等其他的结构化数据格式。protobuf 是以二进制方式存储,占用空间小,但也带来了可读性差的缺点(二进制协议,因为不可读而难以调试,不好定位问题)。

Protobuf序列化协议相比JSON有什么优点?

1:序列化后体积相比Json和XML很小,适合网络传输

2:支持跨平台多语言

3:序列化反序列化速度很快,快于Json的处理速速

一个完整的RPC过程,都可以用下面这张图来描述

stub说的都是“一小块代码”,通常是有个caller要调用callee的时候,中间需要一些特殊处理的逻辑,就会用这种“小块代码”去做。

  1. 服务消费端(client)以本地调用的方式调用远程服务;
  2. 客户端 Stub(client stub) 接收到调用后负责将方法、参数等组装成能够进行网络传输的消息体(序列化):RpcRequest
  3. 客户端 Stub(client stub) 找到远程服务的地址,并将消息发送到服务提供端;
  4. 服务端 Stub(桩)收到消息将消息反序列化为Java对象: RpcRequest
  5. 服务端 Stub(桩)根据RpcRequest中的类、方法、方法参数等信息调用本地的方法;
  6. 服务端 Stub(桩)得到方法执行结果并将组装成能够进行网络传输的消息体:RpcResponse(序列化)发送至消费方;
  7. 客户端 Stub(client stub)接收到消息并将消息反序列化为Java对象:RpcResponse ,这样也就得到了最终结果。

# RPC 解决了什么问题?

让分布式或者微服务系统中不同服务之间的调用像本地调用一样简单。

# 常见的 RPC 框架有哪些?

  • Dubbo: Dubbo是 阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成。目前 Dubbo 已经成为 Spring Cloud Alibaba 中的官方组件。
  • gRPC :基于HTTP2。gRPC是可以在任何环境中运行的现代开源高性能RPC框架。它可以通过可插拔的支持来有效地连接数据中心内和跨数据中心的服务,以实现负载平衡,跟踪,运行状况检查和身份验证。它也适用于分布式计算的最后一英里,以将设备,移动应用程序和浏览器连接到后端服务。
  • Hessian: Hessian是一个轻量级的remoting on http工具,使用简单的方法提供了RMI的功能。 采用的是二进制RPC协议,因为采用的是二进制协议,所以它很适合于发送二进制数据。
  • Thrift: Apache Thrift是Facebook开源的跨语言的RPC通信框架,目前已经捐献给Apache基金会管理,由于其跨语言特性和出色的性能,在很多互联网公司得到应用,有能力的公司甚至会基于thrift研发一套分布式服务框架,增加诸如服务注册、服务发现等功能。

# 有了HTTP ,为啥还要用RPC进行服务调用?

首先,RPC是一个完整的远程调用方案,它通常包括通信协议和序列化协议。而HTTP只是一个通信协议,不是一个完整的远程调用方案。这两者不是对等的概念,用来比较不太合适。

RPC框架可以使用 HTTP协议作为传输协议或者直接使用自定义的TCP协议作为传输协议,使用不同的协议一般也是为了适应不同的场景。

HTTP+Restful,其优势很大。它可读性好,且应用广、跨语言的支持

但是使用该方案也有其缺点,这是与其优点相对应的:

  • 首先是有用信息占比少,毕竟HTTP工作在第七层,包含了大量的HTTP头等信息。
  • 其次是效率低,还是因为第七层的缘故,必须按照HTTP协议进行层层封装。

而使用自定义tcp协议的话,可以极大地精简了传输内容,这也是为什么有些后端服务之间会采用自定义tcp协议的rpc来进行通信的原因。

# 各种序列化技术

查看更多

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

滚动至顶部