【译】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 = ;
} // The response message containing the greetings
message HelloReply {
string message = ;
}
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的更多信息,请查看以下资源:
- 阅读gRPC for .NET Core文档。
- 试用gRPC入门教程。
- 观看gRPC for ASP.NET Core,这是一个高性能API的新框架,在NDC Sydney上介绍了gRPC的简介。
此外,这里译者也推荐一下俺们大成都的晓晨Master的最新博文系列:ASP.NET Core gRPC入门全家桶 。
【译】gRPC vs HTTP APIs的更多相关文章
- 进行API开发选gRPC还是HTTP APIs?
上一篇文章我带着大家体验了一把<ASP.NET Core 3.0 上的gRPC服务模板初体验(多图)>,如果有兴趣的可以点击链接进行查看,相信跟着做的你,也是可以跑起来的.这篇文章我们将一 ...
- gRPC版本的 Google APIs
gRPC将是未来google所有客户端的库标准(DevoxxFR), 这句话的出处: https://twitter.com/chanezon/status/585724143003402240 ...
- gRPC错误码 http状态码 provide your APIs in both gRPC and RESTful style at the same time
How gRPC error codes map to HTTP status codes in the response https://github.com/grpc-ecosystem/grpc ...
- [译]Node.js : Building RESTful APIs using Loopback and MySQL
国庆后可能就要使用StrongLoop那套东西来做项目了 原文:http://www.javabeat.net/loopback-mysql/ Loopback是什么? Loopback是一个开源的N ...
- 【译】gRPC负载均衡
原文地址:https://github.com/grpc/grpc/blob/master/doc/load-balancing.md gRPC负载均衡 范围 本文档解释了gPRC的负载均衡的设计. ...
- (译)xDS REST and gRPC protocol
xDS REST and gRPC protocol 原文地址:xDS REST and gRPC protocol. envoy可通过文件系统.一个或多个管理服务器来发现各种动态资源.这些服务发现和 ...
- 「译」 .NET 6 中 gRPC 的新功能
gRPC是一个现代的.跨平台的.高性能的 RPC 框架.gRPC for .NET 构建在 ASP.NET Core 之上,是我们推荐的在 .NET 中构建 RPC 服务的方法. .NET 6 进一步 ...
- [译]Angular2 和TypeScript -- 一次简要的预览
原文链接:https://www.infoq.com/articles/Angular2-TypeScript-High-Level-Overview 作者: Yakov Fain Posted o ...
- go 版本 gRPC 环境搭建(3.0正式版)
之前装过 gRPC 的各个测试版本,有些残余的文件,正式版的安装和之前残留的清除整理如下: 安装 go 版本的 gRPC go 的安装略过.需要 go 1.5 以上版本. $ go version ...
随机推荐
- 实战webpack系列03
03.Webpack的强大功能 一.生成Source Maps(使调试更容易) 通过简单的配置,webpack就可以在打包时为我们生成的source maps,这为我们提供了一种对应编译文件和源文件的 ...
- JS的引用顺序真的灰常重要
JS的引用一定要记得顺序,不然常常会被小小的问题卡住很久.
- linux命令之less命令
一.我查看日志特别喜欢用less命令来查看,下面给大家讲解下使用. less(选项)(参数) 选项如下: -e:文件内容显示完毕后,自动退出: -f:强制显示文件: -g:不加亮显示搜索到的所有关键词 ...
- df命令、du命令、磁盘分区 使用介绍
第4周第1次课(4月9日) 课程内容:4.1 df命令4.2 du命令4.3/4.4 磁盘分区 4.1 df命令 汇报磁盘空间使用情况,linux磁盘挂载点是无法直接访问的. df 和 df -h区别 ...
- html元素是否包含另外一个元素,以及classList属性
如何判断一个元素A包含了元素B呢?如果不用contains方法的话,如何做呢? 腾讯面试的时候也出了这道题啊,当时没看dom的知识,所以一抹黑哦... 那就判断B是否为A的child喽,那也就是A是B ...
- RestTemplate常用的get和post带参数请求
在RestTemplate提供的方法中,有一个参数就是目标URL,参数是跟在后面的一个数量可变参数,但是在这里就有个问题,这个方法怎么知道我传的参数值是对应在目标接口的哪个参数的呢: public & ...
- Swoole高效跟传统的web开发有什么区别?
一.swoole的运行模式 Swoole高效跟传统的web开发有什么区别,除了传统的LAMP/LNMP同步开发模式,swoole的异步开发模式是怎么样的. 1.1.传统web开发模式 PHP web开 ...
- P4072 [SDOI2016](BZOJ4518) 征途 [斜率优化DP]
题目描述 Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到达T地.除第m天外,每一天晚上Pine都必须在休息站过夜.所以,一段路 ...
- 最短路 & 差分约束 总结
一.引例 1.一类不等式组的解 二.最短路 1.Dijkstra 2.图的存储 3.链式前向星 4.Dijkstra + 优先队列 ...
- ThreadLocal的进化——TransmittableThreadLocal
上一篇文章中,我们谈到了 InheritableThreadLocal,它解决了 ThreadLocal 针对父子线程无法共享上下文的问题.但我们可能听说过阿里的开源产品TransmittableTh ...