本文翻译自 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的更多信息,请查看以下资源:

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

作者:周旭龙

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

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

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

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

    上一篇文章我带着大家体验了一把<ASP.NET Core 3.0 上的gRPC服务模板初体验(多图)>,如果有兴趣的可以点击链接进行查看,相信跟着做的你,也是可以跑起来的.这篇文章我们将一 ...

  2. gRPC版本的 Google APIs

    gRPC将是未来google所有客户端的库标准(DevoxxFR), 这句话的出处: https://twitter.com/chanezon/status/585724143003402240    ...

  3. 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 ...

  4. [译]Node.js : Building RESTful APIs using Loopback and MySQL

    国庆后可能就要使用StrongLoop那套东西来做项目了 原文:http://www.javabeat.net/loopback-mysql/ Loopback是什么? Loopback是一个开源的N ...

  5. 【译】gRPC负载均衡

    原文地址:https://github.com/grpc/grpc/blob/master/doc/load-balancing.md gRPC负载均衡 范围 本文档解释了gPRC的负载均衡的设计. ...

  6. (译)xDS REST and gRPC protocol

    xDS REST and gRPC protocol 原文地址:xDS REST and gRPC protocol. envoy可通过文件系统.一个或多个管理服务器来发现各种动态资源.这些服务发现和 ...

  7. 「译」 .NET 6 中 gRPC 的新功能

    gRPC是一个现代的.跨平台的.高性能的 RPC 框架.gRPC for .NET 构建在 ASP.NET Core 之上,是我们推荐的在 .NET 中构建 RPC 服务的方法. .NET 6 进一步 ...

  8. [译]Angular2 和TypeScript -- 一次简要的预览

    原文链接:https://www.infoq.com/articles/Angular2-TypeScript-High-Level-Overview 作者:  Yakov Fain Posted o ...

  9. go 版本 gRPC 环境搭建(3.0正式版)

    之前装过 gRPC 的各个测试版本,有些残余的文件,正式版的安装和之前残留的清除整理如下:   安装 go 版本的 gRPC go 的安装略过.需要 go 1.5 以上版本. $ go version ...

随机推荐

  1. .Net Core使用分布式缓存Redis:基础

    一.前言 Redis的介绍网上很多不再赘述.本次环境为net core 2.2,使用的StackExchange.Redis来操作Redis. 二.引用Microsoft.Extensions.Cac ...

  2. day26

    绑定方法 分为对象绑定方法和类的绑定方法 绑定方法的特殊之处 绑定给谁就是谁来调用 类的绑定方法 绑定给类,类来调用,会把类自身传过来 不需要通过对象 ,只需要通过类就能获取到一些东西的时候,用类的绑 ...

  3. Semaphore回顾

    用途 在多线程访问可变变量时,是非线程安全的.可能导致程序崩溃.此时,可以通过使用信号量(semaphore)技术,保证多线程处理某段代码时,后面线程等待前面线程执行,保证了多线程的安全性.使用方法记 ...

  4. powerline字体安装

    安装命令 git clone https://github.com/powerline/fonts ./install.sh 了解powerline ->美化自己的命令行环境,增加漂亮的状态行, ...

  5. Spring MVC中的Controller是Serlvet吗?

    1. Controller不是Servlet DispatcherServler是Spring MVC中的唯一Servlet,(这点可通过查看FrameworkServlet的子类确认) Servle ...

  6. Java修炼——暂停线程的四个方法

    线程的获取方法:Thread.currentThread() 后面可以加上获取线程的名字 .getName() 这样就成功获取到了线程的名字.             Sleep会导致当前线程休眠一定 ...

  7. HTML_body中常用的标签部分

    meta: <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <t ...

  8. 第七章 jQuery中的事件与动画

    事件的分类 基础事件: 鼠标事件 键盘事件 window事件 表单事件 复合事件: 鼠标光标悬停 鼠标连续点击 基础事件: 实例: mouseenter()和mouseover()用法的区别: mou ...

  9. CF296C Greg and Array 查分数组

    题目链接:http://codeforces.com/problemset/problem/296/C 题意:给你n.m.k,表示n个数a[i],m个对数的操作,k个对操作的操作.m个操作:数a[l] ...

  10. linux-export

    使自定义普通变量转换为环境变量: 1. env查看环境变量 2. 设置临时环境变量,关机重启时不生效. export path=$path:/usr/sbin/ 3. 修改profile文件,关机重启 ...