Net Core gRPC - 03. 服务端流

Net Core gRPC 系列

1. 什么是服务端流

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 ServerStreamMethodAsync(ClientMethodParam) returns (stream ServerStreamMethodResponse);
}

message ClientMethodParam {
repeated int32 lst = 1;
}
message ServerStreamMethodResponse {
string Result = 1;
}

3. 服务端接口实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/// <summary>
/// 服务器流 客户端发送int类型集合,服务器循环每个item并依依处理并响应
/// </summary>
/// <param name="request"></param>
/// <param name="responseStream"></param>
/// <param name="context"></param>
/// <returns></returns>
public override async Task ServerStreamMethodAsync(ClientMethodParam request, IServerStreamWriter<ServerStreamMethodResponse> responseStream, ServerCallContext context)
{
foreach (var item in request.Lst)
{
await responseStream.WriteAsync(new ServerStreamMethodResponse { Result = $"[{DateTime.Now:yyyy-M-d hh:mm:ss}] { item+100 } " });
await Task.Delay(1000);
}
Console.WriteLine("server response over");
}

4. 客户端调用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var channel = GrpcChannel.ForAddress("http://localhost:5004");
var client = new Greeter.GreeterClient(channel);
var param = new ClientMethodParam();
param.Lst.Add(new RepeatedField<int>() { 1, 2, 3, 4, 5 });
var clientServerStreamMethodAsync = client.ServerStreamMethodAsync(param);
var responseStream = clientServerStreamMethodAsync.ResponseStream;
// Define the cancellation token.
CancellationTokenSource source = new CancellationTokenSource();
CancellationToken token = source.Token;
while (await responseStream.MoveNext(token))
{
Console.WriteLine($"server response result { responseStream.Current.Result }");
}

完整代码可以在 GitHub

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