【译】gRPC vs HTTP APIs

本文翻译自 ASP.NET Blog | gRPC vs HTTP APIs,作者 James,译者 Edison Zhou

写在开头

  现在,ASP.NET Core使开发人员可以构建gRPC服务。gRPC是一个远程过程调用框架,专注于高性能和开发人员的生产力。ASP.NET Core 3.0中集成了gRPC,因此您可以结合使用现有的ASP.NET Core日志系统,配置系统,身份验证模式来构建新的gRPC服务。

  这篇文章将gRPC与基于JSON的HTTP API进行了比较,讨论了gRPC的优缺点,以及何时可以使用gRPC构建应用程序。

gRPC的优点

1、增强开发人员的生产力

  使用gRPC服务,客户端应用程序可以直接在不同计算机上的服务应用上调用方法,就好像它是本地对象一样。gRPC基于定义服务的思想,指定可以通过传递参数和返回类型的远程调用方法。服务器端,实现此接口并运行gRPC服务来处理客户端调用。客户端,使用强类型的gRPC客户端,该客户端提供与服务器相同的方法。

  gRPC能够实现对代码生成的完美支持的目标。gpro开发的核心文件是.proto文件,该文件使用Protobuf接口定义语言(IDL)定义gRPC服务和消息的契约,例如下面这个Greet.proto文件所示:

Greet.proto

// The greeting service definition.
service Greeter {
  // Sends a greeting
  rpc SayHello (HelloRequest) returns (HelloReply);
}

// The request message containing the user‘s name.
message HelloRequest {
  string name = 1;
}

// The response message containing the greetings
message HelloReply {
  string message = 1;
}

  Protobuf IDL是一种语言无关的语法,因此它可以在gRPC服务和不同语言实现的客户端之间共享。gRPC框架使用.proto文件来生成服务基类、消息和完整客户端的代码进行编码。例如,这里使用生成的强类型Greeter客户端来调用服务:

Program.cs

var channel = GrpcChannel.ForAddress("https://localhost:5001")
var client = new Greeter.GreeterClient(channel);

var reply = await client.SayHelloAsync(new HelloRequest { Name = "World" });
Console.WriteLine("Greeting: " + reply.Message);

  通过在服务器和客户端之间共享.proto文件,可以端到端地生成消息和客户端代码。客户端的代码生成消除了客户端和服务器上重复的消息定义,并为您创建了一个强类型的客户端。无需编写客户端,可在拥有许多服务的应用程序中为开发者节省大量开发时间。

2、高性能

  gRPC消息使用Protobuf(一种有效的二进制消息格式)进行序列化。Protobuf在服务器和客户端上可以实现非常快速地序列化。Protobuf序列化产生的消息负载也较小,这在有限带宽的移动应用程序等情况下很重要。

  gRPC需要HTTP/2,这是HTTP的主要版本,与HTTP 1.x相比,它具有显着的性能优势:

  • 二进制成帧和压缩。HTTP/2协议在发送和接收方面都是紧凑高效的。
  • 在单个TCP连接上多个HTTP/2调用的复用。复用消除了应用程序层的队头阻塞

3、实时服务

  HTTP/2为长期的实时通信流提供了基础,gRPC为通过HTTP/2的流传输提供很好的支持。

  gRPC服务支持所有流组合:

  • 一元(无串流)
  • 服务器到客户端流
  • 客户端到服务器流
  • 双向流

  请注意,将消息广播到多个连接的概念本身并不天然存在于gRPC中。例如,在一个聊天室中,应将新的聊天消息发送到该聊天室中的所有客户端,要求每个gRPC调用将新的聊天消息分别流式传输到客户端。SignalR是此方案的一个适用框架,SignalR具有持久连接的概念,并内置了对广播消息的支持。

4、超时措施 与 取消机制

  gRPC允许客户端指定他们愿意等待一个RPC完成的最长时间。该期限被发送到服务器,服务器可以决定它是否超出了限期采取什么行动。例如,服务器可能会在超时后取消正在进行的gRPC/HTTP/数据库请求。

  通过子gRPC调用传播最长时限和取消机制,有助于强制执行资源限制行为。

