宣布为 .NET 推出 gRPC JSON 转码

内容纲要

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 的稳定版本。

开始

  1. 第一步是创建 gRPC 服务(如果还没有)。创建 gRPC 客户端和服务是入门的一个很好的教程。
  2. 接下来,添加对服务器的包引用。通过添加 在服务器启动代码中注册它。例如。Microsoft.AspNetCore.Grpc.JsonTranscodingAddJsonTranscoding()services.AddGrpc().AddJsonTranscoding()
  3. 最后一步是使用 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 一起推出。

给TA打赏
共{{data.count}}人
人已打赏
.NET

第6章 三层架构

2022-8-22 16:14:05

.NET.Net Core

在ASP.NET和ASP.NET Core之间共享代码教程

2022-8-22 16:38:07

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
今日签到
有新私信 私信列表
搜索