标签:rar -name href bind 浏览器 系统 api 建立 平台
最近GRPC很火,感觉整RPC不用GRPC都快跟不上时髦了。
gRPC是一种与语言无关的高性能远程过程调用 (RPC) 框架。刚好需要使用一个的RPC应用系统,自然而然就盯上了它,但是它真能够解决所有问题吗?不见得,先看看他的优点:
Protobuf
二进制序列化减少对网络的使用。HTTP/2
gRPC-Web
可以提供浏览器支持,但它具有局限性并引入了服务器代理。我需要有一个能够实现远程调用的好办法,系统支持Windows就好,最好性能高一些(数据量大),程序小一点,但是我也不想直接处理二进制数据流(最好能有封装的框架)。
考虑进程通信常用的:
首先排除信号/信号量,处理的信息量太小了;然后共享内存也排除,只能单机不符合我的要求;剩下的三个似乎都可以满足要求,可以在这个基础上建立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程序,添加上面的项目引用,输入以下代码:
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应用,还是更推荐使用标准实现。
标签:rar -name href bind 浏览器 系统 api 建立 平台
原文地址:https://www.cnblogs.com/podolski/p/13282975.html