什么是gRPC?
Google远程过程调用(gRPC)是一款高性能开源框架,用于通过HTTP/2实现API。它旨在帮助开发人员更轻松地构建分布式应用程序,尤其适用于代码可能在不同计算机上运行的情况。
Google远程过程调用(gRPC)是一种高性能开源框架,用于通过HTTP/2实现API。它旨在帮助开发者更轻松地构建分布式应用程序,尤其适用于代码可能在不同计算机上运行的情况。
gRPC最初由Google开发,用于实现远程过程调用(RPC)。如今,gRPC是云原生计算基金会的孵化项目,这意味着它已用于生产环境,并得到活跃贡献者群体的支持。
为什么要创建gRPC?
要了解Google为何开发gRPC,我们先简要回顾一下API设计的发展历程。
RPC是设计和构建API的早期方式之一。借助RPC,您可以像编写在本地计算机上运行的代码一样进行编码,但实际上调用的可能是另一台计算机(通常位于本地网络中)上运行的服务。
在实践中,开发人员可以直接执行操作(如 SendUserMessages、addEntry 等),无需考虑网络细节。RPC 消息轻量且高效,但与底层系统紧密耦合,因此难以集成和更改,也更容易泄露系统的详细信息。
引入REST API架构后,它通过提供一种使用通用HTTP方法(如GET、POST、PUT和DELETE)访问数据和资源的统一方式,解决了其中一些难题。虽然REST简化了数据访问,但API返回的元数据往往超出实际需要。REST API还需要更多网络相关信息(例如请求的发送位置),因此不如RPC轻量、高效。
gRPC 有哪些优势?
gRPC采用较新的技术,对传统RPC方法进行了改进,使其具备互操作性并提高效率。如今,在为微服务架构开发API时,gRPC是一个颇具吸引力的选择。
gRPC的一些优势包括:
- 性能:gRPC使用HTTP/2作为传输协议,并默认使用Protocol Buffers,因此性能可能优于REST和JSON通信。
- 流式传输:gRPC支持为事件驱动型架构提供数据流式传输,例如服务器端流式传输、客户端流式传输,以及可同时发送客户端请求和服务器响应的双向流式传输。
- 互操作性:gRPC支持多种编程语言,并内置代码生成功能,包括C++、Java、Python、PHP、Go、Ruby、C#、Node.js等。
- 安全性:gRPC提供可插拔的身份验证、跟踪、负载均衡和运行状况检查,有助于提升安全性和韧性。
- 云原生:gRPC非常适合基于容器的部署,并兼容现代云技术,例如Kubernetes和Docker。
总体而言,gRPC提供了一个高性能且灵活的框架,非常适合高度分布式微服务架构中的服务间通信。
了解gRPC:基本概念
gRPC的优势和益处主要源于采用了两项技术:
- 用于构建消息结构的Protocol Buffers
- 使用HTTP/2作为传输层
使用Protocol Buffers构建消息结构
gRPC使用Protocol Buffers(或称Protobuf)而非XML或JSON来定义服务和消息。它是一种与语言无关的机制,用于序列化服务之间传递的结构化消息。
与REST API的OpenAPI规范概念类似,gRPC中的API契约通过.proto文本文件实现,开发者可在其中定义所需的数据结构。随后,protoc编译器会自动将.proto文本文件编译为任何受支持的语言。运行时,消息会经过压缩并以二进制格式发送。
这带来了两项主要优势:
- gRPC采用二进制格式表示数据,可减小消息大小,因此占用的CPU资源更少。
- 明确定义架构,确保客户端与服务器之间顺畅交换消息,从而减少错误。
以HTTP/2作为传输层
传统上,REST API使用HTTP/1.1作为传输层。虽然REST API也可以通过HTTP/2传输,但gRPC仅使用HTTP/2,因此具备一些关键优势。其中一项优势是能够以二进制格式传输数据。此外,HTTP/2支持并行处理多个请求,而不必逐个处理。通信也是双向的,这意味着单个连接可以同时发送请求和响应。
总体而言,这可以提升性能并降低网络利用率,在繁忙的微服务架构中尤其有价值。不过,它也存在一些限制。现代Web浏览器通常不支持HTTP/2,因此可能需要使用NGINX等反向代理来交付应用。
gRPC 与 REST 对比
目前,REST是广泛采用的API设计风格,因此可作为与gRPC进行比较的实用参照。REST和gRPC都是为Web应用和微服务构建API的有效方法,两者并无绝对优劣之分。不过,了解它们的主要区别有助于根据具体需求选择合适的工具。
gRPC与REST之间的一些主要区别可归为以下几类:
- 协议
- 数据格式
- 流式传输
- API设计
- 性能
- 错误处理
- 语言支持
协议
虽然REST API可以利用HTTP/2,但RESTful服务传统上使用基于文本的HTTP/1.1作为传输层。gRPC仅使用HTTP/2,这种二进制协议效率更高,并支持标头压缩以及在单个TCP连接上进行多路复用等功能。
数据格式
REST API通常使用JSON作为发送和接收数据的数据格式。JSON基于文本,易于读写,并受到广泛支持。gRPC API使用Protobuf,其二进制格式可减小有效负载并加快交互速度。不过,Protobuf本身不易直接读取。
流式传输
REST API支持请求-响应模型,但对流式传输的支持有限。相比之下,gRPC API通过HTTP/2传输,并支持多种通信模式,包括一元调用(请求-响应)、服务器流式传输、客户端流式传输和双向流式传输。
API设计
REST是一种以资源为中心的模型,支持GET、POST、PUT和DELETE等标准HTTP方法。每个请求都必须包含处理该请求所需的全部信息。此外,API契约通常使用OpenAPI规范编写,而客户端和服务器端的编码则作为单独的步骤进行。相比之下,gRPC是一种以服务为中心的模型,其消息和服务在.proto文件中定义。该文件可用于为API客户端和服务器端生成代码。
性能
REST通过HTTP/1.1传输基于文本的数据,因此速度可能较慢。每个请求都需要进行TCP握手,这可能会带来一定延迟。gRPC支持通过HTTP/2使用多个流,因此多个客户端可以同时发送多个请求,而无需建立新的TCP连接。它还可利用HTTP/2的标头压缩等功能。
错误处理
REST使用标准HTTP状态码处理错误。相比之下,gRPC可以更精细地定义错误状态码,并确保其一致性。默认情况下,gRPC模型的功能较为有限,但通常会使用功能更丰富的Google开发的错误模型进行扩展。
语言支持
几乎所有编程语言都广泛支持REST,但REST不提供内置的代码生成功能,具体实现完全由开发者负责。借助protoc编译器,gRPC可为多种编程语言生成原生代码。
是否应使用gRPC替代REST?
总之,选择gRPC还是REST取决于需要实现的目标。gRPC为分布式应用中的服务通信提供了一种高效且高性能的方式。不过,Web浏览器和其他客户端无法直接读取gRPC,因此需要通过API网关或NGINX等反向代理与前端客户端交互。对于事件驱动型微服务架构中的内部API,gRPC是一个理想选择。
相比之下,REST应用广泛,几乎支持所有语言。由于使用JSON或XML交换数据,因此人和机器都可以读取。此外,REST入门学习成本低得多,并且受到许多Web浏览器的支持,非常适合公开API。
gRPC微服务架构
gRPC是微服务架构中广受认可的通信方案之一。这不仅得益于其性能,还得益于灵活的语言支持。开发人员可以轻松构建和生成以其首选语言运行的gRPC客户端和服务器。由于gRPC以二进制格式描述API契约,因此无论使用何种语言构建,微服务都可以相互通信。
一种常见的基于gRPC的微服务架构是在微服务前部署API网关,并通过gRPC处理所有内部通信。API网关处理通过HTTP/1.1传入的请求,并将其作为基于HTTP/2的gRPC请求代理到微服务。
gRPC安全问题
随着gRPC的采用日益广泛,开发人员和安全运营团队需要确保部署有效的安全解决方案。由于gRPC消息采用二进制格式,依赖ASCII通信的设备和工具可能会出现问题。
gRPC API也容易受到多种常见的API安全威胁。访问控制、加密和运行时保护等标准API安全实践,在基于gRPC的架构中同样重要。
gRPC安全建议
保障gRPC应用和API的安全需要采用整体方法。保护gRPC的建议做法包括:
- 架构验证:通过验证gRPC消息中的每个字段是否具有正确的类型和预期内容,阻止恶意利用。
- 数据掩码:对信用卡号和社会保障号码等敏感数据进行掩码处理,或阻止其离开系统。
- 速率限制:严格限制请求的大小和数量,防止资源耗尽型DoS攻击。
- 访问控制:在允许客户端访问服务之前,强制执行身份验证和授权。
- 加密:使用传输层安全协议(TLS)保护传输中的消息。
最后,应确认所使用的API网关、Web应用防火墙(WAF)及其他API管理和安全工具能够在生产环境中保护gRPC应用和API。这些工具应能够导入每项服务的.proto文件,并利用该文件为gRPC应用和API实施安全防护。
总结
gRPC日益受到开发者以及众多大型企业的青睐,例如Netflix和Lyft都将其作为微服务架构中的一种常用替代方案。不过,gRPC并不能取代REST API,也并非天然优于其他API构建方式。如果主要为内部微服务环境构建API,并且需要高效的实时通信,gRPC只是一个可考虑的替代方案。
展望未来,凭借性能优势和开发便捷性,gRPC可能会继续在云原生应用中得到更广泛的采用。与此同时,需要公开提供API的开发者仍会在应用中使用REST。由于具备向后兼容性,并与现有API基础设施和运维体系深度集成,REST也将继续用于云原生环境。

