var channel = GrpcChannel.ForAddress("https://localhost:7109"); var client = new Greeter.GreeterClient(channel); var reply = await client.SayHelloAsync(new HelloRequest { Name = "李浩" });
var data = new ComputeData() { Name = "李浩", Age = 31, Hobbies = { "跑步", "看书", "编程" }, Scores = { { "数学", 140 }, { "语文", 130 } }, Address = new Address { Street = "和平大道", City = "武汉市", }, Gender = ComputeData.Types.Gender.Male, };
var computeReply = await client.ComputeAsync(data);
staticvoidMain(string[] args) { int port = int.Parse(AppConfig.Get("port"));
Server server = new Server { Services = { Greeter.BindService(new GreetImpl()) }, Ports = { new ServerPort($"{AppConfig.Get("ip")}", port, ServerCredentials.Insecure) } }; server.Start();
Console.WriteLine($"Greeter Server Listening on port {port}"); Console.WriteLine("Press Enter to exit"); Console.ReadLine();
internalclassProgram { privatestaticvoidMain(string[] args) { var method = new Method<byte[], byte[]>( MethodType.Unary, "HelloService", "SayHello", Marshallers.Create( data => data, data => data ), Marshallers.Create( data => data, data => data ) );
var server = new Server { Services = { ServerServiceDefinition.CreateBuilder() .AddMethod(method, HandleSayHello) .Build() }, Ports = { new ServerPort("localhost", 50051, ServerCredentials.Insecure) } }; server.Start();
Console.WriteLine($"Greeter Server Listening on port {50051}"); Console.WriteLine("Press Enter to exit"); Console.ReadLine();
server.ShutdownAsync().Wait(); }
privatestatic Task<byte[]> HandleSayHello(byte[] requestData, ServerCallContext context) { var request = ProtobufNetSerializer.Deserialize<HelloRequest>(requestData); var response = new HelloService().SayHello(request).Result; return Task.FromResult(ProtobufNetSerializer.Serialize(response)); } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14
publicstaticclassProtobufNetSerializer{ publicstaticbyte[] Serialize<T>(T obj) { using (var stream = new MemoryStream()) { Serializer.Serialize(stream, obj); return stream.ToArray(); } }
publicstatic T Deserialize<T>(byte[] data) { using (var stream = new MemoryStream(data)) { return Serializer.Deserialize<T>(stream); } } }
internalstaticclassProgram { privatestaticvoidMain() { var channel = new Channel("localhost:50051", ChannelCredentials.Insecure); var invoker = new DefaultCallInvoker(channel);
var method = new Method<byte[], byte[]>( MethodType.Unary, "HelloService", "SayHello", Marshallers.Create( data => data, data => data ), Marshallers.Create( data => data, data => data ) );
var requestData = new HelloRequest { Name = "LiRuohan" }; var requestBytes = ProtobufNetSerializer.Serialize(requestData); var responseBytes = invoker.AsyncUnaryCall( method, null, new CallOptions(), requestBytes).ResponseAsync.Result;
var response = ProtobufNetSerializer.Deserialize<HelloResponse>(responseBytes); Console.WriteLine(response.Message);
Console.ReadKey(); } }
使用Rust的Tonic库实现gRPC
项目结构
proto文件如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
syntax = "proto3"; package helloworld;
service Greeter { rpc SayHello (HelloRequest) returns (HelloReply); }