Рубрики
Без рубрики

Введение в Dropwizard

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

Автор оригинала: Łukasz Ryś.

1. Обзор

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

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

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

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


    io.dropwizard
    dropwizard-core
    2.0.0

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 {

    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 bootstrap) {
        bootstrap.setConfigurationSourceProvider(new ResourceConfigurationSourceProvider());
        super.initialize(bootstrap);
    }
}

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

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

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

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

4. Ресурс

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

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

    // all args constructor and getters
}

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

public class BrandRepository {
    private final List brands;

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

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

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

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

В-третьих, мы создадим Ресурс бренда класс. Dropwizard использует JAX-RS по умолчанию с Джерси в качестве реализации . Поэтому мы будем использовать аннотации из этой спецификации для представления наших конечных точек 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 getBrands(@QueryParam("size") Optional size) {
        return brandRepository.findAll(size.orElse(defaultSize));
    }

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

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

Наконец, мы зарегистрируем Ресурс бренда в приложении Введение класс. Для этого давайте реализуем метод 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 :


    org.apache.maven.plugins
    maven-shade-plugin
    
        true
        
            
                *:*
                
                    META-INF/*.SF
                    META-INF/*.DSA
                    META-INF/*.RSA
                
            
        
    
    
        
            package
            
                shade
            
            
                
                    
                    
                        com.baeldung.dropwizard.introduction.IntroductionApplication
                    
                
            
        
    

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

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

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

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

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

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.Проверка здоровья :

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

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

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

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

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

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

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

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

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

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

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