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
|
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;
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有具体调用示例