快速开始
本指南通过一个简单的示例来帮助您开始使用 Dart 中的 gRPC。
快速开始
准备工作
Dart 版本 2.12 或更高,通过 Dart 或 Flutter SDK 安装
有关安装说明,请参阅 安装 Dart 或 安装 Flutter。
Protocol buffer 编译器,
protoc
, 第 3 版有关安装说明,请参阅 Protocol Buffer 编译器安装。
用于 protocol compiler 的 Dart 插件
使用以下命令安装用于 Protocol Compiler 的 Dart 插件 (
protoc-gen-dart
)dart pub global activate protoc_plugin
更新您的
PATH
环境变量,以便protoc
编译器能够找到插件export PATH="$PATH:$HOME/.pub-cache/bin"
注意
Dart gRPC 支持 Flutter 和 Server 平台。获取示例代码
示例代码是 grpc-dart 仓库的一部分。
将仓库下载为 zip 文件 并解压,或克隆仓库
git clone https://github.com/grpc/grpc-dart
切换到快速入门示例目录
cd grpc-dart/example/helloworld
运行示例
在 example/helloworld
目录下
下载包依赖
dart pub get
运行服务器
dart bin/server.dart
在另一个终端中运行客户端
dart bin/client.dart Greeter client received: Hello, world!
恭喜!您已经成功运行了一个使用 gRPC 的客户端-服务器应用。
更新应用
在本节中,您将更新应用,以使用一个额外的服务器方法。gRPC 服务使用 protocol buffers 定义。要了解如何在 .proto
文件中定义服务,请参阅 基础教程。目前,您只需知道服务器和客户端存根都具有 SayHello()
RPC 方法,该方法接受客户端的 HelloRequest
参数并从服务器返回 HelloReply
,并且该方法的定义如下
// The greeting service definition.
service Greeter {
// Sends a greeting
rpc SayHello (HelloRequest) returns (HelloReply) {}
}
// The request message containing the user's name.
message HelloRequest {
string name = 1;
}
// The response message containing the greetings
message HelloReply {
string message = 1;
}
更新 gRPC 服务
打开 protos/helloworld.proto
并添加一个新的 SayHelloAgain()
方法,具有相同的请求和响应类型
// The greeting service definition.
service Greeter {
// Sends a greeting
rpc SayHello (HelloRequest) returns (HelloReply) {}
// Sends another greeting
rpc SayHelloAgain (HelloRequest) returns (HelloReply) {}
}
// The request message containing the user's name.
message HelloRequest {
string name = 1;
}
// The response message containing the greetings
message HelloReply {
string message = 1;
}
记得保存文件!
重新生成 gRPC 代码
在使用新的服务方法之前,您需要重新编译更新后的 proto 文件。在 example/helloworld
目录下,运行以下命令
protoc --dart_out=grpc:lib/src/generated -Iprotos protos/helloworld.proto
您将在 lib/src/generated
目录中找到重新生成的请求和响应类以及客户端和服务器类。
现在分别在服务器和客户端代码中实现和调用新的 RPC。
更新服务器
打开 bin/server.dart
并将以下 sayHelloAgain()
方法添加到 GreeterService
类中
class GreeterService extends GreeterServiceBase {
@override
Future<HelloReply> sayHello(ServiceCall call, HelloRequest request) async {
return HelloReply()..message = 'Hello, ${request.name}!';
}
@override
Future<HelloReply> sayHelloAgain(ServiceCall call, HelloRequest request) async {
return HelloReply()..message = 'Hello again, ${request.name}!';
}
}
更新客户端
在 bin/client.dart
中添加一个对 sayHelloAgain()
的调用,如下所示
Future<void> main(List<String> args) async {
final channel = ClientChannel(
'localhost',
port: 50051,
options: const ChannelOptions(credentials: ChannelCredentials.insecure()),
);
final stub = GreeterClient(channel);
final name = args.isNotEmpty ? args[0] : 'world';
try {
var response = await stub.sayHello(HelloRequest()..name = name);
print('Greeter client received: ${response.message}');
response = await stub.sayHelloAgain(HelloRequest()..name = name);
print('Greeter client received: ${response.message}');
} catch (e) {
print('Caught error: $e');
}
await channel.shutdown();
}
运行更新后的应用
像之前一样运行客户端和服务器。在 example/helloworld
目录下执行以下命令
运行服务器
dart bin/server.dart
在另一个终端中,运行客户端。这次,添加一个名字作为命令行参数
dart bin/client.dart Alice
您将看到以下输出
Greeter client received: Hello, Alice! Greeter client received: Hello again, Alice!
贡献
如果您在使用 Dart gRPC 时遇到问题或有功能请求,请在 grpc-dart 仓库中 创建 issue。