本文翻译自 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 greetingsmessage HelloReply {  string message = 1;}

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

Program.csvar 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相关推荐

  1. soap rest_REST是新的SOAP

    soap rest Written by Pascal Chambon, reviewed by Raphaël Gomès 由Pascal Chambon撰写,由RaphaëlGomès评论 Upd ...

  2. Win10 基于Docker使用tensorflow serving部署模型

    目录 安装Docker for Windows 安装 tensorflow-serving-api tensorflow serving on docker 测试tf server 方法3:grpc ...

  3. tensorflow estimator的使用

    由于以前都是使用tensorflow底层的API,在模型移植方面有一些问题,就考虑到了使用它的高级API estimator.estimator是tensorflow的一个高级API,它的好处就是不用 ...

  4. 【半译】两个gRPC的C#库:grpc-dotnet vs Grpc.Core

    grpc-dotnet 是在2019年随着 .NET Core 3.0 一起发布的一个gPRC官方库.在ASP.NET Core 的 gRPC项目模板里面就使用了这个库. .NET Core 3.0之 ...

  5. 新书上市 | 6岁的gRPC,终于出书了!

    gRPC是由谷歌开源的高性能远程过程调用框架.再过十几天,它就满6岁了.虽然gRPC的采用率正呈指数级增长,但中文领域一直没有一本综合介绍该技术的实体书.现在,这种尴尬局面终于被打破了! 新 书 上 ...

  6. 【译】保护 Consul 在特定设置中免受 RCE 风险的影响

    2018年11月27日 Consul 团队 介绍 我们最近注意到了一组恶意软件,它们主要针对具有允许远程执行代码这一特定配置的 Consul nodes . 我们的社区成员也 (负责任地) 报告了此恶 ...

  7. [译] 关于 Angular 动态组件你需要知道的

    原文链接:Here is what you need to know about dynamic components in Angular 本文主要解释如何在 Angular 中动态创建组件(注:在 ...

  8. [译] RESTful API 设计最佳实践

    https://juejin.im/entry/6844903503953920007 [译] RESTful API 设计最佳实践 阅读 8779 收藏 0 2017-10-16 原文链接: seg ...

  9. [官方] mysql 性能优化文档(中英文自译)

    大家好,我是烤鸭: 根据官方文档翻译并精简部分内容.建议有时间的朋友下载原版查看,全文106页pdf,快的话1-2天就能看完.自己翻译的有些地方可能不完整,欢迎指正. 官方pdf下载,需登录: htt ...

最新文章

  1. idea自动捕获_Smilefie:如何通过检测微笑来自动捕获自拍
  2. 电脑桌面图标异常 计算机只显示C盘,Windows7系统桌面图标异常如何解决?
  3. RESTful API概述
  4. druid dubbo 生产者_dubbo项目扩展druid sql监控
  5. 关键字 标识符 数据类型
  6. 基于JAVA+SpringMVC+Mybatis+MYSQL的大学生兼职网站
  7. EMNLP'21 | Dialogue System 对话系统
  8. MacOS串口调试工具minicom配置
  9. sqlserver2005安装(附加sqlserver2005 和 sqlserver2005 sp4补丁,完整安装包)
  10. 中国诗词大会第四季第一场
  11. Gson转换错误导致Int变为Double类型
  12. JAVA水晶报表从环境搭建到创建动态水晶报表
  13. Pandas:深市股票代码前补足0
  14. 【记vue项目中的踩坑日记】一杯茶一包烟,一个bug搞一天
  15. 计算机读博ccfc有用吗,考研复试面试用细节赢得导师认可
  16. “希希敬敬对”团队——敏捷冲刺Alpha过程总结
  17. 哥本哈根大学计算机科学,计算机科学理科学士
  18. 基于明度(亮度)和RGB通道方差的异常图片检测:筛除病理切片的组织液、肌肉和纯色区域(深色、亮色图片检测)
  19. TeamViewer未知原因错误
  20. 步步为营-50-事务

热门文章

  1. 第2天:汇编语言与Makefile
  2. POJ1269 Intersecting Lines 计算几何 C语言
  3. 扩展Windows Mobile模拟器存储空间的方法
  4. Membership学习记录
  5. Cocos Creator Ui系统
  6. Mac 登陆 去掉 其他用户
  7. Android应用程序之间共享文字和图片(一)
  8. Relaltek声卡在UBUNTU下没有声音的解决方法。
  9. SQL Server的数据导入MySQL数据库方法简介
  10. .NET MAUI 已在塔架就位 ,4月份发布RC