Lagomとは?
LagomはLightbend社(旧Typesafe社)がリリースした新しいマイクロサービス向けのフレームワークです。
元々Scalaの開発元であったLightbend社が開発しているだけあり、PlayやAkka、sbtといったScalaベースの技術基盤上に構築されていますが、現時点ではJava向けのAPIのみ提供されているJava用のフレームワークとなります。*1
これまでもSpring Bootなど手軽に使えるAPIサーバ向けのWebフレームワークは存在したわけですが、Lagomは最初からリアクティブなマイクロサービスの構築を前提に設計されており、いわば「マイクロサービスネイティブ」とも呼ぶべきフレームワークになっています。
実際にLagomを使うかどうかはさておき、新しいコンセプトのフレームワークなので学ぶことも多いのではないかと思うのですが、自分もまだきちんと把握できないないのでLagomのドキュメントを見つつ、実際にコードを書いていくことでLagomそのものや、Lagomが目指す世界観について理解を深めていきたいと思います。
ちなみにLagomとはスウェーデン語で「ちょうどいい量」という意味だそうです。マイクロサービスにおいて、サービスをただ単に小さく分割するのではなく、要件に応じた正しいサイズに分割することにフォーカスするという意図が込められているようです。
Lagomのセットアップ
Lagomのドキュメントにはactivatorを使用してサンプルプロジェクトを生成する方法が紹介されています。すでにactivatorがインストールされている環境であれば以下のコマンドでLagomのサンプルプロジェクトを生成することができます。
$ activator new my-first-system lagom-java
このサンプルプロジェクトはマルチプロジェクトになっています。Lagomでは基本的にサービスという単位でアプリケーションを作っていくのですが、xxxx-apiというプロジェクトにサービスの定義、xxxx-implというプロジェクトに実装を配置するのが基本形のようです。
以下のようにしてプロジェクトを起動することができます。
$ cd my-first-system $ ./activator ... > runAll
動作確認してみます。
$ curl http://localhost:9000/api/hello/World
Hello, World!
Lagomで簡単なサービスを実装してみる
生成したサンプルプロジェクトは永続化なども含むサンプルなのでやや複雑です。まずはドキュメントを参考に簡単なサービスを作ってみます。
helloworld-apiプロジェクトのHelloService.java
をこんな感じに編集します。
package sample.helloworld.api; import akka.NotUsed; import com.lightbend.lagom.javadsl.api.*; import com.lightbend.lagom.javadsl.api.transport.Method; import static com.lightbend.lagom.javadsl.api.Service.*; public interface HelloService extends Service { ServiceCall<String, NotUsed, String> hello(); @Override default Descriptor descriptor() { // @formatter:off return named("helloservice").with( restCall(Method.GET, "/api/hello/:id", hello()) ).withAutoAcl(true); // @formatter:on } }
続いてこのサービスの実装である、helloworld-implプロジェクトのHelloServiceImpl.java
を以下のように編集します。
package sample.helloworld.impl; import akka.NotUsed; import com.lightbend.lagom.javadsl.api.ServiceCall; import sample.helloworld.api.HelloService; import static java.util.concurrent.CompletableFuture.completedFuture; public class HelloServiceImpl implements HelloService { @Override public ServiceCall<String, NotUsed, String> hello() { return (id, request) -> completedFuture("Hello, " + id + "!"); } }
LagomはrunAll
で起動しておくと、ソースを編集して保存したタイミングで自動的に再ビルドを行ってくれるみたいです。先ほどと同じcurlコマンドで動作確認ができます。
$ curl http://localhost:9000/api/hello/World
Hello, World!
HTTPで呼び出せる簡単なサービスが実装できました。これだけではまだ嬉しくもなんともない感じですが、長くなってしまったのでとりあえず今回はここまでにしておきます。今後も時間を見つけて少しずつ進めていきたいと思います。