0%

【文章翻譯】Announcing official gRPC support for Dart

【文章內容使用 Gemini 1.5 Pro 自動翻譯產生】

宣布 Dart 官方 gRPC 支援

gRPC 是一個高效能、開源的 RPC 框架。它提供簡單的服務定義,建立在 http/2 之上,並支援雙向串流和完全整合的可插拔身份驗證。 gRPC 框架支援 多種語言,我們很高興地宣布 Dart 語言的支援現在已進入 Beta 階段!Dart gRPC 支援適用於 1.24.3 或更高版本的 Dart SDK,目前支援 FlutterVM/伺服器 平台。

建立伺服器和撰寫 gRPC 服務定義

gRPC 服務通常使用 Protocol Buffers v3 描述其端點和資料序列化。以下是一個小型範例服務定義,它定義了一個名為「Greeter」的服務,其中包含一個名為「SayHello」的 rpc 訊息(兩條訊息中的數字「1」指定了 訊息欄位 的唯一 ID):

1
2
3
4
5
6
7
8
9
10
11
service Greeter {
rpc SayHello (HelloRequest) returns (HelloReply) {}
}

message HelloRequest {
string name = 1;
}

message HelloReply {
string message = 1;
}

定義服務後,您可以自動產生伺服器的框架:

1
protoc --dart_out=grpc:generated -Iprotos protos/greeter.proto

這會在 generated 目錄中產生一個 GreeterServiceBase 類別,然後您可以將其子類別化以加入實際的服務實作:

1
2
3
4
5
class GreeterService extends GreeterServiceBase {
@override
Future<HelloReply> sayHello(ServiceCall call, HelloRequest request) =>
Future.value(HelloReply()..message = 'Hello, ${request.name}!');
}

使用 gRPC 用戶端呼叫伺服器

當我們產生上面的服務 stub 時,protoc 編譯器也產生了一個用戶端函式庫:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import 'package:grpc/grpc.dart';
import 'package:helloworld/greeter.pbgrpc.dart';

Future<void> main() async {
final channel = ClientChannel('localhost',
port: 50051,
options: const ChannelOptions(credentials: ChannelCredentials.insecure()));
final stub = GreeterClient(channel);

final name = 'Michael';
final request = HelloRequest()..name = name;
try {
final response = await stub.sayHello(request);
print('Greeter client received: ${response.message}');
} catch (e) {
print('Caught error: $e');
}
await channel.shutdown();
}

這樣,從用戶端層呼叫服務就很簡單了:

當運行時,這將列印以下輸出:

1
Greeter client received: Hello, Michael!

後續步驟

要開始在 Dart 中使用 gRPC,請查看我們新的 Dart gRPC 快速入門,它將引導您運行和擴展 Greeter 範例。接下來,查看 Dart gRPC 教程

如果您遇到任何問題,請 提交 issue。我們也很樂意聽到您對任何您希望看到的變更或新增的回饋;例如,我們已經聽到了一些支援 gRPC-Web 協定 的請求。提供快速回饋的一種具體方法是透過按下 issue 最上方評論中的 GitHub 豎起大拇指 👍 按鈕來「投票」給 issue。

我們期待看到您使用 Dart 的 gRPC 建立的成果!