最近GRPC很火,感受整RPC不用GRPC都快跟不上时髦了。git
gRPC是一种与语言无关的高性能远程过程调用 (RPC) 框架。恰好须要使用一个的RPC应用系统,天然而然就盯上了它,可是它真可以解决全部问题吗?不见得,先看看他的优势:github
Protobuf
二进制序列化减小对网络的使用。HTTP/2
gRPC-Web
能够提供浏览器支持,但它具备局限性并引入了服务器代理。我须要有一个可以实现远程调用的好办法,系统支持Windows就好,最好性能高一些(数据量大),程序小一点,可是我也不想直接处理二进制数据流(最好能有封装的框架)。c#
考虑进程通讯经常使用的:浏览器
首先排除信号/信号量,处理的信息量过小了;而后共享内存也排除,只能单机不符合个人要求;剩下的三个彷佛均可以知足要求,能够在这个基础上创建RPC,而gRPC就是创建在socket(HTTP/2)上的,就像上面讲的,要本身集成一个HTTP/2服务器(好比Kestrel)才行,不够轻量化;剩下的两个Windows都有內建支持,能够考虑一下。服务器
本着拿来主义的思想,我在github上找到一个grpc-dotnet-namedpipes,支持在命名管道上实现gRPC,至关于在stream上封装了一层,不用直接处理二进制数据流了。网络
用做者本身的话来讲,这么作相较于普通的gRPC有几个优势:框架
syntax = "proto3"; service Greeter { rpc SayHello (HelloRequest) returns (HelloReply); } message HelloRequest { string name = 1; } message HelloReply { string message = 1; }
Google.Protobuf
,Grpc.Core
,Grpc.Tools
新建一个Console程序,添加上面的项目引用,输入如下代码:socket
var server = new NamedPipeServer("MY_PIPE_NAME"); Greeter.BindService(server.ServiceBinder, new GreeterService()); server.Start();
添加GrpcDotNetNamedPipes
的nuget依赖:微服务
Install-Package GrpcDotNetNamedPipes
再新建一个Console程序,添加上面的项目引用,也添加那个nuget依赖和一些别的依赖,输入如下代码:工具
var channel = new NamedPipeChannel(".", "MY_PIPE_NAME"); var client = new Greeter.GreeterClient(channel); var response = await client.SayHelloAsync( new HelloRequest { Name = "World" }); Console.WriteLine(response.Message);
而后运行就能看见熟悉的Hello World了,用起来和gRPC的标准实现没太大区别。
完整代码见gRPC_Demo。
这种方式也有它的局限性,首先是Windows的命名管道与Linux上面的实现是不一样的,因此并不能实现直接跨平台通信;而后就是这个对于其余语言的开发的gRPC也不是彻底兼容的,须要其余语言开发的程序也作命名管道的适配才行,换言之,它不是通用标准。因此,对于通常的gRPC应用,仍是更推荐使用标准实现。