原文地址:james.newtonking.com/archive/202…
原文作者:grpc.io/blog/grpc-o…
发布时间:2020年3月20日
gRPC是在应用程序之间进行通信的现代方式。gRPC使用HTTP/2、流媒体、Protobuf和消息合同来创建高性能的实时服务。在.NET Core 3.0中增加了对ASP.NET Core上gRPC的支持。
gRPC的问题是,不是每个平台都能使用它。浏览器并不完全支持HTTP/2,使得REST和JSON仍然是将数据送入浏览器应用的主要方式。即使有gRPC带来的好处,REST和JSON仍然在现代应用中占有重要地位。构建gRPC和REST服务会给应用开发增加不必要的开销。
如果我们能在ASP.NET Core中构建一次服务,就能获得gRPC和REST,那不是很好吗?现在你可以了 介绍一下ASP.NET Core的gRPC HTTP API。
gRPC还是REST?为什么不两者兼而有之呢?
gRPC HTTP API是ASP.NET Core的一个实验性扩展,它可以为gRPC服务创建RESTful HTTP API。一旦配置好,gRPC HTTP API允许你用熟悉的HTTP概念来调用gRPC方法。
HTTP动词 URL参数绑定 JSON请求/答复 为您的gRPC服务提供RESTful API。不重复!
演示
访问grpchttpapi.azurewebsites.net/ ,查看gRPC HTTP API的运行情况。
演示的源代码在这里。
开始使用
- 第一步是创建一个gRPC服务(如果你还没有)。创建gRPC客户端和服务是一个很好的教程,可以在.NET Core上开始使用gRPC。
- 接下来,将Microsoft.AspNetCore.Grpc.HttpApi的包引用添加到服务器中。在Startup.cs中用services.AddGrpcHttpApi()注册它。
- 最后一步是用HTTP绑定和路由注释您的gRPC.proto文件。注释定义了gRPC服务如何映射到JSON请求和响应。你需要添加import "google/api/annotations.proto";到gRPC proto文件中,并在你的项目中拥有annotations.proto和http.proto的副本。
syntax = "proto3";
import "google/api/annotations.proto";
package greet;
service Greeter {
rpc SayHello (HelloRequest) returns (HelloReply) {
option (google.api.http) = {
get: "/v1/greeter/{name}"
};
}
rpc SayHelloFrom (HelloRequestFrom) returns (HelloReply) {
option (google.api.http) = {
post: "/v1/greeter"
body: "*"
};
}
}
message HelloRequest {
string name = 1;
}
message HelloRequestFrom {
string name = 1;
string from = 2;
}
message HelloReply {
string message = 1;
}
在上面的示例中,SayHello gRPC方法现在可以作为gRPC和RESTful API调用。
- 请求: HTTP/1.1 GET /v1/greeter/world
- 答复: { "message": "你好,世界" }
而浏览器应用则像其他RESTful API一样调用它。
fetch('https://localhost:5001/v1/greeter/world')
.then((response) => response.json())
.then((result) => {
console.log(result.message);
// Hello world
});
这是一个简单的例子。更多自定义选项请参见HttpRule。
常见问题
问:用于 gRPC 的 RESTful API 是一个全新的概念吗?
Grpc-gateway使用相同的.proto注释为gRPC提供RESTful JSON服务。如今,grpc-gateway被大量使用。例如,GCP使用它为GCP服务提供gRPC和REST端点。这两种技术的一个关键区别是grpc-gateway需要一个反向代理,而gRPC HTTP API则是由ASP.NET与gRPC服务一起直接托管。
问:这是否取代了ASP.NET Core MVC?
答:不,gRPC HTTP API只支持JSON,而且它的意见很大。只支持HttpRule提供的自定义选项。使用gRPC HTTP API的好场景是使用gRPC和JSON构建新服务。
Q:这和gRPC-Web有什么不同?
答:gRPC-Web可以让你通过gRPC-Web客户端和Protobuf从浏览器中调用gRPC服务,gRPC HTTP API可以让你像使用JSON的RESTful API一样调用你的服务。它不会取代gRPC-Web。
问:什么时候会发布?
答:现在NuGet上就有一个预发布包!gRPC HTTP API是一个实验,是否在上面投入更多时间取决于用户的反馈。
今天就来试试吧
gRPC HTTP API是我一直在玩的一个框架想法。它是非常实验性的,但我认为它有机会让.NET开发者比现在更快地提供gRPC和REST服务。
- GrpcHttpApi @ GitHub上的aspnet/AspLabs仓库 - 源代码和说明
- Microsoft.AspNetCore.Grpc.HttpApi包在NuGet.org上 - 预发布包。
你现在可以在NuGet上使用预发布包。是否投入更多的时间使其成为一个支持的产品,取决于用户的反馈。请在GitHub上给出反馈,或者在Twitter上联系我@JamesNK。我很期待看到这个框架的使用情况。
通过www.DeepL.com/Translator(免费版)翻译