概述
gRPC是一個高性能晃跺、通用的開源RPC框架衙傀,其由Google主要面向移動應(yīng)用開發(fā)并基于HTTP/2協(xié)議標(biāo)準(zhǔn)而設(shè)計励翼,基于ProtoBuf(Protocol Buffers)序列化協(xié)議開發(fā)徒坡,且支持眾多開發(fā)語言羞酗。gRPC提供了一種簡單的方法來精確地定義服務(wù)和為iOS、Android和后臺支持服務(wù)自動生成可靠性很強的客戶端功能庫无蜂∷趴罚客戶端充分利用高級流和鏈接功能,從而有助于節(jié)省帶寬斥季、降低的TCP鏈接次數(shù)训桶、節(jié)省CPU使用、和電池壽命酣倾。
gRPC支持多種語言舵揭,并能夠基于語言自動生成客戶端和服務(wù)端功能庫。目前躁锡,在GitHub上已提供了C版本grpc午绳、Java版本grpc-java 和 Go版本grpc-go,其它語言的版本正在積極開發(fā)中映之,其中 grpc支持C箱叁、C++、Node.js惕医、Python耕漱、Ruby、Objective-C抬伺、PHP和C#等語言螟够,grpc-java已經(jīng)支持Android開發(fā)。
gRPC已經(jīng)應(yīng)用在Google的云服務(wù)和對外提供的API中峡钓,其主要應(yīng)用場景如下:
低延遲妓笙、高擴展性、分布式的系統(tǒng)
同云服務(wù)器進(jìn)行通信的移動應(yīng)用客戶端
設(shè)計語言獨立能岩、高效寞宫、精確的新協(xié)議
便于各方面擴展的分層設(shè)計,如認(rèn)證拉鹃、負(fù)載均衡辈赋、日志記錄、監(jiān)控等
參考文檔:
http://www.infoq.com/cn/news/2015/03/grpc-google-http2-protobuf
C#中的使用
如何在C#中使用膏燕,需要在工程中Grpc.Core.dll钥屈,需將其主要是利用grpc_csharp_plugin.exe將proto轉(zhuǎn)化成C#文件,在工程中引用其生成的兩個C#訪問類文件即可坝辫。
定義proto的協(xié)議
設(shè)計proto協(xié)議文件篷就,該文件的格式為.proto,命名為AccountService.proto近忙。
syntax = "proto3";//gRPC必須使用protocol buffer3.0版本竭业,所以syntax設(shè)置為proto3智润。
package gRPCDemo;//包名,即為C#的命名空間的名字 namespace
service AccountService{//所生成的訪問類名
rpc SayHello (HelloRequest) returns (HelloReply) {}//定義其方式未辆,請求和回調(diào)的結(jié)構(gòu)體
}
message HelloRequest {
string name = 1;
}
message HelloReply {
string message = 1;
}
生成proto訪問類
?使用Google.Protobuf提供的protoc.exe工具將 proto文件生成訪問類protoc做鹰,使用gRPC定義的protoc的C#插件grpc_csharp_plugin.exe,所以需要有proto文件鼎姐、protoc.exe钾麸、grpc_csharp_plugin.exe才能生成所需要的C#訪問類。
將以下幾個文件放在同一文件夾中:
AccountService.proto
protoc.exe
grpc_csharp_plugin.exe
創(chuàng)建一個bat文件炕桨,編寫一下命名行:
protoc.exe -I=.--csharp_out=. --grpc_out=. --plugin=protoc-gen-grpc=grpc_csharp_plugin.exe AccountService .proto
執(zhí)行bat文件饭尝,將會 生成以下文件:
//以proto的命名生成訪問類的文件名
AccountService?.cs
AccountService?Grpc.cs
在項目中的使用
將輸入輸出放在指定的文件夾,則將所需的exe放在編輯器Editor文件下献宫,Edito文件夾不被打包
protoc.exe
grpc_csharp_plugin.exe
將proto文件放入Editor文件夾下钥平,新建一個bat文件
set PJ_PATH=E:/PJ/IOGame1/Assets//路徑引用
%PJ_PATH%/10_Plugins\Editor\grpc\protoc.exe// protoc路徑
%PJ_PATH%/10_Plugins\Editor\grpc\ProtoFile\client.proto//proto文件
%PJ_PATH%/10_Plugins\Editor\grpc\ProtoFile\common.proto
--proto_path=%PJ_PATH%/10_Plugins\Editor\grpc\ProtoFile//proto文件存放的路徑
--csharp_out=%PJ_PATH%\0_Scripts\Net\GrpcGenerated//Cs文件的輸出路徑
--grpc_out=%PJ_PATH%/0_Scripts\Net\GrpcGenerated//GrpcC#文件的輸出路徑
--plugin=protoc-gen-grpc=%PJ_PATH%\10_Plugins\Editor\grpc\grpc_csharp_plugin.exe// Grpc的工具路徑
pause
拓展:
如果我們新建一個proto協(xié)議,我們就要在bat文件再新建一個命令行姊途,若多個涉瘾,則要添加多個。作為程序員捷兰,我們是要懶得去一行行添加的立叛。
思路:遍歷proto文件夾下的所有的proto文件,寫入到bat文件:
private static void GenerateBatFile()
? ? {
? ? ? ? var filePath = Application.dataPath + "/10_Plugins/Editor/grpc/generate_protos.bat";//bat路徑
? ? ? ? var fs = new FileStream(filePath, FileMode.Create, FileAccess.Write);//文件流贡茅,不存在bat文件則創(chuàng)建bat文件
? ? ? ? fs.SetLength(0);//清空
? ? ? ? fs.Close();//關(guān)閉流對象
? ? ? ? var sw = new StreamWriter(filePath);//創(chuàng)建寫入流
? ? ? ? sw.WriteLine("set PJ_PATH=" + Application.dataPath);//寫入結(jié)束時換行
? ? ? ? var path = Application.dataPath + "/10_Plugins/Editor/grpc/ProtoFile";//存放proto文件的文件夾路徑
? ? ? ? var root = new DirectoryInfo(path);//獲取文件字典集
? ? ? ? string filePaths = " ";
? ? ? ? foreach (var f in root.GetFiles())
? ? ? ? {
? ? ? ? ? ? if (!f.Name.Contains(".meta"))
? ? ? ? ? ? {
? ? ? ? ? ? ? ? filePaths += @"%PJ_PATH%/10_Plugins\Editor\grpc\ProtoFile\" + f.Name + " ";//遍歷proto文件秘蛇,其路徑以空格鍵隔開
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? sw.WriteLine(@"%PJ_PATH%/10_Plugins\Editor\grpc\protoc.exe{0}--proto_path=%PJ_PATH%/10_Plugins\Editor\grpc\ProtoFile --csharp_out=%PJ_PATH%\0_Scripts\Net\GrpcGenerated --grpc_out %PJ_PATH%/0_Scripts\Net\GrpcGenerated --plugin=protoc-gen-grpc=%PJ_PATH%\10_Plugins\Editor\grpc\grpc_csharp_plugin.exe", filePaths);
? ? ? ? sw.WriteLine("pause");
? ? ? ? sw.Close();
? ? }
在Unity拓展工具時使用bat文件,調(diào)用外部進(jìn)程開啟bat命令:
[MenuItem("Grpc/GenerateGrpcFile")]
? ? private static void GenerateGrpcFile()
? ? {
? ? ? ? var batName = Application.dataPath + "/10_Plugins/Editor/grpc/generate_protos.bat";//bat路徑
? ? ? ? var pStartInfo = new System.Diagnostics.ProcessStartInfo(batName)//設(shè)置進(jìn)程
? ? ? ? {
? ? ? ? ? ? CreateNoWindow = false,
? ? ? ? ? ? UseShellExecute = true,
? ? ? ? ? ? RedirectStandardError = false,
? ? ? ? ? ? RedirectStandardInput = false,
? ? ? ? };
? ? ? ? System.Diagnostics.Process.Start(pStartInfo);//開始進(jìn)程
? ? }
至此顶考,一個在編輯器上直接生成bat文件和生成所需的訪問類文件赁还。