为了理解gRPC的概述,总结了从用C#创建一个简单项目到执行它的流程。
什么是gRPC?
gRPC是一个运行在HTTP/2协议上的RPC框架,简而言之,可以设置一个支持HTTP/2的服务器并从客户端调用该方法(RPC)。
在本文中,为了确认此行为,将使用gRPC创建一个服务器,并轻松地从另一台PC执行RPC。
gRPC还描述了带有Protocol Buffer的请求和响应接口,通过从那里自动生成每种语言的源代码,可以在服务器和客户端之间使用一致的接口。
安装和设置
现在使用gRPC创建一个简单的应用程序。
项目创建
首先在Visual Studio中创建一个项目,这次将项目创建为控制台应用程序。

安装包
接下来,安装gRPC相关包,使用NuGet安装以下包。
- Grpc.Core
- Grpc.Tool
- Google.Protobuf

指定Protocol Buffers的目标文件
接下来,定义要在项目文件中使用的Protocol Buffers的文件路径,打开项目文件(csproj 文件)并添加以下内容。
<ItemGroup>
<Protobuf Include="Protos\*.proto" GrpcServices="Both" />
</ItemGroup>
然后,在与项目文件相同的层次结构中创建一个Protos文件夹,并存储从现在开始创建的.proto文件。
请注意,在GrpcServices=”Both”这种情况下,会生成服务器代码和客户端代码。
如果在创建服务器应用程序或创建客户端应用程序时执行此操作GrpcServices=”Server”,
则GrpcServices=”Client”不会生成额外的代码。
创建一个服务器端应用程序
现在创建一个服务器端应用程序。
从 proto 文件生成代码
首先创建一个proto文件,保留上述项目文件设置不变GrpcServices=”Server”。
接下来,在名称Protos文件夹下example.proto创建以下文件。
syntax = "proto3";
option csharp_namespace = "GrpcExample";
import "google/protobuf/empty.proto";
service Example {
// 获取机器信息
rpc GetMachineInfo (google.protobuf.Empty) returns (ExampleReply);
}
message ExampleReply {
// 计算机名称
string MachineName = 1;
// 用户名
string UserName = 2;
}
看一下就能明白,所以省略了proto文件如何写的细节了。需要注意的是,这次定义的方法将是一个没有参数的方法,但在这种情况下,请如上所示设置参数。google.protobuf.Empty
如果在这种状态下构建一次,可以看到Example.cs并且ExampleGrpc.cs在obj文件夹下输出,将使用这个自动生成的类来编写服务器代码。
编写服务器代码
接下来,在Program.cs中编写服务器代码。
using System;
using System.Threading.Tasks;
using Google.Protobuf.WellKnownTypes;
using Grpc.Core;
using GrpcExample;
namespace GrpcGreeterClient
{
class Program
{
public static void Main(string[] args)
{
var server = new Server
{
// 使用自动生成的类,编写
Services = { Example.BindService(new ExampleService()) },
// 输入主机和端口号
Ports = { new ServerPort("123.456.7.89", 12345, ServerCredentials.Insecure) }
};
server.Start();
Console.WriteLine("Press any key to shutdown the server...");
Console.ReadKey();
server.ShutdownAsync().Wait();
}
}
public class ExampleService : Example.ExampleBase
{
public override Task<ExampleReply> GetMachineInfo(Empty request, ServerCallContext context)
{
// 返回机器名和用户名
return Task.FromResult(new ExampleReply
{
MachineName = Environment.MachineName,
UserName = Environment.UserName
});
}
}
}
创建服务器实例的部分主要是样板文件,暂时需要检查通信,所以请在主机中输入私有IP地址。
ExampleService是proto文件中定义的基类的实现,这次,它只是返回机器名称和用户名,以确认通信正常工作。
创建客户端应用程序
接下来,将创建一个客户端应用程序。当在另一台电脑上运行它时,很容易意识到可以正常通信。
从proto文件生成代码
proto文件使用与创建服务器端应用程序时相同的文件,只需在项目文件中设置即可GrpcServices=”Client”。
编写客户端代码
接下来,在Program.cs中编写客户端代码。
using System;
using GrpcExample;
using Grpc.Core;
using Google.Protobuf.WellKnownTypes;
namespace ExampleGrpcClient
{
class MainClass
{
public static void Main(string[] args)
{
var channel = new Channel("123.456.7.89", 12345, ChannelCredentials.Insecure);
var client = new Example.ExampleClient(channel);
var machineInfo = client.GetMachineInfo(new Empty());
Console.WriteLine($"MachineName: {machineInfo.MachineName} / UserName: {machineInfo.UserName}");
}
}
}
像这样实例化并使用自动生成的ExampleClient,指定与为服务器设置的主机和端口相同的值。
执行
创建服务器端和客户端应用程序后,运行每个应用程序。
如果客户端能够获取到服务器端PC的信息,则说明成功。

…
以上是关于C#中的gRPC的全部内容,如果你有任何反馈,请随时在本页面下方留言。