微服务、gGRPC、protobuf、rest和json

微服务、gGRPC、protobuf、rest和json

到目前为止,基于 REST 的 API 已经成为大多数服务间通信的首选架构。
虽然基于 REST / JSON 的通信有几个好处,并且得到跨语言和提供商的广泛支持,但由于 JSON,它的有效负载大小很大。因此,它的性能效率不高。它还缺乏对流数据等有效载荷的内在支持。
使用 Protobuf 的 HTTP/2 上的 gRPC 已成为一种高性能替代方案,可提供数量级的改进,并迅速成为大多数服务间通信的首选标准。

JSON、REST、HTTP/1 的局限性
使用 JSON 有效负载的 REST API 在许多情况下都运行良好,并将继续如此。但是,当需要高性能时,限制就会变得明显。
虽然它是人类可读且易于理解的,但由于 JSON 有效负载和自 1997 年以来尚未发展的 HTTP1.1,它相当繁重且缓慢!
基于资源/CRUD 操作而不是以 API 为中心。
仅支持客户端请求服务器模型。没有对流数据的固有支持。
没有标准化的方式来定义 API 契约。开发人员需要使用第三方解决方案,例如 Swagger 和 OpenAPI。

JSON 是使用 XML 时代的重大升级!JSON 提供了人类可读、易于理解和灵活的模式定义。它具有用于开发、测试和故障排除的成熟工具集。JSON 还广泛支持多种语言。
然而,对于进程间通信——尤其是在微服务架构中,这会导致许多问题。不强制执行架构定义。由于文本格式,JSON 具有很大的有效负载(即使在应用 gzip 等压缩技术之后)。并且不支持评论、元数据和文档。
Protocol buffers (Protobufs) 是 Google 的语言中立、平台中立、可扩展的结构化数据序列化机制。Google 着手改进 XML,使其更小、更快、更简单。然而,它最终比后来的 JSON更好!Protobufs 也有其公平的好处:
二进制格式不同于基于文本的 JSON。这导致有效载荷大小明显更小。
跨服务的 .proto 定义强制实施的模式
跨多种语言(由不同服务使用)自动生成样板代码以进行数据交换
支持评论、文档和元数据
Uber 工程人员比较了各种编码和压缩选项,发现带有 zlib 的 Protobuf的性能比 JSON 好几个数量级。

gRPC
gRPC 是来自 Google 的一种现代、轻量级和高性能的通信协议。虽然基于 RPC 的架构从臭名昭著的 CORBA 时代就已经存在,但 gRPC 采用了使用 Protobuf、HTTP/2 的现代方法。
gRPC 与 CORBA 一样,允许您连接到分布式异构应用程序,就好像它是本地调用一样。
开发基于 RPC 的服务涉及使用接口定义语言 (IDL) 的服务定义。gRPC 原生支持使用 Protobuf 的服务定义。您定义可以远程调用的方法,以及可以交换的消息——请求和响应。
gRPC 框架处理与以下相关的复杂性:
执行服务合同
数据序列化、编组和解组
网络通讯
TLS 加密负载
认证授权
可观察性等

Protobuf 和 gRPC 与语言无关。这有助于我们在异构环境中构建服务器和客户端,同时保持强大的类型安全性,克服分布式环境中常见的运行时和互操作性问题。

gRPC 与基于标准 REST 的通信相比有几个优势:
更好的性能和安全性
本机支持双向和异步通信。gRPC 支持以下内容
单向通信:传统的客户端调用服务器导致单个请求和响应
服务器流:单个客户端请求导致来自服务器的多个响应
客户端流式处理:单个请求中来自客户端的多个有效负载
双向流媒体
面向 API 而不是面向资源
使用 Protobuf 以多种语言自动生成样板代码
端到端管道自动处理,无需开发人员的努力

整体 gRPC API 的执行速度比等效的 REST API 快 11 倍。

gRPC + Protobuf 的挑战
有限的社区支持
虽然 Protobuf 支持多种主要语言,但它不如 JSON 广泛
更长的学习曲线
更长的引导时间——与 REST 相比,初始设置需要时间
缺乏人类可读性——导致解决问题的复杂性
不太适合面向外部的应用程序——JSON 有更好的支持

REST API 比 gRPC 更适合的情况
客户端希望通过浏览器访问 API,基于 JavaScript/Python 的客户端无法合并构建过程以使用 gRPC 生成的客户端代码或仅使用 cURL 命令的客户端。(虽然这可以使用 API 网关(例如 Google Cloud Endpoint)启用,但它不是 gRPC API 的现成可用功能)
话虽如此,我相信带有 Protobufs 的 gRPC 应该是异构微服务之间通信的事实上的标准/解决方案。

许多编程语言都对 gRPC 提供开箱即用的支持。
gRPC 支持与语言无关的服务定义。
自动生成语言本地客户端存根和服务器框架。
gRPC 处理数据序列化、通过 HTTP/2 的本机连接、安全性、AuthN 和 AuthZ 中涉及的所有复杂性。
gRPC 使开发人员能够专注于 API 开发——就像进行本地函数调用一样简单。
带有 Protobuf 的 gRPC 可实现高性能数据交换。

 

posted @ 2022-11-26 12:49  delphi中间件  阅读(173)  评论(0编辑  收藏  举报