作为一名前端开发,平时我主要在浏览器环境下进行开发。随着项目的发展,我们开始涉及到服务端渲染SSR,这让我接触到了RPC。我发现RPC和HTTP有很大的不同,于是我学习了一些RPC相关的知识,这里和大家分享下。
1. RPC是什么
RPC(Remote Procedure Call)是一种远程过程调用协议,它允许程序调用另一个地址空间(通常是在另一台计算机上)的过程或方法。流行的PRC框架很多,例如gRPC。
gRPC是Google开发的一个高性能、开源的通用RPC框架,支持多种编程语言。gRPC使用Protocol Buffers(简称Protobuf)作为IDL(接口定义语言)和二进制数据传输格式,这使得gRPC具有高性能、跨语言支持和强类型安全等优点。
2. 为什么使用RPC而不是HTTP
在服务端渲染场景中,前端应用需要频繁地与后端服务进行通信以获取数据。使用HTTP协议可能会遇到以下问题:
- 性能较低:HTTP协议使用文本格式传输数据,这会导致数据冗余和传输效率较低。
- 传输数据冗余较大:HTTP协议的头部字段通常包含大量重复信息,这会增加传输数据的冗余。
使用RPC(如gRPC)可以解决这些问题:
- 高性能、低延迟:gRPC使用二进制格式传输数据,减少数据冗余和提高传输效率。同时,gRPC默认使用HTTP/2协议,支持多路复用、头部压缩等特性,降低延迟并提高传输性能。
- 更紧凑的数据传输:gRPC使用Protobuf作为数据传输格式,它具有更紧凑的数据表示,降低了传输数据的冗余。
具体的业务场景下,如果使用http调用后台服务,一般需要经过后台的一个rpc-http中转服务(因为后台基本都是rpc服务,需要一个类似网关的存在让http与rpc可以互相调用),加上http本来存在的性能问题。直接调用rpc比调用http,可以有较为明显的耗时减少(我的接口有大概20-30%的耗时减少)
除了更低的耗时,直接调用RPC服务,可以减少rpc-http中转服务这层的调用,降低了调用链路的复杂度和服务器资源的消耗。
很多公司的RPC服务都有成熟的服务间调用监控和链路追踪,日志打印等服务,直接调用RPC可以享受到这些既有框架的技术成果。
3. HTTP与RPC对比
服务端渲染场景无疑是使用RPC是优于HTTP的,但是HTTP与RPC其实各有优缺点,下面我们分几个维度对比下HTTP与RPC的优缺点。
- 通信效率:HTTP协议的无状态性质和文本数据传输,它在处理大量请求时可能效率较低。而RPC协议通常使用二进制数据传输,能够更高效地处理请求和响应
- 数据传输: HTTP协议通常使用JSON或XML等文本格式进行数据传输,而RPC协议可以使用多种数据传输格式,如二进制、JSON、XML等,具体取决于所使用的RPC框架和协议
- 接口定义:HTTP协议通常需要遵循约定(如RESTful规范)或使用额外的描述语言(如OpenAPI)来描述API接口;RPC协议使用跨语言的IDL(如Protobuf)来描述接口,具有更强的类型安全性。
- 异常处理: HTTP协议使用HTTP状态码来表示请求的状态,如200表示成功,404表示资源不存在等。而RPC协议通常使用自定义的异常处理机制,可以更细粒度地处理各种异常情况
- 适用场景:HTTP协议主要用于Web应用(浏览器环境,不支持RPC,只能使用HTTP),适用于构建RESTful API和前后端分离的项目;RPC协议主要用于分布式系统,适用于构建高性能、低延迟的微服务架构。
- 复杂性: HTTP协议基于简单的请求-响应模式,易于理解和实现。RPC协议的抽象层次较高,学习成本相对较高。开发者需要了解RPC协议的原理和具体实现,以及如何使用IDL描述接口
4. 如何做技术选型
- 项目需求:如果你的项目主要是Web应用,那么HTTP可能是更好的选择。如果你的项目需要构建高性能、低延迟的微服务架构,那么RPC可能更适合。
- 团队技能:如果你的团队对HTTP协议更熟悉,那么使用HTTP可能更容易上手。如果你的团队有分布式系统的经验,那么RPC可能是一个更好的选择。
- 生态系统:HTTP协议有着丰富的生态系统,许多开源库和框架都支持HTTP。RPC协议的生态系统相对较弱,但仍有一些优秀的框架和库,如gRPC。
5. 前端开发应用RPC的场景
在现代Web开发中,前端开发者可能需要承担更多服务端编码任务,这使得了解RPC变得更加重要。例如:
- 服务端渲染(SSR):在服务端渲染的场景中,前端应用需要在服务端获取数据并渲染页面。在这种情况下,服务端可以使用RPC(如gRPC)与其他后端服务进行高效通信,然后将结果返回给前端应用。
- RPC网关:前端开发者可能需要实现RPC网关,将浏览器中的HTTP请求转换为后端服务的RPC调用。这可以提高后端服务之间的通信效率,同时使前端应用能够继续使用HTTP进行通信。
- 编写后台服务:随着前端开发者在全栈开发中扮演越来越重要的角色,他们可能需要编写后台服务。了解RPC协议及其优点有助于前端开发者在编写后台服务时做出更好的技术决策。
在非浏览器场景中,前端开发者也可能会直接使用RPC进行通信。例如:
- 跨平台开发框架(如React Native):在使用React Native等跨平台开发框架时,前端开发者可以使用RPC与后端服务进行通信。这可以提高性能并简化接口定义。
- Kotlin Multiplatform:Kotlin Multiplatform是一种允许在多个平台(包括Web、Android、iOS等)共享代码的技术。在使用Kotlin Multiplatform进行开发时,前端开发者可以使用RPC与后端服务进行高效通信。
了解RPC协议及其在前端开发中的应用场景,可以更好地承担服务端编码任务,以及在非浏览器场景中进行高效通信。