Kalixのサンプルcustomer regstory sampleをローカルで動かしてみる

lightbendが提供しているPaaSであるKalix (https://www.kalix.io/)のサンプルコードを動かしてみました。
2022.05.30

はじめに

最近リブランドされたPaaS Kalix(以前のakka serverless)が面白そうだったのでローカルでサンプルコードを実行してみました。

Kalixとは

Kalixについてはこちらの記事が詳しいです。

サンプルCustomer Registory

今回の記事は公式ドキュメントのQuickStartの内容をベースにしています。

コードの取得

kalixコマンドでサンプルコードを取得します。

kalix quickstart download customer-registry-scala

ここで取得できるコードはこのリポジトリと同等の内容に思えます。

注意: 今回はローカルで上記のサンプルを実行します。オンラインのドキュメントには「Run a service locally」というページもありますが、このページで対象としているサンプルはCustomer Registory Scalaとは内容が異なるのでこのページのcurlやgrpcurlのスニペットは動作しません。

起動するまで

基本的にはREADMEの内容に従って実行していけばいいのですがいくつかpitfallがあったので紹介します。

Javaのバージョンは11以降にすること

WEBのQuickStartには記載があるのですがREAD MEには記載がないので見落としがちです。

  • Docker 20.10.8 or higher
  • Java 11 or higher
  • sbt 1.4 or higher
  • grpcurl

サンプルコードを実行するだけなら.sbtoptsで指定すると簡単です。

-java-home
~/.asdf/installs/java/corretto-11.0.13.8.1/

ちなみにJVMのバージョンが一致しないと以下のようなエラーメッセージが出力されます。

--jvm_3_out: java.lang.UnsupportedClassVersionError: kalix/Annotations has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0
  | => cat java.lang.ClassLoader.defineClass1(Native Method)
# あるいはこちら
--jvm_3_out: java.lang.UnsupportedClassVersionError: kalix/Annotations

Main.scalaを修正する

Main#mainでは非同期にサービスを起動したあと待機していないのですぐに終了してしまいます。

以下のように修正します。これは公式で修正されるのを期待したいところです。

def main(args: Array[String]): Unit = {
    log.info("starting the Kalix service")
    Await.ready(
      createKalix().start(),
      Duration.Inf
    )
  }

動作確認

コンテナとあわせてsbt runでサービスを起動するとgrpcurlでAPIを実行できます。

API一覧を取得

$ grpcurl -plaintext localhost:9000 list
customer.api.CustomerService
customer.view.CustomerByEmail
customer.view.CustomerByName
grpc.reflection.v1alpha.ServerReflection

Customerを作成

$ grpcurl --plaintext -d '{"customer_id": "wip", "email": "wip@example.com", "name": "Very Important", "address": {"street": "Road 1", "city": "The Capital"}}' localhost:9000  customer.api.CustomerService/Create

{

}

Customerを参照

$ grpcurl --plaintext -d '{"customer_id": "wip"}' localhost:9000  customer.api.CustomerService/GetCustomer

{
  "customerId": "wip",
  "email": "wip@example.com",
  "name": "Very Important"
}

その他のスニペットも実行できます。

まとめ

akka serverless 改めkalixのサンプルを手元で動かしてみました。少しとっつきにくいサービスですが人気が出てくればいいなと願っています。