最近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應用,仍是更推薦使用標準實現。