Въведение в Bootique

1. Общ преглед

Bootique е много лека JVM рамка без контейнери с отворен код , насочена към изграждане на мащабируеми микро услуги от следващо поколение. Той е изграден върху вградения Jetty сървър и напълно поддържа REST манипулатори с jax-rs .

В тази статия ще покажем как да създадете просто уеб приложение с помощта на Bootique .

2. Зависимости на Maven

Нека започнем да използваме Bootique, като добавим следната зависимост в pom.xml:

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

Въпреки това, Bootique също изисква деклариране на някои BOM ( "Бил на Материал") внос. Ето защо следванетосекция трябва да се добави в pom.xml:

   io.bootique.bom bootique-bom 0.23 pom import   

Най-новата версия на Bootique е достъпна в Централното хранилище на Maven.

За да изгради работещ буркан, Bootique разчита на плъгин maven-shadow . Ето защо трябва да добавим и конфигурация по-долу:

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

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 .

Имената са разбираеми; следователно, за да стартираме сървъра, трябва да предадем аргумент –s или –server и сървърът ще работи и работи на порта по подразбиране 8080 .

4. Модули

Бутиковите приложения се правят с колекции от „модули“. В термина на BootiqueМодулът е Java библиотека, която съдържа някакъв код“, което означава, че третира всяка услуга като модул. Той използва Google Guice за инжектиране на зависимост.

За да видим как работи, нека създадем един интерфейс:

public interface HelloService { boolean save(); }

Сега трябва да създадем изпълнение:

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

Има два начина, по които можем да заредим модула. Първият от тях е да се използва Guice е модул интерфейс, а другият е чрез използването на Bootique е BQModuleProvider който е известен също като автоматично зареждане .

4.1. Модул Guice

Тук можем да използваме Guice е модул интерфейс за свързване случаи:

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 и да напишем пълното име на ModuleProvider, включително името на пакета, а Bootique ще се погрижи за останалото:

com.baeldung.bootique.module.ModuleProvider

Сега можем да използваме @Inject анотация, за да използваме екземплярите на услугата по време на изпълнение:

@Inject HelloService helloService;

Тук е важно да се отбележи, че тъй като използваме собствения DI механизъм на Bootique , не е нужно да използваме анотация Guice @ImplementedBy за обвързване на екземплярите на услугата.

5. Останала крайна точка

Лесно е да създавате REST крайни точки, използвайки JAX-RS API:

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

За да картографираме крайните точки в собствения екземпляр на Jersey на Bootique , трябва да дефинираме JerseyModule :

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

6. Конфигурация

Можем да предоставим вградена или персонализирана информация за конфигурация в YAML-базиран файл за свойства.

Например, ако искаме да стартираме приложението на персонализиран порт и да добавим URI контекст по подразбиране „здравей“, можем да използваме следната YAML конфигурация:

jetty: context: /hello connector: port: 10001

Сега, докато стартираме приложението, трябва да предоставим местоположението на този файл в конфигурационния параметър:

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

7. Регистрация

Out-на-на-кутия Bootique идва с bootique-logback модул. За да използваме този модул, трябва да добавим следната зависимост в 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();

Средата „фон“ може да бъде инициализирана с помощта на 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 като bootique-jooq , bootique-kotlin , bootique-job и др. Пълният списък с наличните модули е наличен тук.

Както винаги, пълният изходен код е достъпен в GitHub.