Перейти к основному содержимому

Введение в Dropwizard

· 5 мин. чтения

1. Обзор

Dropwizard — это среда Java с открытым исходным кодом, используемая для быстрой разработки высокопроизводительных веб-сервисов RESTful . Он собирает некоторые популярные библиотеки для создания облегченного пакета. Основными библиотеками, которые он использует, являются Jetty, Jersey, Jackson, JUnit и Guava. Кроме того, он использует собственную библиотеку под названием Metrics .

В этом руководстве мы узнаем, как настроить и запустить простое приложение Dropwizard. Когда мы закончим, наше приложение предоставит RESTful API, который позволит нам получить список сохраненных брендов.

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

Во-первых, зависимость dropwizard-core — это все, что нам нужно для создания нашего сервиса. Давайте добавим его в наш pom.xml :

<dependency>
<groupId>io.dropwizard</groupId>
<artifactId>dropwizard-core</artifactId>
<version>2.0.0</version>
</dependency>

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

Теперь мы создадим необходимые классы, необходимые для запуска каждого приложения Dropwizard.

Приложения Dropwizard хранят свойства в файлах YML. Поэтому мы создадим файл Introduction-config.yml в каталоге ресурсов:

defaultSize: 5

Мы можем получить доступ к значениям в этом файле, создав класс, расширяющий io.dropwizard.Configuration :

public class BasicConfiguration extends Configuration {
@NotNull private final int defaultSize;

@JsonCreator
public BasicConfiguration(@JsonProperty("defaultSize") int defaultSize) {
this.defaultSize = defaultSize;
}

public int getDefaultSize() {
return defaultSize;
}
}

Dropwizard использует Jackson для десериализации конфигурационного файла в наш класс . Следовательно, мы использовали аннотации Джексона.

Далее создадим основной класс приложения, который отвечает за подготовку нашего сервиса к использованию:

public class IntroductionApplication extends Application<BasicConfiguration> {

public static void main(String[] args) throws Exception {
new IntroductionApplication().run("server", "introduction-config.yml");
}

@Override
public void run(BasicConfiguration basicConfiguration, Environment environment) {
//register classes
}

@Override
public void initialize(Bootstrap<BasicConfiguration> bootstrap) {
bootstrap.setConfigurationSourceProvider(new ResourceConfigurationSourceProvider());
super.initialize(bootstrap);
}
}

Во-первых, метод main отвечает за запуск приложения. Мы можем либо передать аргументы методу run , либо заполнить его самостоятельно.

Первым аргументом может быть либо сервер, либо проверка . Опция проверки проверяет конфигурацию, а опция сервера запускает приложение. Второй аргумент — это расположение файла конфигурации.

Кроме того, метод initialize устанавливает поставщика конфигурации в ResourceConfigurationSourceProvider , что позволяет приложению найти заданный файл конфигурации в каталоге ресурсов. Этот метод не обязательно переопределять.

Наконец, метод run позволяет нам получить доступ как к Environment , так и к BaseConfiguration , которые мы будем использовать позже в этой статье.

4. Ресурс

Во-первых, давайте создадим класс домена для нашего бренда:

public class Brand {
private final Long id;
private final String name;

// all args constructor and getters
}

Во-вторых, давайте создадим класс BrandRepository , который будет отвечать за возврат брендов:

public class BrandRepository {
private final List<Brand> brands;

public BrandRepository(List<Brand> brands) {
this.brands = ImmutableList.copyOf(brands);
}

public List<Brand> findAll(int size) {
return brands.stream()
.limit(size)
.collect(Collectors.toList());
}

public Optional<Brand> findById(Long id) {
return brands.stream()
.filter(brand -> brand.getId().equals(id))
.findFirst();
}
}

Кроме того, мы смогли использовать ImmutableList из Guava , поскольку он является частью самого Dropwizard.

В- третьих, мы создадим класс BrandResource . Dropwizard по умолчанию использует JAX-RS с реализацией Jersey . Поэтому мы будем использовать аннотации из этой спецификации, чтобы раскрыть конечные точки нашего REST API:

