Pengantar Bootique

1. Ikhtisar

Bootique adalah framework JVM open-source tanpa container yang sangat ringan yang bertujuan untuk membangun layanan mikro yang dapat diskalakan generasi berikutnya. Itu dibangun di atas server Jetty tertanam dan sepenuhnya mendukung penangan REST dengan jax-rs .

Pada artikel ini, kami akan menunjukkan cara membuat aplikasi web sederhana menggunakan Bootique .

2. Ketergantungan Maven

Mari mulai menggunakan Bootique dengan menambahkan dependensi berikut ke pom.xml:

 io.bootique.jersey bootique-jersey compile   io.bootique bootique-test test  

Namun, Bootique juga memerlukan deklarasi beberapa impor BOM ("Bill of Material") . Itulah mengapa mengikutibagian perlu ditambahkan di pom.xml:

   io.bootique.bom bootique-bom 0.23 pom import   

Versi terbaru dari Bootique tersedia di Central Maven Repository.

Untuk membuat jar yang dapat dijalankan, Bootique mengandalkan maven-shade-plugin. Itulah mengapa kita juga perlu menambahkan konfigurasi di bawah ini:

   org.apache.maven.plugins maven-shade-plugin   

3. Memulai Aplikasi

Cara paling mudah untuk memulai Bootique aplikasi yang untuk memohon Bootique 's exec () metode dari metode utama:

public class App { public static void main(String[] args) { Bootique.app(args) .autoLoadModules() .exec(); } }

Namun, ini tidak akan memulai server tertanam. Setelah kode di atas dijalankan, log berikut akan ditampilkan:

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.

Ini tidak lain adalah argumen program yang tersedia yang sudah dibundel sebelumnya dengan Bootique .

Nama-nama itu sudah cukup jelas; oleh karena itu, untuk memulai server kita perlu meneruskan argumen –s atau –server dan server akan aktif dan berjalan pada port default 8080 .

4. Modul

Aplikasi bootique dibuat dengan koleksi "modul". Dalam istilah Bootique , “Modul adalah pustaka Java yang berisi beberapa kode” yang berarti ia memperlakukan setiap layanan sebagai modul. Ini menggunakan Google Guice untuk Dependency Injection.

Untuk melihat cara kerjanya, mari buat satu antarmuka:

public interface HelloService { boolean save(); }

Sekarang, kita perlu membuat implementasi:

public class HelloServiceImpl implements HelloService { @Override public boolean save() { return true; } }

Ada dua cara untuk memuat modul. Yang pertama adalah menggunakan antarmuka Guice 's Module , dan yang lainnya adalah dengan menggunakan BQModuleProvider milik Bootique yang juga dikenal sebagai auto-loading .

4.1. Modul Guice

Di sini, kita bisa menggunakan Guice 's Modul antarmuka untuk kasus mengikat:

public class ModuleBinder implements Module { @Override public void configure(Binder binder) { binder .bind(HelloService.class) .to(HelloServiceImpl.class); } }

Setelah modul ditentukan, kita perlu memetakan modul kustom ini ke instance Bootique :

Bootique .app(args) .module(module) .module(ModuleBinder.class) .autoLoadModules() .exec();

4.2. BQModuleProvider (pemuatan otomatis)

Di sini, yang perlu kita lakukan adalah menentukan pengikat modul yang dibuat sebelumnya dengan BQModuleProvider :

public class ModuleProvider implements BQModuleProvider { @Override public Module module() { return new ModuleBinder(); } }

Keuntungan dari teknik ini adalah kita tidak perlu memetakan informasi modul apa pun dengan instance Bootique .

Kita hanya perlu membuat file di /resources/META-INF/services/io.bootique.BQModuleProvider dan tulis nama lengkap ModuleProvider termasuk nama paket dan Bootique akan mengurus sisanya:

com.baeldung.bootique.module.ModuleProvider

Sekarang, kita dapat menggunakan anotasi @Inject untuk menggunakan instance layanan pada waktu proses:

@Inject HelloService helloService;

Satu hal penting untuk diperhatikan di sini adalah karena kita menggunakan mekanisme DI Bootique sendiri, kita tidak perlu menggunakan anotasi Guice @ImplementedBy untuk mengikat contoh layanan.

5. REST Endpoint

Sangat mudah untuk membuat titik akhir REST menggunakan JAX-RS API:

@Path("/") public class IndexController { @GET public String index() { return "Hello, baeldung!"; } @POST public String save() { return "Data Saved!"; } }

Untuk memetakan titik akhir ke dalam contoh Jersey milik Bootique , kita perlu mendefinisikan JerseyModule :

Module module = binder -> JerseyModule .extend(binder) .addResource(IndexController.class);

6. Konfigurasi

Kami dapat memberikan informasi konfigurasi inbuilt atau kustom dalam file properti berbasis YAML.

Misalnya, jika kita ingin memulai aplikasi pada port khusus dan menambahkan konteks URI default 'hello', kita dapat menggunakan konfigurasi YAML berikut:

jetty: context: /hello connector: port: 10001

Sekarang, saat memulai aplikasi, kita perlu menyediakan lokasi file ini di parameter config:

--config=/home/baeldung/bootique/config.yml

7. Penebangan

Bootique out-of-the-box hadir dengan modul bootique-logback . Untuk menggunakan modul ini, kita perlu menambahkan dependensi berikut di pom.xml :

 io.bootique.logback bootique-logback 

This module comes with a BootLogger interface with we can override to implement custom logging:

Bootique.app(args) .module(module) .module(ModuleBinder.class) .bootLogger( new BootLogger() { @Override public void trace( Supplier args ) { // ... } @Override public void stdout( String args ) { // ... } @Override public void stderr( String args, Throwable thw ) { // ... } @Override public void stderr( String args ) { // ... } }).autoLoadModules().exec();

Also, we can define logging configuration information in the config.yaml file:

log: level: warn appenders: - type: file logFormat: '%c{20}: %m%n' file: /path/to/logging/dir/logger.log

8. Testing

For testing, Bootique comes with the bootique-test module. There are two ways by which we can test a Bootique application.

The first approach is ‘foreground' approach which makes all test-cases run on the main test thread.

The other one is ‘background' approach which makes the test-cases run on an isolated thread pool.

The ‘foreground' environment can be initialized using BQTestFactory:

@Rule public BQTestFactory bqTestFactory = new BQTestFactory();

Lingkungan 'latar belakang' dapat diinisialisasi menggunakan BQDaemonTestFactory :

@Rule public BQDaemonTestFactory bqDaemonTestFactory = new BQDaemonTestFactory();

Setelah pabrik lingkungan siap, kami dapat menulis kasus uji sederhana untuk menguji layanan:

@Test public void givenService_expectBoolen() { BQRuntime runtime = bqTestFactory .app("--server").autoLoadModules() .createRuntime(); HelloService service = runtime.getInstance( HelloService.class ); assertEquals( true, service.save() ); }

9. Kesimpulan

Pada artikel ini, kami menunjukkan cara membuat aplikasi menggunakan modul inti Bootique . Ada beberapa modul Bootique lain yang tersedia seperti bootique-jooq , bootique-kotlin , bootique-job , dll. Daftar lengkap modul yang tersedia tersedia di sini.

Seperti biasa, kode sumber lengkap tersedia di GitHub.