gRPC
gRPC[13](gRPC远程过程调用
)是Google开发的开源远程过程调用系统。它有点像REST,它提供了一种将请求从客户端发送到服务器的方式。但这在许多方面都不同,这是相同点和不同点:
- 像REST一样,gRPC与语言无关。有适用于所有流行语言的工具,包括C#。
- gRPC是契约的基础,并使用.proto文件来定义契约。这有点类似于Swaggerswagger.json和ReFit的共享界面。可以从那些文件中生成任何编程语言的客户端。
- gRPC使用协议缓冲区(Protobuf)[14]二进制序列化。这与REST(通常序列化为JSON或XML)不同。二进制序列化较小,因此更快。
- gRPC用于使用
HTTP / 2
协议创建持久连接。该协议更简单,更紧凑。REST使用HTTP 1.x协议(通常为HTTP 1.1)。 - HTTP 1.1要求每个请求都进行TCP握手,而HTTP / 2则保持连接打开。
- HTTP / 2连接使用多路复用流。这意味着单个TCP连接可以支持许多流。这些流可以并行执行,而不必像HTTP 1.1中那样互相等待。
- gRPC允许双向流。
有两种使用gRPC的方法。对于.NET Core 3.0,有一个完全托管的库,称为.NET的gRPC[15]。对于其中的任何内容,您都可以使用gRPC C#[16],它是使用本机代码构建的。这并不意味着适用于.NET的gRPC可以替代gRPC C#。让我们来看一个用于.NET的更新gRPC的示例。
.NET的gRPC的服务器端
- 这不是教程,而是更多有关预期内容的一般性想法。这是示例控制器在gRPC中的外观:
public class GreeterService : Greeter.GreeterBase
{
public override Task<HelloReply> SayHello(HelloRequest request,
ServerCallContext context)
{
_logger.LogInformation("Saying hello to {Name}", request.Name);
return Task.FromResult(new HelloReply
{
Message = "Hello " + request.Name
});
}
}
- 您需要添加以下的Configure在Startup.cs:
app.UseEndpoints(endpoints =>
{
endpoints.MapGrpcService<GreeterService>();
});
- API在.proto文件中描述,该文件是项目的一部分:
syntax = "proto3";
service Greeter {
rpc SayHello (HelloRequest) returns (HelloReply);
}
message HelloRequest {
string name = 1;
}
message HelloReply {
string message = 1;
}
- 此.proto文件添加到.csproj:
<ItemGroup>
<Protobuf Include="Protos\greet.proto" />
</ItemGroup>
.NET的gRPC客户端
- 客户端是从.proto文件生成的。代码本身非常简单:
var channel = GrpcChannel.ForAddress("https://localhost:5001");
var client = new Greeter.GreeterClient(channel);
var response = await client.SayHello(
new HelloRequest { Name = "World" });
Console.WriteLine(response.Message);