目录
- 前言
- 1. 没RPC
- 2. 有RPC
前言
对于八股或者知识点,常会被说到RPC框架的知识点
本文主要讲解RPC的基本逻辑
那先讲讲没有RPC的时候是怎样的
1. 没RPC
分布式系统中的服务之间通常采用其他方式进行通信,其中一种常见的方式是使用RESTful API
或者SOAP(Simple Object Access Protocol)
等协议进行通信
对于以下常见的协议,前两个为开发中常见的,后两个多数在408中听到
- RESTful API:
基于 HTTP 协议的通信方式,通过 HTTP 请求和响应来进行通信
服务之间可以通过发送 HTTP 请求来调用对方提供的服务,服务提供方则将结果封装在 HTTP 响应中返回给调用方 - SOAP:
SOAP 是一种基于 XML 的通信协议,定义一种在网络上交换结构化信息的方式
通过 SOAP,服务之间可以以 XML 格式进行通信,调用方通过构建 SOAP 消息发送给服务提供方,服务提供方解析 SOAP 消息并返回结果 - 消息队列:
消息队列是一种常用的异步通信方式,服务之间通过将消息发送到消息队列中,然后由消费者来消费消息,实现服务之间的解耦和异步通信 - Socket编程:
使用 Socket 编程直接建立网络连接进行通信
通过建立 TCP 或者 UDP 连接,服务之间可以直接发送和接收数据
以上的框架知识点都需要开发人员自己处理通信的细节,包括数据的序列化、网络传输、异常处理等
2. 有RPC
有RPC框架,可以大大简化分布式系统的开发和维护,提供了更加便捷的方式来进行服务间的通信
RPC是一种分布式系统中的通信模式,它允许一个程序调用另一个地址空间(通常是另一台机器上)的过程或函数,而不需要显式地处理网络细节
主要的两个概念:
- 远程过程调用:允许一个计算机程序在网络上调用另一个计算机上的程序的过程
- 网络通信:RPC通过网络进行通信,通过序列化和反序列化参数和返回值来实现远程调用
其中涉及的工作原理步骤如下:
- 客户端调用:客户端通过调用本地的RPC代理对象来发起远程调用
- 参数序列化:客户端将调用的参数序列化为字节流
- 网络传输:序列化后的数据通过网络传输到远程服务器
- 服务端解析:远程服务器接收到数据后,进行反序列化,解析出调用的参数
- 本地调用:服务端使用解析出的参数调用本地的函数或方法
- 结果序列化:服务端将调用结果序列化为字节流
- 网络传输:序列化后的结果通过网络传输到客户端
- 客户端解析:客户端接收到结果后,进行反序列化,得到最终的调用结果
其组成成分如下:
- 通信协议:定义了客户端和服务端之间的通信方式,如HTTP、TCP等。
- 序列化/反序列化:负责将参数和返回值序列化为字节流,并在接收端进行反序列化。
- 服务注册与发现:用于注册和发现可用的远程服务,使得客户端能够找到服务的地址。
- 负载均衡:用于将请求分发到多个服务实例上,以实现负载均衡。
- 服务调用:实现远程调用的核心逻辑,包括参数的序列化、网络通信、结果的反序列化等。
- 服务治理:提供监控、熔断、限流等功能,保证服务的稳定性和可用性
优点 | 缺点 |
---|---|
简化开发:隐藏了网络通信的细节,使得开发人员可以专注于业务逻辑的实现 提高性能:通过减少网络通信的开销,提高了系统的性能 提高可维护性:将不同的服务模块化,使得系统更易于维护和扩展 | 可靠性差:网络通信可能会受到各种因素的影响,影响了RPC调用的可靠性 复杂性高:部署和配置可能相对复杂,需要额外的管理和维护成本 性能问题:在某些情况下,由于网络通信的开销,可能会导致性能下降 |
举一些常见的RPC框架:
gRPC
:
由 Google 开发的高性能、开源的 RPC 框架,基于 HTTP/2 协议,使用 Protocol Buffers 作为序列化工具
支持多种编程语言,并提供了丰富的功能,如流式处理、认证、负载均衡等,适用于构建分布式系统和微服务架构Apache Dubbo
:
开源的高性能 Java RPC 框架,由阿里巴巴开发并开源
Dubbo 提供丰富的特性,包括服务注册与发现、负载均衡、容错机制等,支持多种通信协议和序列化方式,适用于构建大规模分布式系统Apache Thrift
:
由 Facebook 开发并开源的跨语言的 RPC 框架,支持多种编程语言,包括 C++、Java、Python 等
使用 IDL(Interface Definition Language)定义接口,支持多种传输协议和序列化协议,适用于构建跨语言的分布式系统Spring Cloud gRPC
:
Spring Cloud 生态中对 gRPC 的支持,使得在 Spring Cloud 中使用 gRPC 更加方便
提供了集成 gRPC 的各种组件,包括服务注册与发现、负载均衡等,适用于基于 Spring Cloud 的微服务架构