【译】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的优点
增强开发人员的生产力
使用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文件,可以端到端地生成消息和客户端代码。客户端的代码生成消除了客户端和服务器上重复的消息定义,并为您创建了一个强类型的客户端。无需编写客户端,可在拥有许多服务的应用程序中为开发者节省大量开发时间。
高性能
gRPC消息使用Protobuf(一种有效的二进制消息格式)进行序列化。Protobuf在服务器和客户端上可以实现非常快速地序列化。Protobuf序列化产生的消息负载也较小,这在有限带宽的移动应用程序等情况下很重要。
gRPC需要HTTP/2,这是HTTP的主要版本,与HTTP 1.x相比,它具有显着的性能优势:
二进制成帧和压缩。HTTP/2协议在发送和接收方面都是紧凑高效的。
在单个TCP连接上多个HTTP/2调用的复用。复用消除了应用程序层的队头阻塞。
实时服务
HTTP/2为长期的实时通信流提供了基础,gRPC为通过HTTP/2的流传输提供很好的支持。
gRPC服务支持所有流组合:
一元(无串流)
服务器到客户端流
客户端到服务器流
双向流
请注意,将消息广播到多个连接的概念本身并不天然存在于gRPC中。例如,在一个聊天室中,一个新的聊天消息应该发送到该聊天室中的所有客户端,这就要求每个gRPC调用将新的聊天消息分别流式传输到客户端。SignalR是此方案的一个适用框架,SignalR具有持久连接的概念,并内置了对广播消息的支持。
超时措施 与 取消机制
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入门全家桶 。
恰童鞋骚年,风华也许不再正茂,但却仍想挥斥方遒。
本公众号会长期关注和分享.NET Core,Microservice,Cloud Native,DevOps等技术内容文章,还会与你分享个人生活成长的点滴及各类好书的读书笔记,希望能对你有所帮助,一起成长!
点个【在看】,和更多人一起分享!
【译】gRPC vs HTTP APIs相关推荐
- soap rest_REST是新的SOAP
soap rest Written by Pascal Chambon, reviewed by Raphaël Gomès 由Pascal Chambon撰写,由RaphaëlGomès评论 Upd ...
- Win10 基于Docker使用tensorflow serving部署模型
目录 安装Docker for Windows 安装 tensorflow-serving-api tensorflow serving on docker 测试tf server 方法3:grpc ...
- tensorflow estimator的使用
由于以前都是使用tensorflow底层的API,在模型移植方面有一些问题,就考虑到了使用它的高级API estimator.estimator是tensorflow的一个高级API,它的好处就是不用 ...
- 【半译】两个gRPC的C#库:grpc-dotnet vs Grpc.Core
grpc-dotnet 是在2019年随着 .NET Core 3.0 一起发布的一个gPRC官方库.在ASP.NET Core 的 gRPC项目模板里面就使用了这个库. .NET Core 3.0之 ...
- 新书上市 | 6岁的gRPC,终于出书了!
gRPC是由谷歌开源的高性能远程过程调用框架.再过十几天,它就满6岁了.虽然gRPC的采用率正呈指数级增长,但中文领域一直没有一本综合介绍该技术的实体书.现在,这种尴尬局面终于被打破了! 新 书 上 ...
- 【译】保护 Consul 在特定设置中免受 RCE 风险的影响
2018年11月27日 Consul 团队 介绍 我们最近注意到了一组恶意软件,它们主要针对具有允许远程执行代码这一特定配置的 Consul nodes . 我们的社区成员也 (负责任地) 报告了此恶 ...
- [译] 关于 Angular 动态组件你需要知道的
原文链接:Here is what you need to know about dynamic components in Angular 本文主要解释如何在 Angular 中动态创建组件(注:在 ...
- [译] RESTful API 设计最佳实践
https://juejin.im/entry/6844903503953920007 [译] RESTful API 设计最佳实践 阅读 8779 收藏 0 2017-10-16 原文链接: seg ...
- [官方] mysql 性能优化文档(中英文自译)
大家好,我是烤鸭: 根据官方文档翻译并精简部分内容.建议有时间的朋友下载原版查看,全文106页pdf,快的话1-2天就能看完.自己翻译的有些地方可能不完整,欢迎指正. 官方pdf下载,需登录: htt ...
最新文章
- idea自动捕获_Smilefie:如何通过检测微笑来自动捕获自拍
- 电脑桌面图标异常 计算机只显示C盘,Windows7系统桌面图标异常如何解决?
- RESTful API概述
- druid dubbo 生产者_dubbo项目扩展druid sql监控
- 关键字 标识符 数据类型
- 基于JAVA+SpringMVC+Mybatis+MYSQL的大学生兼职网站
- EMNLP'21 | Dialogue System 对话系统
- MacOS串口调试工具minicom配置
- sqlserver2005安装(附加sqlserver2005 和 sqlserver2005 sp4补丁,完整安装包)
- 中国诗词大会第四季第一场
- Gson转换错误导致Int变为Double类型
- JAVA水晶报表从环境搭建到创建动态水晶报表
- Pandas:深市股票代码前补足0
- 【记vue项目中的踩坑日记】一杯茶一包烟,一个bug搞一天
- 计算机读博ccfc有用吗,考研复试面试用细节赢得导师认可
- “希希敬敬对”团队——敏捷冲刺Alpha过程总结
- 哥本哈根大学计算机科学,计算机科学理科学士
- 基于明度(亮度)和RGB通道方差的异常图片检测:筛除病理切片的组织液、肌肉和纯色区域(深色、亮色图片检测)
- TeamViewer未知原因错误
- 步步为营-50-事务