>_ DevTrendszh

语言

首页

语言

板块

前端 后端 移动端 DevOps AI / ML 游戏开发 区块链 安全
C-plus-plus

gRPC 如何为微服务通信带来秩序

想象你正在构建一个复杂系统,其中十几个使用不同语言的服务需要不断交换数据。通常我们会采用熟悉的REST,编写一堆JSON模式,然后为类型和性能苦苦挣扎。在某个时刻你会意识到:消耗CPU资源来打包和解包文本是一种可疑的乐趣。这就是gRPC登场的时候。

这到底是什么

简而言之,gRPC是一个现代化的远程过程调用框架。它由Google创建,旨在解决数千个内部服务之间高效交互的问题。其主要特点是:对于你的代码来说,调用另一台服务器上的函数几乎与调用本地方法相同。

该项目托管在grpc/grpc仓库中,汇集了C++、Python、Ruby等多种语言的实现,这些实现都围绕一个通用的C核心构建。

为什么要迁移到它

当我在一个真实项目中第一次尝试gRPC时,最吸引我注意的并非速度,而是严格的契约。

契约至上

在gRPC中,你不是从代码开始,而是从用.proto文件描述接口开始。你清楚地描述数据结构和方法。从这个文件开始,一个特殊的编译器会生成你所需语言的客户端和服务器代码。不再有争论说日期应该作为字符串还是数字传递——一切都在模式中指定。

速度和二进制格式

gRPC使用Protocol Buffers(Protobuf)而不是在网络上传输笨重的JSON。这是一种二进制格式,更加紧凑,解析速度更快。对于移动应用或高负载后端,流量消耗和CPU的差异很快就会变得明显。

开箱即用的流式传输

REST始终是"请求-响应"模式。gRPC允许你实现一些很酷的功能:

  • 客户端流式传输(向服务器发送数据流)。
  • 服务器流式传输(服务器发送更新流)。
  • 双向流式传输(全双工)。

这非常适合聊天、监控系统或分块传输大文件。

底层工作原理

该仓库构建在src/core之上——一个共享的C库。特定语言的包装器围绕它展开。有趣的是,某些实现(如Go或Java)被放在单独的仓库中,以更好地适应这些语言的生态系统。

gRPC运行在HTTP/2之上。这提供了多路复用能力(在一个连接中处理多个请求)和头部压缩。如果你习惯于通过curl调试请求,你需要在这里重新学习一点,因为通道中的数据在没有特殊工具的情况下对人类是不可读的。

在哪里使用

我不建议到处都用gRPC。例如,如果你为第三方开发者制作公共API,REST仍然是事实上的标准,因为它很简单。

但在两种情况下gRPC是必不可少的:

  1. 内部微服务厨房。当有许多服务且它们不断相互通信时。类型和代码生成节省了数周的开发时间。
  2. 多语言架构。如果你有Python的分析服务、Go的主后端和C++的内存关键部分,gRPC可以将它们无缝连接。

从哪里开始学习

该仓库有一个优秀的examples文件夹。它包含从经典的"Hello World"到复杂流式传输场景的示例。

要运行一个简单的Python服务器,只需几个命令:

pip install grpcio
pip install grpcio-tools

然后你在.proto中描述你的服务,生成代码,并实现逻辑。

gRPC不是"REST杀手",而是一个用于特定任务的有力工具。由于代码生成设置,它在开始时需要多一点努力,但在未来会因稳定性和性能而获得回报。如果你厌倦了因为有人在另一端更改了JSON中的字段而捕获错误,一定要看看这个项目。这是一个在架构上自律确实能简化生活的例子。

相关项目