概述
gRPC是一个高性能、通用的开源RPC框架,其由Google主要面向移动应用开发并基于HTTP/2协议标准而设计,基于ProtoBuf(Protocol Buffers)序列化协议开发,且支持众多开发语言。gRPC提供了一种简单的方法来精确地定义服务和为iOS、Android和后台支持服务自动生成可靠性很强的客户端功能库。客户端充分利用高级流和链接功能,从而有助于节省带宽、降低的TCP链接次数、节省CPU使用、和电池寿命。
gRPC支持多种语言,并能够基于语言自动生成客户端和服务端功能库。目前,在GitHub上已提供了C版本grpc、Java版本grpc-java 和 Go版本grpc-go,其它语言的版本正在积极开发中,其中 grpc支持C、C++、Node.js、Python、Ruby、Objective-C、PHP和C#等语言,grpc-java已经支持Android开发。
gRPC已经应用在Google的云服务和对外提供的API中,其主要应用场景如下:
低延迟、高扩展性、分布式的系统
同云服务器进行通信的移动应用客户端
设计语言独立、高效、精确的新协议
便于各方面扩展的分层设计,如认证、负载均衡、日志记录、监控等
参考文档:
http://www.infoq.com/cn/news/2015/03/grpc-google-http2-protobuf
C#中的使用
如何在C#中使用,需要在工程中Grpc.Core.dll,需将其主要是利用grpc_csharp_plugin.exe将proto转化成C#文件,在工程中引用其生成的两个C#访问类文件即可。
定义proto的协议
设计proto协议文件,该文件的格式为.proto,命名为AccountService.proto。
syntax = “proto3”;//gRPC必须使用protocol buffer3.0版本,所以syntax设置为proto3。
package gRPCDemo;//包名,即为C#的命名空间的名字 namespace
service AccountService{//所生成的访问类名
rpc SayHello (HelloRequest) returns (HelloReply) {}//定义其方式,请求和回调的结构体
}
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
创建一个bat文件,编写一下命名行:
protoc.exe -I=.–csharp_out=. –grpc_out=. –plugin=protoc-gen-grpc=grpc_csharp_plugin.exe AccountService .proto
执行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协议,我们就要在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文件则创建bat文件
fs.SetLength(0);//清空
fs.Close();//关闭流对象
var sw = new StreamWriter(filePath);//创建写入流
sw.WriteLine(“set PJ_PATH=” + Application.dataPath);//写入结束时换行
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文件,调用外部进程开启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)//设置进程
{
CreateNoWindow = false,
UseShellExecute = true,
RedirectStandardError = false,
RedirectStandardInput = false,
};
System.Diagnostics.Process.Start(pStartInfo);//开始进程
}
至此,一个在编辑器上直接生成bat文件和生成所需的访问类文件。