gRPC と Quarkus!

Red Hat で Solution Architect として Quarkus を担当している伊藤ちひろです。

この記事は、Quarkus.io のブログ記事、gRPC with Quarkus! の翻訳記事です。

Quarkus 1.5 では、gRPC Quarkus拡張機能の最初のバージョンを出荷しました。

gRPCに馴染みのない方に紹介すると、HTTP/2とProtobufに依存した高効率なリモートプロシージャコールの仕組みです。gRPC は、Go、JavaScript、Python、Java などの任意の言語から gRPC サービスを実装して利用できます。 gRPC は、より古典的なリクエスト/レスポンスの相互スキームと同様に、双方向のデータストリームをサポートしています。gRPCは特にマイクロサービスに適しています。マイクロサービスシステムを構築する際の3つの大きな懸念事項である認証、トレース、ヘルスのサポートを提供します。

gRPC サービスは、異なるメソッドをリストアップし (次の例では Hello) 、と交換されるメッセージ (HelloRequestHelloReply) の定義したprotoファイルに記述されています。

syntax = "proto3";

option java_multiple_files = true;
option java_package = "io.quarkus.grpc.examples.helloworld";
option java_outer_classname = "HelloWorld";

package io.quarkus.grpc.example;

service Greeter {
    rpc Hello (HelloRequest) returns (HelloReply) {}
}

message HelloRequest {
    string name = 1;
}

message HelloReply {
    string message = 1;
}

Proto コンパイラであるprotocは、これらのprotoファイルから、ターゲットとなる言語ごとにスタブ (クライアント) とベースの実装 (サービス) を生成します。

https://quarkus.io/assets/images/posts/grpc/protoc.png

Quarkus で gRPC サポートを有効にするには、quarkus-grpc 拡張機能を追加します。以下の依存関係をプロジェクトに追加するか、以下のコマンドを実行してください。

quarkus-grpc の依存関係

<dependency>
  <groupId>io.quarkus</groupId>
  <artifactId>quarkus-grpc</artifactId>
</dependency>

既存のプロジェクトに quarkus-grpc 拡張機能を追加します。

mvn quarkus:add-extension -Dextension=quarkus-grpc

もちろん、プロジェクトジェネレータからgRPCを選択できます。

現時点では、この拡張機能はprotocの生成をカバーしていないので、そのためにはプロジェクトを設定する必要があります。こちらで例をご紹介しています。gRPC 拡張機能は以下をサポートしています。

  • gRPC サービスの実装
  • gRPC サービスの消費
  • 平文とTLS
  • 相互認証
  • gRPCのリフレクションとヘルス・サービス
  • gRPCの「bare」Java API と Quarkus のリアクティブ API と統合する Mutiny API

などなど、実際に見てみよう。

youtu.be

この動画で紹介しているコードは、このGitHubプロジェクトから入手できます。

まだまだ続く!

それは最初の一歩に過ぎない。より良いものにするためのアイデアはいくらでもあります。まず、protocの生成を取り上げます。しして、開発時にこれらのprotoファイルを修正できるようにすることで、ホットリロードの体験を向上させたいと思います。カスタムコンプレッサ、ロードバランサー、ネームリゾルバのサポートもロードマップ上にあります。

私たちはあなたのフィードバックを大切にしていますので、バグを報告したり、改善を求めてください。

Quarkus のユーザーの方、または好奇心旺盛な方は、恥ずかしがらずにコミュニティに参加してください。

* 各記事は著者の見解によるものでありその所属組織を代表する公式なものではありません。その内容については非公式見解を含みます。