マイクロサービスフレームワーク Lagom の新規アプリケーションを作成する

マイクロサービスフレームワークの Lagom を使用した新規アプリケーションを作成する方法をメモっとく。

# 前提条件

* Java 8
* sbt 1.2.1+

# 新規アプリケーションを作成する

[Giter8](http://www.foundweekends.org/giter8/) テンプレートから Lagom を使用した新規アプリケーションを作成できる。ここでは、テンプレートパラメーターをコマンドライン引数として指定しているが、指定しない場合は対話的にテンプレートパラメーターを指定できる。

```shell-session
$ sbt new lagom/lagom-scala.g8 \
  --name=Hello \
  --organization=com.example \
  --version=1.0-SNAPSHOT \
  --package=com.example.hello
```

# アプリケーションを起動する

作成したアプリケーションのルートディレクトリで `sbt` を起動する。依存関係の処理などが終了して、対話型シェルが立ち上がったら、`runAll` を実行する。例として定義されているサービスと一緒に関連するミドルウェアも立ち上がる。緑の字で `(Services started, ...)` と表示されたらアプリケーションの起動完了だ。

```shell-session
$ cd hello
$ sbt
sbt:hello> runAll
...
[info] (Services started, press enter to stop and go back to the console...)
```

# アプリケーションを使用する

`/api/hello/:id` エンドポイントに GET リクエストすると挨拶 `Hello, {:id}!` が返ってくる。

```shell-session
$ curl -i -X GET 127.0.0.1:9000/api/hello/Alice
HTTP/1.1 200 OK
Date: Sat, 02 Feb 2019 07:30:43 GMT
Server: akka-http/10.0.15
Content-Type: text/plain
Content-Length: 13

Hello, Alice!
```

`/api/hello/:id` エンドポイントに JSON 付きで POST リクエストすると挨拶の `Hello` を指定したものに変更できる。ID に `Alice` を指定した場合は、ID が `Alice` のときのみ指定した挨拶が返ってくるようになる。

```shell-session
$ curl -i -X POST 127.0.0.1:9000/api/hello/Alice \
       -H 'Content-Type: application/json' \
       -d '{ "message": "Hi" }'
HTTP/1.1 200 OK
Date: Sat, 02 Feb 2019 07:31:23 GMT
Server: akka-http/10.0.15
Content-Length: 0
$ curl -i -X GET 127.0.0.1:9000/api/hello/Alice
HTTP/1.1 200 OK
Date: Sat, 02 Feb 2019 07:46:00 GMT
Server: akka-http/10.0.15
Content-Type: text/plain
Content-Length: 10

Hi, Alice!
$ curl -i -X GET 127.0.0.1:9000/api/hello/Bob
HTTP/1.1 200 OK
Date: Sat, 02 Feb 2019 07:48:23 GMT
Server: akka-http/10.0.15
Content-Type: text/plain
Content-Length: 11

Hello, Bob!
```

`/stream` エンドポイントに [wscat](https://github.com/websockets/wscat) を使用して接続すると挨拶を WebSocket で実行できる。

```shell-session
$ wscat -c 127.0.0.1:9000/stream
connected (press CTRL+C to quit)
> Alice
< Hi, Alice!
> Bob
< Hello, Bob!
>
```

# メッセージを確認する

`/api/hello/:id` エンドポイントへの POST リクエストが成功すると、ブローカー ([Kafka](https://kafka.apache.org/)) に向けて `greetings` トピックのメッセージが発行される。残念ながらサンプルコードに `greetings` トピックを購読しているサービスは含まれていないため、[kafkacat](https://github.com/edenhill/kafkacat) を使用してメッセージの発行を確認してみる。

`runAll` で一緒に起動する Kafka サーバーに kafkacat を使用して接続する。

```shell-session
$ kafkacat -b 127.0.0.1:9092 -t greetings
% Auto-selecting Consumer mode (use -P or -C to override)
% Reached end of topic greetings [0] at offset 0
```

kafkacat とは別のターミナルで `/api/hello/:id` エンドポイントに POST リクエストを送信する。

```shell-session
$ curl -i -X POST 127.0.0.1:9000/api/hello/Alice \
       -H 'Content-Type: application/json' \
       -d '{ "message": "Hi" }'
HTTP/1.1 200 OK
Date: Thu, 18 Jul 2019 15:12:59 GMT
Server: akka-http/10.1.8
Content-Length: 0
```

そうすると、kafkacat が下記のようにメッセージを出力する。

```shell-session
$ kafkacat -b 127.0.0.1:9092 -t greetings
% Auto-selecting Consumer mode (use -P or -C to override)
% Reached end of topic greetings [0] at offset 0
{"name":"Alice","message":"Hi"}
% Reached end of topic greetings [0] at offset 1
```

# アプリケーションを停止する

`runAll` を実行した sbt シェルで Enter を押下するとアプリケーションが停止する。

# Cassandra のデータベースを初期化する

指定した挨拶は開発用で起動する Cassandra に永続化される。`lagomCassandraCleanOnStart` セッティングキーを `true` に設定すると起動時に Cassandra のデータベースが初期化されるようになる。

```shell-session
$ sbt
sbt:hello> set lagomCassandraCleanOnStart in ThisBuild := true
sbt:hello> runAll
...
[info] (Services started, press enter to stop and go back to the console...)
```

# Kafka のログを初期化する

発行されたメッセージは開発用で起動する Kafka に永続化される。`lagomKafkaCleanOnStart` セッティングキーを `true` に設定すると起動時に Kafka のログ（メッセージ）が初期化されるようになる。

```shell-session
$ sbt
sbt:hello> set lagomKafkaCleanOnStart in ThisBuild := true
sbt:hello> runAll
...
[info] (Services started, press enter to stop and go back to the console...)
```

---

今回はマイクロサービスフレームワーク Lagom の新規アプリケーションを作成する方法について説明した。次回はこの新規アプリケーションに含まれるコードの詳細について説明したい。