@Path("/brands")
@Produces(MediaType.APPLICATION_JSON)
public class BrandResource {
private final int defaultSize;
private final BrandRepository brandRepository;

public BrandResource(int defaultSize, BrandRepository brandRepository) {
this.defaultSize = defaultSize;
this.brandRepository = brandRepository;
}

@GET
public List<Brand> getBrands(@QueryParam("size") Optional<Integer> size) {
return brandRepository.findAll(size.orElse(defaultSize));
}

@GET
@Path("/{id}")
public Brand getById(@PathParam("id") Long id) {
return brandRepository
.findById(id)
.orElseThrow(RuntimeException::new);
}
}

Кроме того, мы определили размер как необязательный , чтобы использовать defaultSize из нашей конфигурации, если аргумент не указан.

Наконец, мы зарегистрируем BrandResource в классе IntroductionApplicaton . Для этого реализуем метод run :

@Override
public void run(BasicConfiguration basicConfiguration, Environment environment) {
int defaultSize = basicConfiguration.getDefaultSize();
BrandRepository brandRepository = new BrandRepository(initBrands());
BrandResource brandResource = new BrandResource(defaultSize, brandRepository);

environment
.jersey()
.register(brandResource);
}

Все создаваемые ресурсы должны быть зарегистрированы в этом методе.

5. Запуск приложения

В этом разделе мы узнаем, как запустить приложение из командной строки.

Во- первых, мы настроим наш проект для создания JAR-файла с помощью maven-shade-plugin :

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<configuration>
<createDependencyReducedPom>true</createDependencyReducedPom>
<filters>
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
</filters>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer
implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.foreach.dropwizard.introduction.IntroductionApplication</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>

Это рекомендуемая конфигурация плагина. Кроме того, мы включили путь к нашему основному классу в элемент <mainClass> .

Наконец, мы создадим приложение с помощью Maven . Получив JAR-файл, мы можем запустить приложение:

java -jar target/dropwizard-0.0.1-SNAPSHOT.jar

Нет необходимости передавать параметры, поскольку мы уже включили их в класс IntroductionApplication .

После этого лог консоли должен заканчиваться:

INFO  [2020-01-08 18:55:06,527] org.eclipse.jetty.server.Server: Started @1672ms

Теперь приложение прослушивает порт 8080, и мы можем получить доступ к конечной точке нашего бренда по адресу http://localhost:8080/brands .

6. Проверка здоровья

При запуске приложения нам сообщили, что приложение не имеет проверок работоспособности. К счастью, Dropwizard предоставляет простое решение для добавления проверок работоспособности в наше приложение .

Начнем с добавления простого класса, расширяющего com.codahale.metrics.health.HealthCheck :

public class ApplicationHealthCheck extends HealthCheck {
@Override
protected Result check() throws Exception {
return Result.healthy();
}
}

Этот простой метод вернет информацию о работоспособности нашего компонента. Мы могли бы создать несколько проверок работоспособности, и некоторые из них могли бы дать сбой в определенных ситуациях. Например, мы бы вернули Result.unhealthy() , если соединение с базой данных не удалось.

Наконец, нам нужно зарегистрировать нашу проверку работоспособности в методе run нашего класса IntroductionApplication :

environment
.healthChecks()
.register("application", new ApplicationHealthCheck());

После запуска приложения мы можем проверить ответ проверки работоспособности по адресу http://localhost:8081/healthcheck :

{
"application": {
"healthy": true,
"duration": 0
},
"deadlocks": {
"healthy": true,
"duration": 0
}
}

Как мы видим, наша проверка здоровья была зарегистрирована под тегом приложения .

7. Заключение

В этой статье мы узнали, как настроить приложение Dropwizard с помощью Maven.

Мы обнаружили, что базовая установка приложения очень проста и быстра. Кроме того, Dropwizard включает в себя все библиотеки, необходимые для запуска высокопроизводительного веб-сервиса RESTful.

Как всегда, код этих примеров доступен на GitHub .