gRPC 是一种在应用之间进行通信的现代方式。gRPC 使用 HTTP/2、流式处理、二进制序列化和消息协定来创建高性能的实时服务。.NET 对构建 gRPC 应用程序提供了出色的支持。
但是,与大多数技术选择一样,在选择gRPC而不是REST + JSON等替代方案时,需要权衡利弊。gRPC 的优势包括性能和开发人员的工作效率。同时,REST+JSON可以在任何地方使用,其人类可读的JSON消息易于调试。
如果我们能在 ASP.NET Core 中构建一次服务,同时获得 gRPC 和 REST,那不是很好吗?现在你可以!介绍针对 .NET 的 gRPC JSON 转码。
gRPC 还是 REST?为什么不两者兼而有之
gRPC JSON 转码是 ASP.NET Core 的扩展,可为 gRPC 服务创建 RESTful HTTP API。配置完成后,JSON 转码允许您使用熟悉的 HTTP 概念调用 gRPC 方法:
- HTTP 动词
- 网址参数绑定
- JSON 请求/响应
这是一项高度请求的功能,以前可作为实验使用。我们很高兴今天发布第一个预览版,我们的目标是提供 .NET 7 的稳定版本。
开始
- 第一步是创建 gRPC 服务(如果还没有)。创建 gRPC 客户端和服务是入门的一个很好的教程。
- 接下来,添加对服务器的包引用。通过添加 在服务器启动代码中注册它。例如。
Microsoft.AspNetCore.Grpc.JsonTranscodingAddJsonTranscoding()services.AddGrpc().AddJsonTranscoding()
- 最后一步是使用 HTTP 绑定和路由对 gRPC .proto 文件进行批注。注释定义了 gRPC 服务如何映射到 JSON 请求和响应。您需要添加到 gRPC 原型文件中,并在项目的文件夹中有一个 annotations.proto 和 http.proto 的副本。
import "google/api/annotations.proto";google/api
syntax = "proto3";
import "google/api/annotations.proto";
package greet;
service Greeter {
rpc SayHello (HelloRequest) returns (HelloReply) {
option (google.api.http) = {
get: "/v1/greeter/{name}"
};
}
}
message HelloRequest {
string name = 1;
}
message HelloReply {
string message = 1;
}
在上面的示例中,SayHello gRPC 方法已使用 HTTP 信息进行了注释。它现在可以作为gRPC和RESTful API调用:
- 请求:
HTTP/1.1 GET /v1/greeter/world
- 响应:
{ "message": "Hello world" }
浏览器应用程序像任何其他RESTful API一样调用它:
fetch('https://localhost:5001/v1/greeter/world')
.then((response) => response.json())
.then((result) => {
console.log(result.message);
// Hello world
});
这是一个简单的示例。
JSON transcoding vs gRPC-Web
JSON 转码和 gRPC-Web 都允许从浏览器调用 gRPC 服务。但是,每个人执行此操作的方式都不同:
- gRPC-Web 允许浏览器应用使用 gRPC-Web 客户端和 Protobuf 从浏览器调用 gRPC 服务。gRPC-Web要求浏览器应用程序生成gRPC客户端,并具有发送小而快速的Protobuf消息的优点。
- JSON 转码允许浏览器应用使用 JSON 将 gRPC 服务作为 RESTful API 调用。浏览器应用不需要生成 gRPC 客户端,也不需要了解有关 gRPC 的任何信息。
关于 JSON 转码实现
使用 gRPC 进行 JSON 转码并不是一个新概念。grpc-gateway是另一种从gRPC服务创建RESTful JSON API的技术。它使用相同的 .proto 注释将 HTTP 概念映射到 gRPC 服务。重要的区别在于每个方法的实现方式。
grpc 网关使用代码生成来创建反向代理服务器。反向代理将RESTful调用转换为gRPC + Protobuf,并通过HTTP / 2将它们发送到gRPC服务。这种方法的好处是gRPC服务不知道RESTful JSON API。任何 gRPC 服务器都可以使用 grpc 网关。
同时,gRPC JSON 转码在 ASP.NET Core 应用内运行。它将 JSON 反序列化为 Protobuf 消息,然后直接调用 gRPC 服务。我们相信 JSON 转码为 .NET 应用开发人员提供了许多优势:
- 更少的移动部件。gRPC 服务和映射的 RESTful JSON API 都运行在一个 ASP.NET 核心应用程序中。
- 性能。JSON 转码将 JSON 反序列化为 Protobuf 消息,并直接调用 gRPC 服务。与对其他服务器进行新的 gRPC 调用相比,在进程内执行此操作具有显著的性能优势。
- 成本。更少的服务器 = 更小的每月托管账单。
JSON 转码不会取代 MVC 或 Minimal API。它只支持JSON,并且对Protobuf如何映射到JSON非常固执己见。
下一步是什么
这是针对 .NET 的 gRPC JSON 转码的第一个版本。.NET 7 的未来预览版将侧重于提高性能和 OpenAPI 支持。
立即使用 .NET 试用
gRPC JSON 转码现已随 .NET 7 预览版 4 一起推出。