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 .