リアクティブなマイクロサービスフレームワーク「Lagom」を試してみる

Lagomとは?

LagomはLightbend社(旧Typesafe社)がリリースした新しいマイクロサービス向けのフレームワークです。

www.lightbend.com

元々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で呼び出せる簡単なサービスが実装できました。これだけではまだ嬉しくもなんともない感じですが、長くなってしまったのでとりあえず今回はここまでにしておきます。今後も時間を見つけて少しずつ進めていきたいと思います。

*1:今後Scala向けのAPIも提供予定とのことです。実際LagomのコードをJavaで書くのはかなり厳しい感じがあるのでScala向けのAPIも早期の提供を期待したいところです。