Bootiqueの紹介
1. 概要
Bootique は、次世代のスケーラブルなマイクロサービスを構築することを目的とした、非常に軽量なオープンソースのコンテナーレスJVMフレームワークです。 組み込みのJettyサーバー上に構築され、jax-rsでRESTハンドラーを完全にサポートします。
この記事では、Bootiqueを使用して簡単なWebアプリケーションを構築する方法を紹介します。
2. Mavenの依存関係
pom.xmlに次の依存関係を追加して、 Bootique の使用を開始しましょう:
<dependency>
<groupId>io.bootique.jersey</groupId>
<artifactId>bootique-jersey</artifactId>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>io.bootique</groupId>
<artifactId>bootique-test</artifactId>
<scope>test</scope>
</dependency>
ただし、 Bootique では、いくつかの BOM(「部品表」)インポートを宣言する必要もあります。 だから次の
<dependencyManagement>
<dependencies>
<dependency>
<groupId>io.bootique.bom</groupId>
<artifactId>bootique-bom</artifactId>
<version>0.23</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
Bootique の最新バージョンは、 Central MavenRepositoryで入手できます。
実行可能なjarを構築するために、Bootiqueはmaven-shade-pluginに依存しています。 そのため、以下の構成も追加する必要があります。
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
</plugin>
</plugins>
</build>
3. アプリケーションの開始
Bootique アプリケーションを起動する最も簡単な方法は、メインメソッドから Bootiqueのexec()メソッドを呼び出すことです。
public class App {
public static void main(String[] args) {
Bootique.app(args)
.autoLoadModules()
.exec();
}
}
ただし、組み込みサーバーは起動しません。上記のコードを実行すると、次のログが表示されます。
NAME
com.baeldung.bootique.App
OPTIONS
-c yaml_location, --config=yaml_location
Specifies YAML config location, which can be a file path
or a URL.
-h, --help
Prints this message.
-H, --help-config
Prints information about application modules and their
configuration options.
-s, --server
Starts Jetty server.
これらは、Bootiqueにあらかじめバンドルされている利用可能なプログラム引数に他なりません。
名前は一目瞭然です。 したがって、サーバーを起動するには、
4. モジュール
Bootique アプリケーションは、「モジュール」のコレクションで作成されます。 Bootique の用語では、「モジュールはコードを含むJavaライブラリです」は、すべてのサービスをモジュールとして扱うことを意味します。 依存性注入にはGoogleGuiceを使用します。
それがどのように機能するかを確認するために、1つのインターフェースを作成しましょう。
public interface HelloService {
boolean save();
}
次に、実装を作成する必要があります。
public class HelloServiceImpl implements HelloService {
@Override
public boolean save() {
return true;
}
}
モジュールをロードする方法は2つあります。 1つはGuiceのModuleインターフェースを使用する方法で、もう1つはBootiqueのBQModuleProviderを使用する方法です。 自動読み込みとして知られています。
4.1. Guiceモジュール
ここでは、GuiceのModuleインターフェースを使用してインスタンスをバインドできます。
public class ModuleBinder implements Module {
@Override
public void configure(Binder binder) {
binder
.bind(HelloService.class)
.to(HelloServiceImpl.class);
}
}
モジュールを定義したら、このカスタムモジュールをBootiqueインスタンスにマップする必要があります。
Bootique
.app(args)
.module(module)
.module(ModuleBinder.class)
.autoLoadModules()
.exec();
4.2. BQModuleProvider (自動読み込み)
ここで行う必要があるのは、BQModuleProviderを使用して以前に作成したモジュールバインダーを定義することだけです。
public class ModuleProvider implements BQModuleProvider {
@Override
public Module module() {
return new ModuleBinder();
}
}
この手法の利点は、モジュール情報をBootiqueインスタンスにマップする必要がないことです。
/resources/META-INF/services/io.bootique.BQModuleProvider にファイルを作成し、パッケージ名とBootiqueを含むModuleProviderのフルネームを書き込む必要があります。 が残りを処理します:
com.baeldung.bootique.module.ModuleProvider
これで、 @Inject アノテーションを使用して、実行時にサービスインスタンスを使用できます。
@Inject
HelloService helloService;
ここで注意すべき重要な点の1つは、 Bootique 独自のDIメカニズムを使用しているため、サービスインスタンスをバインドするために Guice@ImplementedByアノテーションを使用する必要がないことです。
5. RESTエンドポイント
JAX-RSAPIを使用してRESTエンドポイントを作成するのは簡単です。
@Path("/")
public class IndexController {
@GET
public String index() {
return "Hello, baeldung!";
}
@POST
public String save() {
return "Data Saved!";
}
}
エンドポイントをBootique独自のJerseyインスタンスにマップするには、JerseyModuleを定義する必要があります。
Module module = binder -> JerseyModule
.extend(binder)
.addResource(IndexController.class);
6. 構成
YAMLベースのプロパティファイルで組み込みまたはカスタムの構成情報を提供できます。
たとえば、カスタムポートでアプリケーションを起動し、デフォルトのURIコンテキスト「hello」を追加する場合は、次のYAML構成を使用できます。
jetty:
context: /hello
connector:
port: 10001
ここで、アプリケーションの起動時に、configパラメーターでこのファイルの場所を指定する必要があります。
--config=/home/baeldung/bootique/config.yml
7. ロギング
すぐに使用できるBootiqueには、bootique-logbackモジュールが付属しています。 このモジュールを使用するには、pom.xmlに次の依存関係を追加する必要があります。
<dependency>
<groupId>io.bootique.logback</groupId>
<artifactId>bootique-logback</artifactId>
</dependency>
このモジュールにはBootLoggerインターフェースが付属しており、オーバーライドしてカスタムロギングを実装できます。
Bootique.app(args)
.module(module)
.module(ModuleBinder.class)
.bootLogger( new BootLogger() {
@Override
public void trace( Supplier<String> args ) {
// ...
}
@Override
public void stdout( String args ) {
// ...
}
@Override
public void stderr( String args, Throwable thw ) {
// ...
}
@Override
public void stderr( String args ) {
// ...
}
}).autoLoadModules().exec();
また、config.yamlファイルでロギング構成情報を定義できます。
log:
level: warn
appenders:
- type: file
logFormat: '%c{20}: %m%n'
file: /path/to/logging/dir/logger.log
8. テスト
テスト用に、Bootiqueにはbootique-testモジュールが付属しています。 Bootiqueアプリケーションをテストする方法は2つあります。
最初のアプローチは‘foreground’アプローチで、すべてのテストケースをメインのテストスレッドで実行します。
もう1つは、‘background’ アプローチで、テストケースを分離されたスレッドプールで実行します。
「フォアグラウンド」環境は、BQTestFactoryを使用して初期化できます。
@Rule
public BQTestFactory bqTestFactory = new BQTestFactory();
「バックグラウンド」環境は、BQDaemonTestFactoryを使用して初期化できます。
@Rule
public BQDaemonTestFactory bqDaemonTestFactory = new BQDaemonTestFactory();
環境ファクトリの準備ができたら、サービスをテストするための簡単なテストケースを作成できます。
@Test
public void givenService_expectBoolen() {
BQRuntime runtime = bqTestFactory
.app("--server").autoLoadModules()
.createRuntime();
HelloService service = runtime.getInstance( HelloService.class );
assertEquals( true, service.save() );
}
9. 結論
この記事では、Bootiqueのコアモジュールを使用してアプリケーションを構築する方法を示しました。 bootique-jooq 、 bootique-kotlin 、 bootique-job など、他にもいくつかのBootiqueモジュールを利用できます。 利用可能なモジュールの完全なリストは、こちらで入手できます。
いつものように、完全なソースコードはGitHubで利用できます。