1. 概览
gRPC 是 Google 开发的与语言和平台无关的远程过程调用 (RPC) 框架和工具集。它支持您使用 Protocol Buffers(一种特别强大的二进制序列化工具和语言)定义服务。然后,您可以使用各种语言根据服务定义生成惯用的客户端和服务器存根。
在此 Codelab 中,您将学习如何构建使用 gRPC 框架公开 API 的 C# 服务。您可以使用以 C# 语言编写的控制台客户端与此服务交互,该客户端使用与此服务相同的服务说明。
学习内容
- 协议缓冲区语言。
- 如何使用 C# 实现 gRPC 服务。
- 如何使用 C# 实现 gRPC 客户端。
- 如何更新 gRPC 服务。
所需条件
- 一个浏览器,例如 Chrome 或 Firefox。
- 已安装 Visual Studio 2013 或更高版本。
- 熟悉 .NET Framework 和 C# 语言。
您打算如何使用本教程?
如何评价您的 Google Cloud Platform 使用体验?
<ph type="x-smartling-placeholder">2. 下载并构建 gRPC C# 示例
下载示例
以 zip 文件的形式下载 gRPC C# 示例代码库并将其解压缩。
或者,您也可以克隆其 Git 代码库。
git clone https://github.com/meteatamel/grpc-samples-dotnet.git
无论采用哪种方式,您都应该有一个 grpc-samples-dotnet
文件夹,其中包含以下内容:
构建解决方案
示例应用文件夹包含 Visual Studio 解决方案 GrpcSamples.sln
。双击以在 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 服务器
这是适用于 gRPC 服务器的项目。Program.cs
是设置端口和服务器实现的主要入口点。重要的类是 GreeterServiceImpl.cs
。它具有一个 greeting
方法,用于实现实际功能。
public override Task<HelloResponse> greeting(HelloRequest request,
ServerCallContext context)
{
return Task.FromResult(new HelloResponse {
Greeting = "Hello " + request.Name });
}
问候客户
这是 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”的新方法,该方法会向客户端返回“再见”,而不是“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. 恭喜!
所学内容
- 协议缓冲区语言。
- 如何使用 C# 实现 gRPC 服务。
- 如何使用 C# 实现 gRPC 客户端。
- 如何更新 gRPC 服务。