首页 > 其他分享 >微服务、gGRPC、protobuf、rest和json

微服务、gGRPC、protobuf、rest和json

时间:2022-11-26 12:55:07浏览次数:40  
标签:protobuf gRPC json JSON REST gGRPC API Protobuf 客户端

微服务、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 可实现高性能数据交换。

 

标签:protobuf,gRPC,json,JSON,REST,gGRPC,API,Protobuf,客户端
From: https://www.cnblogs.com/hnxxcxg/p/16927256.html

相关文章

  • 数据库存json数据类型,参数JSONObject/JSONArray类型返回的结果映射为null
    【问题】数据库存json数据类型,参数JSONObject/JSONArray类型返回的结果映射为null【原因】实体类上少加了 autoResultMap=true参数,导致返回json数据为null  ......
  • elasticsearch批量导入json数据
     json 数据集的内容以行作为分割,不要添加除换行以外的空格每两行作为一条文档,第一行的_index指明索引,_id指明该条文档的id;第二行为具体的数据内容; 不管下面哪种方......
  • 有了 Protocol buffer 还是用 JSON
    Protocolbuffer这东西真的很轻便吗? ​​​​ Protocolbuffer这东西一点都不轻便,定义文件后需要重新编译一次,编译出来的代码没有可读性,没有可调试的可能。版本不兼容Pr......
  • Golang中一个不错的处理 JSON 的库 go-dproxy
    国庆七天,你是吃多了,还是睡多了?放假七天转眼即逝,接下来的七天可能你又觉得会很漫才。言归正传。Golang虽然自己就带了JSON(encoding/json)处理的库,也有第三方的simplejs......
  • 深和jsonp【转】 jsonpk跨域问题详解
    取不到数据!上周客户新买了服务器,原本在旧的服务器上放着客户的Web主页信息和一个后台程序(asp.net),在客户的主页中有一个动态显示最新消息的处理,这个处理就是通过ajax异......
  • 【大一C语言项目】Cjson的认识与实现(一)
    【大一C语言项目】Cjson的认识与实现(一)一、初识json参考网站​​​菜鸟教程:JSON​​​​JSON介绍​​​​JSON在线解析​​JSON是什么JSON指的是JavaScript对象表示法(Jav......
  • 【大一C语言项目】Cjson的认识与实现(二)
    【大一C语言项目】Cjson的认识与实现(二)参考资料:​​​哔哩哔哩CJson开源库使用及注意事项​​​​CJson开源项目下载地址​​​​cJSON源码刨析​​一、使用Cjson库下载CJSO......
  • VUE读取本地json文件并解析
    //读取本地json文件exportfunctionGetUserAction(query){letquesa=axios.get('/json/userAction.json').then(res=>{//获取public下的buildmenu.json......
  • SQL Server 解析Json(单层/多层)
    一,单层Json数据取出1.取出取出@JsonData字符串中的 __type,DocNo,OrderPriceTC,Organization_Code字段  DECLARE@JsonDataNVARCHAR(max)=''SET@JsonData='[{......
  • C#指定获取Json对象里的指定值 .net framework mvc示例
    C#中C#指定获取Json对象里的指定值https://www.cnblogs.com/sky6699/p/6889762.html 获取的json数据类型样式{"status":0,"msg":"","data":[......