NETCORE - Grpc 通信四种方式

NETCORE - Grpc 通信四种方式

 项目搭建:https://www.cnblogs.com/1285026182YUAN/p/17679730.html

 

GRPC支持四种通信方式,分别是:

  1. UNARY:这是一种最简单的客户端与服务端模式,其中客户端发送一个消息后,阻塞等待服务端回复一个消息。
  2. CLIENT STREAMING:在这种模式下,客户端将发送多个消息流,而后服务端回复一个消息。
  3. SERVER STREAMING:客户端仅发送一个消息,而后服务端回复多个消息流。
  4. 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

 

posted @ 2024-06-12 11:27  无心々菜  阅读(7)  评论(0编辑  收藏  举报