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 Listbrands; 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 ListgetBrands(@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 .