Net Core gRPC - 02. 客户端流

Net Core gRPC 系列

1. 什么是客户端流

gRPC支持四种通信模式,一元、服务器流式处理、客户端流式处理、双向流式处理。上一篇的示例就是一元调用,也是gRPC调用中最简单的一种,即从客户端发送请求消息开始。 服务结束后,返回响应消息。而客户端流是客户端可以发送多次请求,服务器在接收每一次请求信息,并在客户端通知最后一次请求后,将接收到的所有信息整体处理,一次性返回结果给客户端。即客户端发送多次请求,而服务器只响应一次。

2. Proto文件的定义

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
syntax = "proto3";

option csharp_namespace = "WebApi.Protos";

package greet;
import "google/protobuf/duration.proto";
import "google/protobuf/timestamp.proto";
import "google/protobuf/wrappers.proto";
import "google/protobuf/any.proto";
// The greeting service definition.
service Greeter {
// 客户端流式调用
rpc ClientStreamMethodAsync(stream ClientStreamMethodParam) returns (ClientStreamMethodResponse);
}

message ClientStreamMethodParam {
int32 par = 1;
}
message ClientStreamMethodResponse{
int32 result = 1;
}

3. 服务端接口实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/// <summary>
/// 客户端流实现,实现效果:客户端发送多个int类型的数字,服务端接收到后做累加,然后将最终结果返回客户端
/// </summary>
/// <param name="requestStream"></param>
/// <param name="context"></param>
/// <returns></returns>
public override async Task<ClientStreamMethodResponse> ClientStreamMethodAsync(IAsyncStreamReader<ClientStreamMethodParam> requestStream, ServerCallContext context)
{
int result = 0;
while (await requestStream.MoveNext())
{
result += requestStream.Current.Par;
Console.WriteLine($"Current Result { result }");
}
return await Task.FromResult(new ClientStreamMethodResponse() { Result = result });
}

4. 客户端调用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var channel = GrpcChannel.ForAddress("http://localhost:5004");
var client = new Greeter.GreeterClient(channel);
var clientStreamMethodAsync = client.ClientStreamMethodAsync();
var requestStream = clientStreamMethodAsync.RequestStream;
for (int k = 1; k < 11; k++)
{
await requestStream.WriteAsync(new ClientStreamMethodParam { Par = k });
Console.WriteLine($"send par {k}");
await Task.Delay(500);
}
//通知服务端 客户端流发送完毕
await requestStream.CompleteAsync();
var resultClientStream = await clientStreamMethodAsync;
Console.WriteLine($"server response result: {resultClientStream.Result}");

完整代码可以在 GitHub

WebApplication1Test 整合了gRPC,ConsoleApp1Test有具体调用示例