gRPC的缺点

有限的浏览器支持

  gRPC具有出色的跨平台支持!如今,gRPC已经有了多种编程语言的实现。但是,您仍然无法直接从浏览器中调用gRPC服务。gRPC大量使用了HTTP/2的功能,但却没有浏览器提供支持gRPC客户端的Web请求所需的控制级别。例如,浏览器不允许调用者要求使用HTTP/2,或提供对HTTP/2协议之下的帧的访问。

  gRPC-Web是gRPC团队的另一项技术,可在浏览器中提供有限的gRPC支持。gRPC-Web由两部分组成:一个支持所有现代浏览器的JavaScript客户端,以及服务器上的一个gRPC-Web代理。gRPC-Web客户端调用代理,代理将gRPC请求转发到gRPC服务器。

  gRPC-Web并非支持所有gRPC的功能。例如,它不支持客户端和双向流,并且对服务器流的支持也很有限。

不可读

  使用JSON的HTTP API请求以文本形式发送,并且适合利于阅读和创建。

  默认情况下,gRPC消息使用Protobuf编码。尽管Protobuf可以高效发送和接收,但其二进制格式不是很可读的。Protobuf要求在.proto文件中指定的消息接口描述才能正确地反序列化。此外,还需要额外的工具来分析网络上的Protobuf有效负载并手动编写请求。

  好在,已经有了一些诸如服务器反射gRPC命令行工具之类的功能来辅助二进制Protobuf消息。另外,Protobuf消息也支持与JSON之间的转换。内置的JSON转换提供了一种在调试时将Protobuf消息与可读的JSON形式之间相互转换的有效方法。

gRPC建议方案

  gRPC非常适合以下情况:

  • 微服务 – gRPC专为低延迟和高吞吐量通信而设计。gRPC对于效率至关重要的轻量级微服务非常有用。
  • 点对点实时通信 – gRPC对双向流具有出色的支持。gRPC服务可以实时推送消息而无需轮询。
  • 多种语言环境 – gRPC工具支持所有流行的开发语言,因此gRPC是多语言环境的理想选择。
  • 网络受限的环境 – gRPC消息使用一种轻量级消息格式Protobuf进行序列化。gRPC消息的大小始终小于同等级别的JSON消息。

结论

  gRPC是ASP.NET Core开发人员的一个强大的新工具。尽管gRPC不能完全替代HTTP API,但在某些情况下可以提供更高的生产率和性能优势。

  ASP.NET Core上的gRPC现在已经可用了!如果您想了解有关gRPC的更多信息,请查看以下资源:

  此外,这里译者也推荐一下俺们大成都的晓晨Master的最新博文系列:ASP.NET Core gRPC入门全家桶 。

作者:周旭龙

出处:https://edisonchou.cnblogs.com

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。

原文地址:https://www.cnblogs.com/edisonchou/p/edc_gRPC_vs_HTTPapis_translation.html

时间: 2024-10-11 07:03:05

【译】gRPC vs HTTP APIs的相关文章

进行API开发选gRPC还是HTTP APIs?

上一篇文章我带着大家体验了一把<ASP.NET Core 3.0 上的gRPC服务模板初体验(多图)>,如果有兴趣的可以点击链接进行查看,相信跟着做的你,也是可以跑起来的.这篇文章我们将一起来探讨下gRPC服务如何与HTTP APIs进行比较.用于为应用程序提供API的技术是一个重要的选择,与HTTP API相比,gRPC提供了独特的优势.本文从gRPC的优缺点出发,并推荐了一些建议使用gRPC服务以及不建议使用gRPC服务的场景. 作者:依乐祝 原文链接:https://www.cnblog

gRPC版本的 Google APIs

