NETCORE - Grpc 通信四种方式
NETCORE - Grpc 通信四种方式
项目搭建:https://www.cnblogs.com/1285026182YUAN/p/17679730.html
GRPC支持四种通信方式,分别是:
- UNARY:这是一种最简单的客户端与服务端模式,其中客户端发送一个消息后,阻塞等待服务端回复一个消息。
- CLIENT STREAMING:在这种模式下,客户端将发送多个消息流,而后服务端回复一个消息。
- SERVER STREAMING:客户端仅发送一个消息,而后服务端回复多个消息流。
- BIDIRECTIONAL STREAMING:客户端与服务端将多次发送和接收多条消息,任何一方都无需在发送一条消息之前等待响应。
一. demo:Server Streaming
1. 定义GRPC服务
需要在你的 .proto
文件中定义你的 gRPC 服务和方法。对于服务端流式传输,你需要在方法定义中使用 stream
关键字来指定返回类型为流。
syntax = "proto3"; option csharp_namespace = "RailAssist.Grpc"; package greet; service Sustained { rpc StreamData (StreamDataRequest) returns (stream StreamDataResponse); } message StreamDataRequest { string some_data = 1; } message StreamDataResponse { string streamed_data = 1; }
2. 实现 gRPC 服务
在你的 C# 项目中,实现你在 .proto
文件中定义的 gRPC 服务。对于服务端流式传输,你需要实现一个异步方法,并使用 IAsyncStreamReader<T>
来发送消息。
using Google.Protobuf.WellKnownTypes; using Grpc.Core; using RailAssist.Grpc; namespace RailAssist.Grpc.Services; public class SustainedService : Sustained.SustainedBase { public override async Task StreamData(StreamDataRequest request, IServerStreamWriter<StreamDataResponse> responseStream, ServerCallContext context) { for (int i = 0; i < 20; i++) // 假设发送10条消息 { await responseStream.WriteAsync(new StreamDataResponse { StreamedData = $"Data {i}-{request.SomeData}" }); await Task.Delay(3000); // 等待1秒再发送下一条消息 } } }
3. 在Pragram.cs中注入
app.MapGrpcService<SustainedService>();
4. 测试
5. 客户端调用:
[HttpGet] [Route("GetGrpcTestStream")] public async Task<IActionResult> GetGrpcTestStream(int fileId) { string url = configuration.GetSection("GrpcConfig:Assist").Value; var channel = GrpcChannel.ForAddress(url, channelOptionsDefault); var client = new Sustained.SustainedClient(channel); using var call = client.StreamData(new StreamDataRequest { SomeData = fileId.ToString() }); var arr = new List<string>(); while (await call.ResponseStream.MoveNext()) { var response = call.ResponseStream.Current; Console.WriteLine(response.StreamedData); // 打印接收到的每条消息 arr.Add(response.StreamedData); } await Console.Out.WriteLineAsync(string.Join(",", arr)); return Ok(); }
end