sgcWebSockets に、Delphi および C++Builder 向けのネイティブ gRPC クライアントが追加されました。新しい TsgcGRPCClient コンポーネントは、ライブラリ自身の HTTP/2 トランスポート上で gRPC を扱うため、外部 gRPC ランタイムも、C ライブラリも、配布すべき追加の DLL も不要です。Enterprise エディションに含まれ、Windows、macOS、Linux、iOS、Android で動作します。
gRPC とは、HTTP/2 上にフレーム化された Protocol Buffers メッセージにほかなりません。sgcWebSockets はすでに完全な HTTP/2 スタックを備えているため、gRPC クライアントはその上に直接構築されます。リクエストのバイト列をフレーム化し、gRPC ヘッダーとタイムアウトを適用し、返ってきたステータスとトレーラーを型付きの結果へと解析します。
ネイティブ HTTP/2 トランスポート上に構築
gRPC のチャネルは HTTP/2 接続です。TsgcHTTP2Client を作成してホストとポートを指定し、それを gRPC コンポーネントの Client プロパティに割り当てます。TLS は HTTP/2 クライアントが OpenSSL または Windows SChannel を通じて処理します。
uses
sgcHTTP2, sgcGRPC_Client, sgcGRPC_Classes, sgcGRPC_Types;
var
HTTP2: TsgcHTTP2Client;
GRPC: TsgcGRPCClient;
oResponse: TsgcGRPCResponse;
begin
HTTP2 := TsgcHTTP2Client.Create(nil);
HTTP2.Host := 'grpc.example.com';
HTTP2.Port := 443;
HTTP2.TLS := True;
GRPC := TsgcGRPCClient.Create(nil);
GRPC.Client := HTTP2;
// metadata is sent on every call (auth, tracing...)
GRPC.DefaultMetadata.Add('authorization', 'Bearer eyJ...');
// unary call: the request is your serialized protobuf message as TBytes
oResponse := GRPC.Call('helloworld.Greeter', 'SayHello', RequestBytes);
if oResponse.StatusCode = grpcOK then
Memo1.Text := oResponse.DataString
else
ShowMessage('gRPC error: ' + oResponse.StatusMessage);
end;
4 種類すべての呼び出しタイプ
このコンポーネントは、同期・非同期を問わず、あらゆる gRPC のやり取りパターンをサポートします。
- ユナリ。
CallはブロックしてTsgcGRPCResponseを返します。CallAsyncは即座に戻り、OnGRPCResponseを発火します。 - サーバーストリーミング。
ServerStreamingCallは 1 つのリクエストを送信し、メッセージのストリームを受信します。各メッセージはOnGRPCStreamMessageを発生させ、終了時にOnGRPCStreamEndが発生します。 - クライアントストリーミング。
OpenClientStreamを呼び、メッセージごとにSendStreamMessageを実行し、CloseClientStreamで 1 つの応答を読み取ります。 - 双方向ストリーミング。
OpenBidiStream、SendBidiMessage、CloseBidiStreamにより、1 つの HTTP/2 ストリーム上で全二重のやり取りを実行します。
応答には、呼び出しが返したすべての情報が含まれます。StatusCode、StatusMessage、生の Data バイト列 (または DataString)、そして Trailers です。
メタデータ、デッドライン、チャネルオプション
カスタムヘッダーは、チャネル全体に対しては DefaultMetadata を通じて、あるいは呼び出しごとに送信できます。呼び出しごとのタイムアウトは標準の grpc-timeout ヘッダーに変換され、CancelCall は実行中のストリームを中止します。チャネル自体は ChannelOptions によって調整します。
// gzip compression and channel limits
GRPC.ChannelOptions.Compression := grpcGzip;
GRPC.ChannelOptions.MaxMessageSize := 16 * 1024 * 1024;
// abort a long-running stream
GRPC.CancelCall(StreamId);
インターセプター、リトライ、可観測性
Interceptors チェーンがすべての呼び出しをラップするため、ロギング、認証の更新、トレーシングを 1 か所で追加できます。RetryPolicy は選択したステータスコードでリトライし、ServiceConfig はメソッドごとのポリシーを適用し、MetricsCollector は呼び出しのカウンターとレイテンシーを記録します。
GRPC.RetryPolicy.MaxAttempts := 4;
GRPC.RetryPolicy.RetryableStatusCodes :=
GRPC.RetryPolicy.RetryableStatusCodes + [grpcUNAVAILABLE];
お好みの Protocol Buffers を利用可能
このクライアントは生のメッセージバイト列 (TBytes) を受け取り、返します。そのため、特定の Protocol Buffers ライブラリに縛られることはありません。すでにお使いの任意の protobuf ツールでリクエストをエンコードし、そのバイト列を Call に渡し、応答のバイト列を同じ方法でデコードしてください。gRPC の長さプレフィックスのフレーム化、圧縮フラグ、ステータスコード、トレーラーは、コンポーネントが処理します。
Google Cloud gRPC API を同梱
汎用クライアントに加えて、sgcWebSockets は Google Cloud の gRPC サービス向けに型付きクライアントを提供します。Pub/Sub、Speech-to-Text、Translation、Vision、Natural Language、Cloud Storage、BigQuery、Vertex AI です。これらはサービスアカウント認証とリクエスト・レスポンスメッセージを処理するため、protobuf を手作業で組み立てる代わりに高レベルのメソッドを呼び出すだけで済みます。
提供状況
gRPC クライアントは、Delphi および C++Builder 向けの sgcWebSockets Enterprise エディションで現在ご利用いただけます。すぐに実行できるサンプルが Demos\21.GRPC\01.GRPC_Client に含まれており、プロパティ、メソッド、イベントの完全なリファレンスは gRPC Client 製品ページでご覧いただけます。
ご質問、フィードバック、または導入のサポートが必要ですか? お問い合わせください。コードを書いた本人から返信が届きます。
