Unity中的gRPC通信

概述

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文件和生成所需的访问类文件。

    原文作者:JCone
    原文地址: https://www.jianshu.com/p/2c3369e81526
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