在我们深入讨论gRPC的细节之前,澄清远程通信领域各种术语之间的关系非常重要,这有时可能令人困惑。
RPC — 远程过程调用
根据维基百科的定义,“在分布式计算中,远程过程调用(RPC)是指计算机程序导致在不同地址空间中执行过程(子程序),通常在共享网络上的另一台计算机上,就好像它是一个正常的(本地)过程调用,程序员没有明确编写远程交互的详细信息。”
简而言之,这是一种让一个计算机程序请求另一个程序执行某项任务的方式,即使它们位于不同的计算机上也可以。这有点像在您的程序中调用一个函数,尽管它是在不同的机器上执行的。这是一种过程调用,就好像它在同一台机器上一样,但实际上不在同一台机器上,RPC库/框架负责抽象化所有这些复杂性。
RPC流程
RPC框架负责屏蔽底层的传输方法(TCP或UDP)、序列化方法(XML/JSON/二进制)和通信细节。服务调用者可以像调用本地接口一样调用远程服务提供者,而不必关心底层通信。这涉及到调用的细节和过程。
REST
REST代表表述性状态传输,是一种用于设计网络应用程序的成熟架构风格。RESTful API使用HTTP请求执行CRUD(创建、读取、更新、删除)操作,通常表示为URL。REST API以其简单性和使用GET、POST、PUT和DELETE等标准HTTP方法而闻名。
HTTP
HTTP(超文本传输协议)是互联网上的数据通信基础。它定义了消息的格式和传输方式,以及Web服务器和浏览器如何响应各种命令。HTTP随着时间的推移发生了演变,不同版本提供了各种功能和改进:
- HTTP/1.0:HTTP的第一个版本非常简单,缺少许多现代功能。在HTTP/1.0中,每个请求都需要一个新的TCP连接,导致效率低下。
- HTTP/1.1:通过引入保持活动连接的机制,HTTP/1.1改进了HTTP/1.0,允许多个请求和响应在单个TCP连接上发送,从而减少了延迟。然而,它仍然存在一些限制,比如“头部阻塞”问题,其中一个慢速请求可以阻止同一连接中的后续请求,导致“瀑布”效应。
- HTTP/2:HTTP/2引入了二进制帧机制,允许多路复用、请求优先级和头部压缩。这些增强显著提高了网络通信的效率和速度。它通过允许在单个连接内有多个并发流来消除“头部阻塞”问题。
- HTTP/3:最新版本HTTP/3通过使用QUIC传输协议进一步提高性能。它侧重于减少延迟,特别是在存在高丢包率或不可靠网络的情况下。HTTP/3设计得比其前身更具弹性和高效性。
所以现在我们了解了这些术语。让我们开始吧!
什么是gRPC?
gRPC(这里的“g”代表什么?)是一种进程间通信技术,允许您连接、调用、操作和调试分布式异构应用程序,就像进行本地函数调用一样简单。
当您开发gRPC应用程序时,首先要做的是定义一个服务接口。服务接口定义包含有关如何消费服务的信息,允许消费者调用哪些远程方法,调用这些方法时要使用什么方法参数和消息格式,等等。我们在服务定义中指定的语言称为接口定义语言(IDL)。
gRPC使用协议缓冲区作为定义服务接口的IDL。协议缓冲区是一种与语言无关、平台中立、可扩展的机制,用于序列化结构化数据。
gRPC架构
是什么让gRPC拥有闪电般的性能?以下是内部情况:
HTTP/2: 2015年,HTTP/2取代了HTTP/1.1,提供了多路复用功能,允许多个请求和响应共享单个连接,提高了效率。
- 请求/响应多路复用: 由于HTTP/2的二进制帧,gRPC可以在单个连接内处理多个请求和响应,彻底改变了通信效率。
- 头部压缩: HTTP/2的HPack策略压缩头部,减小了有效负载大小。再加上gRPC的高效编码,这使性能非常出色。
Protobuf:秘密武器
gRPC效率游戏中的关键因素之一是协议缓冲区,简称Protobuf。Protobuf定义数据结构和函数合同。客户端和服务器都需要使用相同的Protobuf语言,这是它们如何相互理解的方式。协议缓冲区(ProtoBuf)在gRPC框架内发挥三个主要作用:定义数据结构、指定服务接口,并通过序列化和反序列化增强传输效率。
gRPC的优势有哪些
除了有一个非常可爱的吉祥物外。采用gRPC的原因在于其独特的优势:
- 进程间通信的效率: 与JSON或XML不同,gRPC使用基于协议缓冲区的二进制协议进行通信,提高了速度。它建立在HTTP/2之上,使其成为最高效的进程间通信技术之一。
- 明确定义的服务接口和模式: gRPC鼓励优先进行合同定义,优先考虑服务接口定义,而不是深入研究实现细节。这种简单性、一致性、可靠性和可扩展性定义了应用程序开发体验。
- 强类型和多语言支持: gRPC使用协议缓冲区来定义服务,清晰地指定了应用程序之间通信的数据类型。这有助于提高稳定性,并减少运行时和互操作性错误。此外,gRPC可以与各种编程语言无缝集成,为开发人员提供了选择其首选语言的灵活性。
- 双向流和内置功能: gRPC本地支持客户端和服务器端的流式处理,简化了流式服务和客户端的开发。它还内置了对关键功能的支持,如身份验证、加密、弹性(包括截止日期和超时)、元数据交换、压缩、负载均衡和服务发现。
- 云原生集成和成熟性: 作为Cloud Native Computing Foundation(CNCF)的一部分,gRPC与现代框架和技术无缝集成,成为通信的首选选择。CNCF中的项目,如Envoy,支持gRPC,并且许多监控工具,包括Prometheus,与gRPC应用程序有效地配合使用。此外,gRPC在Google进行了广泛测试,并被广泛采用。