gRPC将是未来google所有客户端的库标准(DevoxxFR), 这句话的出处: https://twitter.com/chanezon/status/585724143003402240    已经实现好的 Google APIs 可以在这里看到: https://github.com/google/googleapis   其中用到的 protobuf 3 虽然正式版还没有 release, 但是在下面地址可以看到最新的 release 信息, 目前最新是 v3.0.0-alpha-3

【译】gRPC的服务配置

原文地址:https://github.com/grpc/grpc/blob/master/doc/service_config.md gRPC的服务配置 目标 服务配置是一种允许服务拥有者去发布参数以自动的被所有对应的客户端使用的机制. 格式 服务配置是一个如下格式的JSON字符串: { // 负载均衡策略名 (不区分大小写). // 目前,客户端侧gRPC提供的唯一可用的是'轮询调度',但是第三方可能会添加他们自己的策略. // 这个字段是可选的:如果没设置,默认的行为是获取第一个可用的后台

【译】gRPC负载均衡

原文地址:https://github.com/grpc/grpc/blob/master/doc/load-balancing.md gRPC负载均衡 范围 本文档解释了gPRC的负载均衡的设计. 背景 每次调用的负载均衡 值得注意的是gRPC的负载均衡是反生在每次调用的基础上,而不是每条连接的基础上.换言之,即使所有请求都来自于同一个客户端,我们仍旧想要它们被负载到所有的服务器上. 负载均衡的方式 在gPRC的负载均衡之前,先研究一下一些常见的负载均衡方式. 代理模式 代理提供一个可靠的可以

(译)xDS REST and gRPC protocol

xDS REST and gRPC protocol 原文地址:xDS REST and gRPC protocol. envoy可通过文件系统.一个或多个管理服务器来发现各种动态资源.这些服务发现和他们相对应的API统称为xDS.通过定阅方式获取资源,如监控指定的文件路径.gRPC流或轮询REST-JSON URL.后两种使用DiscoveryRequest来发送请求消息.所有的资源包含在DiscoveryResponse响应消息中.下面,我们将讨论每种订阅类型. 文件订阅 动态配置最简单的方

[译]Introducing ASP.NET vNext and MVC 6

原文:http://www.infoq.com/news/2014/05/ASP.NET-vNext?utm_source=tuicool Part of the ASP.NET vNext initiative, ASP.NET MVC 6 represents a fundamental change to how Microsoft constructs and deploys web frameworks. The goal is to create a host agnostic fr

Android Api Component---翻译Fragment组件(二)

我们接着上一篇翻译吧Android Api Component---翻译Fragment组件(一) 与activity通信 尽管一个Fragment独立于一个Activity作为一个对象被实现并且在多个activity中被使用,给定的fragment实例绑定到了包含它的那个activity中. 特别的是,这个fragment使用getActivity()可以访问activity实例并且容易的执行像在activity布局中查找一个视图的任务: View listView = getActivity

gRPC初探

概览 在gRPC的官方文档中这样描述grpc的特点: 第一点:强大的接口描述语言(Powerful IDL) Protocol Buffers是一个强大的二进制序列化工具集和语言,你可以使用Protocol Buffers定义你的接口. 第二点:支持十种语言的类库 为各种语言编写的服务自动生成相应语言的客户端和服务端存根(也就是接口) 第三点:基于HTTP2协议 基于HTTP2标准设计,带了许多诸如双向流.流程控制.头部压缩.单TCP连接上的多路复用请求等特性. 这些特性使得其在移动设备上表现更

地铁译:Spark for python developers --- 搭建Spark虚拟环境1

一个多月的地铁阅读时光,阅读<Spark for python developers>电子书,不动笔墨不看书,随手在evernote中做了一下翻译,多年不习英语,自娱自乐.周末整理了一下,发现再多做一点就可基本成文了,于是开始这个地铁译系列. 本章中,我们将为开发搭建一个独立的虚拟环境,通过Spark和Anaconda提供的PyData 库为该环境补充能力. 这些库包括Pandas,Scikit-Learn, Blaze, Matplotlib, Seaborn, 和 Bokeh. 我们的操作