随着微服务架构和云原生架构的出现,传统的单体应用程序被分解为一组细粒度的、自治的和面向业务能力的“微服务”,网络通信链路的数量激增,进程间(或服务间/应用程序间)通信技术也因此成为了现代分布式系统中至关重要的一个环节。
目前,最常见最传统的进程间通信方式是构建一个Restful服务,将应用程序建模为一个可访问的资源集合,然后通过http协议进行服务调用,获取资源或者变更资源状态。然而,在比较多的场景下Restful服务对于构建进程间通信来说过于庞大、低效且容易出错,需要一个比Restful服务更高效的高可扩展、松耦合的进程间通信技术。因此,诞生了gRPC,一种用于构建分布式应用程序和微服务的现代进程间通信方式。
《深入了解grpc》系列文章从以下几个方面来讲解grpc技术:
本篇文章讲述第一个方面,即“grpc介绍”。后续会用4-5篇文章讲述另外两方面。
gRPC是一种进程间通信技术。在 gRPC 中,客户端可以直接调用不同机器上的服务端的方法,就像调用本地函数一样。
与许多 RPC 系统一样,gRPC 基于定义服务的思想,指定可以远程调用的接口及其参数和返回类型。服务端实现这个接口并运行一个 gRPC 服务器来处理客户端调用。而客户端有一个stub(在某些语言中也称为client),它提供与服务器相同的方法。客户端通过调用stub的方法来与服务端进行通信,获取响应结果。
下图为开发gRPC应用的一个示例:
RPC技术随着时间的推移出现了翻天覆地的变化,出现了各种RPC技术的实现来满足现代需求,并提供更好、更高效的开发体验。本节主要是了解RPC技术是如何演化成如今的gRPC的。
RPC 是一种流行的进程间通信技术,用于构建客户端-服务器应用程序。使用 RPC,客户端可以像调用本地方法一样远程调用方法的功能。早期有几个比较流行的RPC实现,例如CORBA、RMI等,它们用于构建和连接服务或应用程序。然而,大多数此类传统的RPC实现都非常复杂,因为它们建立在TCP等通信协议之上,互操作性较差,定义的协议规范也很繁琐。
由于 CORBA 等传统 RPC 实现的局限性,简单对象访问协议 (SOAP) 被微软、IBM 等大型企业设计并大力推广。SOAP 是面向服务架构 (SOA) 中的标准通信技术,用于在服务(在 SOA 的上下文中通常称为 Web 服务)之间交换基于 XML 的结构化数据,并通过任何底层通信协议(例如 ,HTTP)进行通信。
使用 SOAP,你可以定义服务接口、该服务的操作以及用于调用这些操作的关联 XML 消息格式。SOAP 是一种相当流行的技术,但消息格式的复杂性以及围绕 SOAP 构建的规范的复杂性降低了构建分布式应用程序的敏捷性。因此,在现代分布式应用程序开发中,SOAP Web 服务被认为是一种遗留技术。大多数现有的分布式应用程序现在都不是使用 SOAP,而是使用 REST 架构风格开发的。
Representational State Transfer (REST) 是一种源自 Roy Fielding 博士论文的架构风格。Fielding 是 HTTP 规范的主要作者之一,也是 REST 架构风格的鼻祖。REST 是面向资源架构 (ROA) 的基础,你可以将分布式应用程序建模为资源的集合,访问这些资源的客户端可以更改这些资源的状态(创建、读取、更新或删除)。
REST 的实际实现是 HTTP,在 HTTP 中,你可以将 RESTful Web 应用程序建模为可使用唯一标识符 (URL) 访问的资源集合,可通过HTTP方法(GET、POST、PUT、DELETE、PATCH 等)来变更这些资源的状态。资源状态以文本格式表示,例如 JSON、XML、HTML、YAML 等。
使用带有 HTTP 和 JSON 的 REST 架构风格构建应用程序已成为构建微服务的常见方式。然而,随着微服务数量的激增及网络交互的愈发复杂,RESTful 服务已经无法满足预期的现代需求。RESTful 服务有几个关键限制,使它难以成为现代基于微服务的应用程序的消息传递协议:
谷歌一直在使用一个名为Stubby的通用 RPC 框架来连接数千个在多个数据中心运行并使用不同技术构建的微服务。其核心 RPC 层被设计成可以处理每天数百亿规模的请求。Stubby 有很多很棒的特性,但是它与 Google 的内部基础架构耦合得太紧密了,没有标准化,不能用作通用框架。
2015 年,Google发布了开源 RPC 框架gRPC,它是一个标准化的、通用的、跨平台的 RPC 基础设施。gRPC 旨在提供与 Stubby 相同的可扩展性、性能和功能。
从那时起,随着 Netflix、Square、Lyft、Docker、Cisco 和 CoreOS 等大公司的大规模采用,gRPC 的受欢迎程度在过去几年中急剧增长。后来,gRPC 加入了云原生计算基金会 (CNCF,最受欢迎的开源软件基金会之一,致力于使云原生计算变得普遍和可持续),并从 CNCF 生态系统项目中获得了巨大的关注度。
gRPC带来的优势是越来越多地公司采用 gRPC 的关键。这些优势包括:
与任何技术一样,gRPC 也有一些缺点:
Apache Thrift是一个类似于 gRPC 的 RPC 框架(最初由 Facebook 开发,后来捐赠给 Apache)。它使用自己的接口定义语言并提供对多种编程语言的支持。Thrift 允许你在定义文件中定义数据类型和服务接口,并根据你定义的文件为客户端和服务器端生成代码。Thrift 传输层为网络 I/O 提供抽象,并将 Thrift 与系统的其余部分解耦,这意味着它可以在任何传输实现上运行,例如 TCP、HTTP 等。
如果将 Thrift 与 gRPC 进行比较,你会发现两者几乎都遵循相同的设计和使用目标。但是,两者之间有几个重要的区别:
GraphQL是另一种技术(由Facebook最先创建并标准化),在构建进程间通信方面非常流行。GraphQL 为传统的客户端-服务器通信提供了一种完全不一样的实现,它是 API 的一种查询语言,允许客户端来决定他们想要什么数据、他们想要怎么获取数据以及他们想要什么格式的数据。而gRPC对于客户端和服务器之间的通信方式有一个固定的协议。
GraphQL 更适合直接面向外部的服务或 API,其中客户端需要对从服务器获取的数据进行更多控制。
在 GraphQL 和 gRPC 的大多数现实例子中,GraphQL 被用于面向外部的服务/API,而面向内部的服务则使用 gRPC 实现。
gRPC 是一种可扩展、松耦合且类型安全的解决方案,与传统的基于 REST/HTTP 的通信相比,它实现了更高效的进程间通信。它允许你像本地方法调用一样调用、调试分布式应用程序。
gRPC 也可以被认为是传统 RPC 的演变,并且已经设法克服了它们的局限性。它被各种互联网公司广泛采用,以满足其进程间通信需求,最常用于构建内部服务到服务的通信。
本文系外文翻译,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文系外文翻译,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有