RPC

113 阅读5分钟

RPC即远程过程调用(Remote Procedure Call) 背景: 随着业务逐渐扩大,服务逐渐细分,很多服务之间需要通过远程分布式接口调用通讯,即不同的服务不是部署在同一个服务器上,个时候我们就需要远程调用不同的服务,使用的时候调用远程服务就像调用本地服务一样,引入一个 jar 包,就能通过 this.xxx( ) 一样调用远程服务,这背后的机制就是通过 RPC 技术。

RPC协议广泛的应用于分布式系统中,主要用于不同计算机(即服务节点)间的通信,RPC主要是基于Socket,而Socket又基于TCP,因此我们可以理解为RPC基于TCP协议(部分RPC框架基于HTTP协议),在TCP的基础上增加了编程语言的机制,比如反射、编码与解码、以及动态代理,因此我们可以认为RPC只是一个概念,而实现这一概念有不同方式,典型的RPC框架如gRPC、Thrift、Netty、Dubbo等都是基于这一思想。微服务架构中的RPC(Remote Procedure Call)是一种用于实现分布式系统中服务间通信的机制。RPC允许一个服务调用另一个服务的方法,就像本地调用一样,而无需开发者手动处理底层的网络通信和数据序列化等细节 image.png

HTTP即超文本传输协议,HTTP是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从WWW服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加高效,使网络传输减少。 HTTP协议是处于OSI网络模型的最上层应用层的协议,基于TCP协议,是通信协议中相对简单的协议之一,为什么简单呢?我认为原因有二:一是封装了大量的协议和报文头,使用简单,二是明文传输,处理简单,也是基于此,HTTP协议成为了互联网中最广泛的协议之一。

HTTP和RPC的区别:

  • 1695091920358.png
  • 用途不同:HTTP通常用于在客户端和服务器之间传输文本、图像、音频、视频等静态资源,或者进行基于文本的Web应用通信。RPC通常用于分布式系统中,服务之间的调用和数据交换。 RPC的适用性:比起http请求 通信的效率 带宽利用率更高 也就是在报文中 有效数据的占比更高
  • 通信模式不同:http请求响应,rpc直接调用就像在本地调用一样

RPC应用场景

主要解决了分布式系统中,服务与服务之间的调用问题。

  1. 微服务架构中的各个服务需要相互通信,以实现系统的功能 RPC提供了简单的接口,使得服务间通信更加方便,服务可以直接调用其他服务的方法,而无需关心底层通信细节。
  2. 微服务系统需要进行服务治理,包括服务注册、发现、负载均衡等
    RPC框架通常集成了服务注册与发现机制,可以自动将服务注册到服务注册中心,同时提供了负载均衡策略,确保请求均匀分布到各个服务实例。
  3. 需要在微服务系统中优化服务间的通信性能
    RPC框架通常会提供性能优化的选项,例如连接池、数据压缩、异步调用等,以提高服务间通信的效率和响应速度。
  4. 需要确保分布式系统中的多个服务在一次事务中保持一致性。 RPC框架通常集成了分布式事务管理机制,可以确保分布式系统中的各个服务在事务中的操作是原子性的,要么全部成功,要么全部失败。

RPC框架

分布式 - 公司使用什么RPC框架,聊聊你理解的RPC原理_rpc服务端都是集群部署吗,当一台机器突然挂掉会怎样_Q.E.D.的博客-CSDN博客

一个最简单的 RPC 框架分成三个部分:注册中心、服务端、客户端。以下是一个最简单的结构流程图
image.png 组成部分:
注册中心:用于注册和获取服务。
服务端:指提供服务的一方,也叫服务提供方 Provider
客户端:指调用服务的一方,也叫服务消费者 Consumer

流程:
服务端把服务信息注册到注册中心,通常包含服务端地址、接口类和方法。
客户端从注册中心获取对应服务的信息。
客户端根据服务的信息,通过网络调用到服务端的接口。

一个最基本的RPC框架需要包含以下部分:

  1. 注册中心:注册中心负责服务信息的注册与查找
    • 服务端在启动的时候,扫描所有的服务,然后将自己的服务地址和服务名注册到注册中心。
    • 客户端在调用服务之前,通过注册中心查找到服务的地址,就可以通过服务的地址调用到服务啦。
    • 常见的注册中心有 ZookeeperEureka 等
  2. 动态代理:客户端调用接口,需要框架能自己根据接口去远程调用服务,这一步是用户无感知的。这样一来,就需要使用到动态代理,用户调用接口,实际上是在调用动态生成的代理类。常见的动态代理有:JDK ProxyCGLibJavassist 等
  3. 网络传输:RPC 远程调用实际上就是网络传输,所以网络传输是 RPC 框架中必不可少的部分。
  4. 自定义协议:网络传输需要制定好协议,一个良好的协议能提高传输的效率。
  5. 序列化:网络传输肯定会涉及到序列化,常见的序列化有JsonProtostuffKyro 等。

设计一个rpc协议

设计一个rpc协议

  • 序列化
  • 进程间通信包体很大怎么优化
  • 分批传输
  • 压缩(gzip和zlib)
  • 优化数据结构:确保数据结构中没有不必要的字段和重复数据,以减少数据包的大小
  • 流式传输