.Net Core框架下 Grpc四种处理方法
1、在.Net Core框架下 实现Grpc客户端和服务端的四种处理方法,包括:
一元方法
服务器流式处理方法
客户端流式处理方法
双向流式处理方法
2、沿用上一篇的服务端,修改GreeterService.cs文件
public class GreeterService : TestGrpc.TestGrpcBase { private readonly ILogger<GreeterService> _logger; public GreeterService(ILogger<GreeterService> logger) { _logger = logger; } public override Task<TestReply> TestSay(TestRequest request, ServerCallContext context) { Console.WriteLine($"接收到{request.Name}的消息"); return Task.FromResult(new TestReply { Message = "Hello " + request.Name }); } public override async Task StreamingFromServer(ExampleRequest request, IServerStreamWriter<ExampleResponse> responseStream, ServerCallContext context) { Console.WriteLine("服务器流开始响应。。。。"); for (int i = 0; i < 5; i++) { await responseStream.WriteAsync(new ExampleResponse() { Name="qq", Sex="woman" }); await Task.Delay(TimeSpan.FromSeconds(1)); } Console.WriteLine("服务器流结束响应。。。。"); } public override Task<ExampleResponse> StreamingFromClient(IAsyncStreamReader<ExampleRequest> requestStream, ServerCallContext context) { Console.WriteLine("服务器开始响应客户端流。。。。"); return Task.FromResult(new ExampleResponse { Name = "客户端流" }); } public override async Task StreamingBothWays(IAsyncStreamReader<ExampleRequest> requestStream, IServerStreamWriter<ExampleResponse> responseStream, ServerCallContext context) { Console.WriteLine("双向流开始响应。。。。"); await foreach (var message in requestStream.ReadAllAsync()) { await responseStream.WriteAsync(new ExampleResponse() { Name="双向流" }); } Console.WriteLine("双向流结束响应。。。。"); } }
3、修改greet.proto文件
syntax = "proto3"; option csharp_namespace = "MyGrpcServer"; package MyGrpc; // The greeting service definition. service TestGrpc { // Sends a greeting rpc TestSay (TestRequest) returns (TestReply); rpc StreamingFromServer(ExampleRequest) returns (stream ExampleResponse); rpc StreamingFromClient(stream ExampleRequest) returns (ExampleResponse); rpc StreamingBothWays(stream ExampleRequest) returns (stream ExampleResponse); } // The request message containing the user's name. message TestRequest { string name = 1; } // The response message containing the greetings. message TestReply { string message = 1; } message ExampleRequest{ int32 pageIndex=1; int32 pageSize=2; bool isDescending=3; } message ExampleResponse{ string name=1; string sex=2; }
4、沿用上一篇的客户端,修改Program.cs
class Program { static async Task Main(string[] args) { using var channel = GrpcChannel.ForAddress("http://localhost:5000"); var client = new TestGrpc.TestGrpcClient(channel); #region 一元方法 var ret = await client.TestSayAsync(new TestRequest { Name = "MyTestClient" }); Console.WriteLine("MyTestGrpc: " + ret.Message); #endregion #region 服务器流 using var call = client.StreamingFromServer(new ExampleRequest { PageIndex = 1,PageSize=3,IsDescending=true }); while (await call.ResponseStream.MoveNext()) { Console.WriteLine("服务器流: " + call.ResponseStream.Current.Name); // "Greeting: Hello World" is written multiple times } #endregion #region 客户端流 using var clientStream = client.StreamingFromClient(); for (var i = 0; i < 5; i++) { Console.WriteLine("客户端流"+i); await clientStream.RequestStream.WriteAsync(new ExampleRequest { PageIndex = 1, PageSize = 3, IsDescending = true }); } await clientStream.RequestStream.CompleteAsync(); var response = await clientStream; Console.WriteLine($"客户端流: {response.Name}"); #endregion #region 双向流 using var bothStream = client.StreamingBothWays(); for (var i = 0; i < 100; i++) { Console.WriteLine("双向流" + i); await bothStream.RequestStream.WriteAsync(new ExampleRequest { PageIndex = 1, PageSize = 3, IsDescending = true }); } await bothStream.RequestStream.CompleteAsync(); while (await bothStream.ResponseStream.MoveNext()) { Console.WriteLine("双向流: " + bothStream.ResponseStream.Current.Name); // "Greeting: Hello World" is written multiple times } #endregion Console.WriteLine("Press any key to exit..."); Console.ReadKey(); } }
5、修改greet.proto文件
syntax = "proto3"; option csharp_namespace = "MyGrpcClient"; package MyGrpc; // The greeting service definition. service TestGrpc { // Sends a greeting rpc TestSay (TestRequest) returns (TestReply); rpc StreamingFromServer(ExampleRequest) returns (stream ExampleResponse); rpc StreamingFromClient(stream ExampleRequest) returns (ExampleResponse); rpc StreamingBothWays(stream ExampleRequest) returns (stream ExampleResponse); } // The request message containing the user's name. message TestRequest { string name = 1; } // The response message containing the greetings. message TestReply { string message = 1; } message ExampleRequest{ int32 pageIndex=1; int32 pageSize=2; bool isDescending=3; } message ExampleResponse{ string name=1; string sex=2; }