最近接到业务需求,对接外包算法的http接口,了解了gRPC的使用,这里以一个简单的例子说明。
1 新建程序
新建gRPCClient和gRPCServer
2 添加引用
打开NuGet,安装Grpc、Google.Protobuf和Grpc.Tools
3 定义服务
定义LogService.proto文件,如下代码:我这里是将服务放在gRPCServer下,也可以放在其他项目下
//指定语法proto2或proto3 本文采用proto3
syntax = "proto3";
//指定命名空间
option csharp_namespace = "gRPCServer";
//定义rpc服务
service gRpcQueryService
{
rpc Search(QureyCond) returns (QueryResult);
}
//定义查询条件消息体
message QureyCond
{
int32 id=1; //通过id查询
}
//定义查询结果实体对象
message QueryResult
{
int32 id=1;
string name=2;
int32 age=3;
}
4 生成代码
打开CMD,在项目的packages文件夹可找到Grpc.Tools 通过cd /d 命令转到packages上一级目录
指定protoc.exe路径:packages\Grpc.Tools.2.50.0\tools\windows_x64\protoc.exe
指定proto文件搜索目录:-IgRPCServer
C#代码生成路径:--csharp_out gRPCServer
指定proto文件:gRPCServer\LogService.proto
grpc文件生成路径:--grpc_out gRPCServer
指定grpc_csharp_plugin.exe路径:--plugin=protoc-gen-grpc=packages\Grpc.Tools.2.50.0\tools\windows_x64\grpc_csharp_plugin.exe
输入命令运行成功得到两个cs文件,将文件添加到项目中。
5 服务端
定义监听服务
const int Port = 8050;
public static void Main(string[] args)
{
Server server = new Server
{
Services = { gRpcQueryService.BindService(new GRPCImpl()) },
Ports = { new ServerPort("localhost", Port, ServerCredentials.Insecure) }
};
server.Start();
Console.WriteLine("gRPC server listening on port " + Port);
Console.WriteLine("任意键退出...");
Console.ReadKey();
server.ShutdownAsync().Wait();
}
具体服务内容
class GRPCImpl : gRpcQueryService.gRpcQueryServiceBase
{
public override Task<QueryResult> Search(QureyCond request, ServerCallContext context)
{
return Task.FromResult(Search(request));
}
private QueryResult Search(QureyCond cond)
{
//自定义逻辑
QueryResult result = new QueryResult();
result.Id = cond.Id;
result.Name = "周";
result.Age = 23;
return result;
}
}
6 客户端
调用方法
Channel channel = new Channel("127.0.0.1:8050", ChannelCredentials.Insecure);
var client = new gRpcQueryService.gRpcQueryServiceClient(channel);
var result = client.Search(new QureyCond { Id = 2 });
Console.WriteLine("结果:id={0} name={1} age={2}", result.Id, result.Name, result.Age);
channel.ShutdownAsync().Wait();
Console.WriteLine("任意键退出...");
Console.ReadKey();
7 调用效果
先打开gRPCServer
再打开gRPCClient