.NET下gRPC JSON转码的使用教程

298 阅读4分钟

gRPC是一种在应用程序之间进行通信的现代方式。gRPC使用HTTP/2、流媒体、二进制序列化和消息契约来创建高性能、实时的服务。.NET对构建gRPC应用程序有很好的支持。

然而,像大多数技术选择一样,在选择gRPC而不是像REST+JSON这样的替代方案时,也有取舍。同时,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动词
  • URL参数绑定
  • JSON请求/响应

这是一个被高度要求的功能,以前是作为一个实验来使用。我们很高兴今天能发布第一个预览版,我们的目标是在.NET 7下发布一个稳定版。

开始使用

  1. 第一步是创建一个gRPC服务(如果你还没有一个)。创建一个gRPC客户端和服务是一个很好的入门教程。
  2. 接下来,在服务器上添加一个包的引用Microsoft.AspNetCore.Grpc.JsonTranscoding 。在服务器启动代码中通过添加AddJsonTranscoding() 来注册它。例如,services.AddGrpc().AddJsonTranscoding().
  3. 最后一步是用HTTP绑定和路由来注释你的gRPC*.proto*文件。这些注释定义了gRPC服务如何映射到JSON请求和响应。你将需要在gRPC proto文件中添加import "google/api/annotations.proto"; ,并有一份 annotations.protohttp.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
    });

这是一个简单的例子。参见HttpRule以获得更多的定制选项。

JSON转码 vs gRPC-Web

JSON转码和gRPC-Web都允许从浏览器调用gRPC服务。然而,两者的方式是不同的:

  • gRPC-Web让浏览器应用通过gRPC-Web客户端和Protobuf从浏览器调用gRPC服务。gRPC-Web要求浏览器应用生成一个gRPC客户端,并具有发送小型、快速Protobuf消息的优势。
  • JSON转码允许浏览器应用程序将gRPC服务作为RESTful API调用JSON。浏览器应用程序不需要生成一个gRPC客户端,也不需要知道任何关于gRPC的事情。

关于JSON转码的实现

用gRPC进行JSON转码并不是一个新的概念。grpc-gateway是另一种从gRPC服务创建RESTful JSON API的技术。它使用相同的*.proto*注解来映射HTTP概念到gRPC服务。重要的区别在于两者的实现方式。

grpc-gateway使用代码生成来创建一个反向代理服务器。反向代理将RESTful调用翻译成gRPC+Protobuf,并通过HTTP/2将其发送到gRPC服务。这种方法的好处是,gRPC服务不知道RESTful JSON APIs。任何gRPC服务器都可以使用grpc-gateway。

同时,gRPC JSON转码在ASP.NET Core应用程序内运行。它将JSON反序列化为Protobuf消息,然后直接调用gRPC服务。我们相信JSON转码为.NET应用程序开发人员提供了许多优势:

  • 更少的移动部件。gRPC服务和映射的RESTful JSON API都在一个ASP.NET Core应用程序中运行。
  • 性能。JSON转码将JSON反序列化为Protobuf消息并直接调用gRPC服务。相对于向不同的服务器进行新的gRPC调用而言,在进程中完成这一工作有很大的性能优势。
  • 成本。更少的服务器=更少的每月托管费用。

JSON转码并不能取代MVC或Minimal APIs。它只支持JSON,而且它对Protobuf如何映射到JSON非常有意见。

未来计划

这是.NET的gRPC JSON转码的第一个版本。未来的.NET 7预览版将专注于改善性能和OpenAPI支持。

今天就用.NET试试吧

gRPC JSON转码现在可以在.NET 7预览版中使用。

关于JSON转码的更多信息,请查看文档,或尝试使用JSON转码的示例应用程序

我们期待着看到你用.NET、gRPC和现在的gRPC JSON转码创造出的东西。

宣布为.NET提供gRPC JSON转码的帖子首先出现在.NET博客上。