1. 概览
gRPC 是 Google 开发的语言中立、平台中立的远程过程调用 (RPC) 框架和工具集。借助它,您可以使用 Protocol Buffers(一种功能强大的二进制序列化工具集和语言)来定义服务。然后,您可以根据服务定义生成各种语言的惯用客户端和服务器桩。
在此 Codelab 中,您将学习如何构建使用 gRPC 框架公开 API 的 C# 服务。您可以使用用 C# 编写的控制台客户端与此服务进行交互,该客户端使用与服务相同的服务说明。
学习内容
- Protocol Buffer 语言。
- 如何使用 C# 实现 gRPC 服务。
- 如何使用 C# 实现 gRPC 客户端。
- 如何更新 gRPC 服务。
所需条件
- 一个浏览器,例如 Chrome 或 Firefox。
- 已安装 Visual Studio 2013 或更高版本。
- 熟悉 .NET Framework 和 C# 语言。
您打算如何使用本教程?
您如何评价自己在 Google Cloud Platform 方面的经验水平?
2. 下载并构建 gRPC C# 示例
下载示例
下载 gRPC C# 示例代码库的 zip 文件并将其解压缩。
或者,您也可以克隆其 Git 代码库。
git clone https://github.com/meteatamel/grpc-samples-dotnet.git
无论哪种方式,您都应该有一个 grpc-samples-dotnet 文件夹,其中包含以下内容:

构建解决方案
示例应用文件夹包含 GrpcSamples.sln(一个 Visual Studio 解决方案)。双击可在 Visual Studio 中打开解决方案。您应该会看到一个包含多个项目的解决方案。

我们将在下一部分中更详细地介绍这些项目,但首先,我们先来构建项目。前往 Build > Build Solution 或 Ctrl + Shift + B 构建解决方案。这会从 NuGet 下载所有依赖项,然后编译应用。
最后,您应该会在 Visual Studio 控制台输出中看到 Build succeeded 消息。
3. 探索 Greeter 示例
Greeter 是一个简单的 gRPC 示例,其中客户端发送包含名称的请求,服务器则返回包含该名称的消息。有一个 Greeter 项目,其中包含客户端和服务器所基于的通用服务定义(proto 文件)。
Greeter 项目
这是客户端与服务器之间共享的通用项目。它具有 greeter.proto,这是客户端和服务器使用的 gRPC 服务定义。服务定义定义了一个名为 GreetingService 的 gRPC 服务,该服务具有一个 greeting 方法,该方法以 HelloRequest 作为输入,以 HelloResponse 作为输出。
service GreetingService {
rpc greeting(HelloRequest) returns (HelloResponse);
}
这是一种一元(即非流式)方法,客户端发送单个请求,并从服务器获取单个响应。您可以探索 greeter.proto. 的其余内容。此项目还有一个名为 generate_protos.bat 的脚本,可用于从 proto 文件生成客户端和服务器桩。该项目已包含生成的客户端和服务器存根,因此您无需自行生成。不过,如果您更改了服务定义文件中的某些内容,则需要运行此脚本来重新生成桩。
Greeter Server
这是 gRPC 服务器的项目。Program.cs 是设置端口和服务器实现的主要入口点。重要类是 GreeterServiceImpl.cs。它具有 greeting 方法,可在其中实现实际功能。
public override Task<HelloResponse> greeting(HelloRequest request,
ServerCallContext context)
{
return Task.FromResult(new HelloResponse {
Greeting = "Hello " + request.Name });
}
Greeter 客户端
这是 gRPC 服务的客户端。它还具有 Program.cs 作为入口点。它会创建一个与服务器通信的渠道,然后使用生成的桩中的渠道创建一个客户端。然后,它会创建一个请求,并使用客户端桩将其发送到服务器。
4. 运行 Greeter 示例
首先,启动 Greeter 服务器。打开命令提示符,然后前往 Greeter Server 的 bin > Debug 文件夹并运行可执行文件。您应该会看到服务器正在监听。
> C:\grpc-samples-dotnet\GreeterServer\bin\Debug>GreeterServer.exe
GreeterServer listening on port 50051
Press any key to stop the server...
接下来,运行 Greeter 客户端。在单独的命令提示符中,前往 Greeter Server 的 bin > Debug 文件夹,然后运行可执行文件。您应该会看到客户端发送请求并从服务器接收响应。
> C:\grpc-samples-dotnet\GreeterClient\bin\Debug>GreeterClient.exe
GreeterClient sending request
GreeterClient received response: Hello Mete - on C#
Press any key to exit...
5. 更新 Greeter 示例
我们来看看更新服务是什么样的。向我们的 gRPC 服务添加了一个新方法 goodbye,该方法会向客户端返回 goodbye 而不是 hello。
第一步是更新服务定义文件 greeter.proto.
service GreetingService {
rpc greeting(HelloRequest) returns (HelloResponse);
rpc goodbye(HelloRequest) returns (HelloResponse);
}
接下来,您需要重新生成客户端和服务器存根。在命令提示符中,运行 generate_protos.bat。生成桩后,您可能需要刷新 Visual Studio 项目才能获取更新后的代码。
最后,更新客户端和服务器代码,以利用新方法。在服务中,更新 GreeterServiceImpl.cs 并添加新的 goodbye 方法。
public override Task<HelloResponse> goodbye(HelloRequest request,
ServerCallContext context)
{
return Task.FromResult(new HelloResponse {
Greeting = "Goodbye " + request.Name });
}
在客户端中,调用 Program.cs. 中的 goodbye 方法
response = client.goodbye(request);
Console.WriteLine("GreeterClient received response: "
+ response.Greeting);
重新构建项目,然后再次运行服务器和客户端。您应该会看到客户端现在收到告别消息。
> C:\grpc-samples-dotnet\GreeterClient\bin\Debug>GreeterClient.exe
GreeterClient sending request
GreeterClient received response: Hello Mete - on C#
GreeterClient received response: Goodbye Mete - on C#
Press any key to exit...
6. 探索 Chat 示例
解决方案中还包含 ChatServer 和 ChatWindowsClient 项目。顾名思义,这是一个简单聊天应用的客户端-服务器对。Chat 项目具有名为 chat.proto 的服务定义文件。它定义了一个具有 chat 方法的 ChatService。
service ChatService {
rpc chat(stream ChatMessage) returns (stream ChatMessageFromServer);
}
这里的重要之处在于,传入和传出的聊天消息都标有 stream 关键字。这基本上会将连接变成双向流,客户端和服务器可以随时相互发送消息;对于聊天应用来说,这是一种完美的解决方案。
您可以进一步探索该示例,构建并高效运转它,以了解其工作方式。
7. 恭喜!
所学内容
- Protocol Buffer 语言。
- 如何使用 C# 实现 gRPC 服务。
- 如何使用 C# 实现 gRPC 客户端。
- 如何更新 gRPC 服务。