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

Приложение для записи журналов с MongoDB + Spring Boot + пользовательский интерфейс Swagger

В этой статье мы рассмотрим приложение для записи журналов, использующее следующие технологии: MongoDB Java +… Помечен тегами mongodb, swagger, springboot, java.

Учебные пособия по NoSQL (Серия из 4 частей)

В этой статье мы рассмотрим приложение для записи журналов , использующее следующие технологии:

  • MongoDB
  • Java + Весенняя загрузка
  • Развязный пользовательский интерфейс

Это демонстрационное приложение демонстрирует способность MongoDB хранить данные без схемы . Все записи журнала могут содержать произвольные поля, и мы можем искать журналы по этим произвольным полям. Чтобы приложение было легко тестировать, мы визуализируем его REST API с помощью пользовательского интерфейса Swagger.

В этой статье мы создадим приложение, которое собирает данные журнала из сторонних приложений. Главная проблема здесь: мы не знаем, как выглядят данные журнала из этих сторонних приложений . Тем не менее, мы хотим хранить данные в компактном формате, плюс мы хотим поддерживать запросы к этим данным журнала.

Давайте рассмотрим конкретный пример. Вот два образца журналов, которые мы хотим сохранить в формате JSON:

У нас есть один микросервис ПЛАТЕЖ который создает журналы во время процесса оплаты. С правой стороны у нас есть журнал из другого приложения под названием ВХОД . Некоторые поля журнала являются общими, например серьезность , но некоторые уникальны для приложения, такого как поставщик кредитных карт , которое существует только в платежном приложении.

Подход SQL

Если бы мы хотели хранить эти данные в хранилище SQL , нам было бы трудно найти правильное решение. Либо мы создадим огромную таблицу, в которой будет столбец для каждого поля журнала, которое мы когда-либо видели. Но это привело бы ко множеству нулевых записей, и мы бы потратили впустую память. Другое решение – хранить все данные в формате JSON, чтобы в таблице было только две строки: первичный ключ и документ JSON. Однако с помощью этого решения вы не сможете быстро выполнять поиск по полям JSON.

Подход NoSQL

Хранилища документов NoSQL приходят нам на помощь: они хранят данные в формате JSON без какой-либо схемы исправления. По сути, хранилище документов содержит документы JSON – и ничего больше. Даже идентификатор данного документа содержится в самом JSON.

Теперь мы можем выполнять действительно быстрые запросы с помощью поля JSON, так что вы можете сделать что-то вроде этого:

> db.logEvents.find({_appType:"PAYMENT"})

Это вернет первый журнал выше. Что еще более интересно, вы можете выполнить следующий запрос:

> db.logEvents.find({creditCardProvider:"VISA"})

Хранилище документов устойчиво к тому факту, что не каждый журнал содержит поле поставщик кредитных карт !

Хватит разговоров – давайте приступим к внедрению нашего приложения!

Мы используем MongoCollection с официального MongoDB Драйвер Java для доступа к БД. Давайте продолжим и создадим компонент с правильно настроенной коллекцией MongoCollection:

@Configuration
public class MongoConfiguration {
  @Bean
  public MongoCollection getMongoCollection() {
    MongoClient mongoClient = MongoClients.create();
    MongoDatabase db = mongoClient.getDatabase("mydb");
    return db.getCollection("logEvents");
  }
}

Давайте используем вышеописанный компонент для поиска записей в MongoDB с помощью идентификатор :

public class MongoDbService {
  @Autowired
  MongoCollection collection;

  public Optional findById(String id) {
    Document doc = collection.find(eq("_id", new ObjectId(id))).first();
    return Optional.ofNullable(doc);
  }
}

Используя аннотацию @Autowired , мы можем ввести наш компонент типа Монгоколлекция . Этот класс предлагает множество возможностей запроса, таких как поиск по идентификатору, по паре ключ-значение и даже более сложные запросы, такие как больше, чем и т. Д. В моем репозитории Github вы можете увидеть другие примеры запросов.

Еще одно примечание: все данные БД представлены в виде Документов , которые описаны в официальной документации следующим образом:

Класс Document может представлять динамически структурированные документы любой сложности… Документ реализует карту<Строка, Объект>

В нашем приложении для ведения журнала мы не хотим использовать документы, а вместо этого используем пользовательский POJO:

import lombok.Data;
@Data
public final class LogEvent {
  private Map logEvent;
}

Мы представляем каждую запись в журнале в виде карты с строковыми ключами и значениями.

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

Наш уровень базы данных представляет журналы в виде Документа , но наш уровень обслуживания использует Событие входа в систему . Поэтому нам нужен метод сопоставления:

public LogEvent toLog(Document document) {
  Map map = new HashMap<>();
  document.forEach((key, val) -> map.put(key, val.toString()));
  return new LogEvent(map);
}

Теперь пришло время создать слой контроллера. Мы будем использовать контроллеры REST, которые можно легко создать с помощью аннотации Spring Boot @RequestMapping :

@RequestMapping(method = RequestMethod.GET, path = "/api/log/{id}")
public ResponseEntity getLogById(
    @PathVariable(value = "id") String id) {
  return mongoDbService.findById(id)
      .map(documentToLogMapper::toLog)
      .map(ResponseEntity::ok)
      .orElse(ResponseEntity.notFound().build());
}

Все, что мы закодировали до сих пор, теперь собрано вместе! 😎 Итак, давайте пройдемся по приведенному выше фрагменту кода шаг за шагом! Во-первых, ваш контроллер REST будет обслуживать HTTP-запросы GET по URL-адресу “api/log/{id}”, i d – идентификатор события журнала. Во-вторых, вызов REST вернет Событие входа в формате JSON. В-третьих, мы используем функциональное программирование в теле метода. Мы начинаем с запроса к БД, передаем результат нашему картографу и, наконец, проверяем, все ли прошло нормально, а если нет: возвращаем результат 404 NOT_FOUND.

Не хватает только одного, чтобы сделать наше приложение исполняемым:

@SpringBootApplication
public class LogCaptureApp {
  public static void main(String[] args) {
    new SpringApplication(LogCaptureApp.class).run();
  }
}

Вот и все, это весь необходимый код 😊 Теперь ваше приложение для ведения журнала может обслуживать запросы REST для чтения журналов!

Еще одна вещь – давайте добавим простой графический интерфейс в наше приложение для записи журналов. Для этой цели мы используем Swagger UI . Пользовательский интерфейс Swagger позволяет визуализировать ваш API без какой-либо дополнительной суеты. Все, что вам нужно, это настроить Swagger:

@Configuration
@EnableSwagger2
public class SwaggerUIConfiguration {
  @Bean
  public Docket apiDocu() {
    return new Docket(DocumentationType.SWAGGER_2)
        .apiInfo(apiInfo())
        .select()
        .apis(RequestHandlerSelectors.basePackage("com.example.controller"))
        .paths(PathSelectors.any())
        .build();
  }
  private ApiInfo apiInfo() {
    return new ApiInfoBuilder()
        .title("Log capturing app with MongoDB + SpringBoot")
        .build();
  }
}

Полный код можно найти на Github:

я сам/mongodb-приложение для ведения журнала

Демонстрационное приложение для MongoDB: управление событиями журнала различного типа схемы

Мое репозиторий Github содержит больше функций, чем то, что мы видели в этой истории, например, поиск событий журнала по диапазону дат и хранение событий журнала из данных JSON.

Итак, если вы внедрили приложение журнала, когда читали эту историю, продолжайте и запустите его сейчас. Если нет, то нет проблем, вы можете использовать мой полностью рабочий пример с Github.

Кроме того, убедитесь, что у вас есть сервер MongoDB, работающий локально на стандартном порту. Затем скомпилируйте и запустите приложение:

$ git clone https://github.com/pmgysel/mongodb-logging-app.git
$ cd mongodb-logging-app
$ mvn clean package
$ java -jar target/mongodb-logging-app-0.0.1-SNAPSHOT.jar

Перейдите на страницу пользовательского интерфейса Swagger в вашем любимом веб-браузере: http://localhost:8080/swagger-ui.html

Вы можете использовать приложение для записи журналов следующим образом:

  • Создательградом : Создавайте случайные записи в журнале, чтобы получить некоторые данные в БД
  • В качестве альтернативы создайте произвольные записи в журнале, используя конечную точку создать журнал . Пользовательский интерфейс Swagger покажет образец запроса, чтобы облегчить вашу жизнь 😊
  • Теперь ищите журналы по паре ключ-значение ( getLogByOneField ) или по диапазону дат ( получить журнал по диапазону дат )
  • Поиск образцов:

Итак, в этой истории мы создали полностью работающее приложение для записи журналов на Java. Поскольку наши требования заключались в поддержке гибких записей в журнале, мы выбрали MongoDB в качестве решения для базы данных.

Этот сценарий очень хорошо подходит для хранилищ документов NoSQL. Обратите внимание, что каждое приложение требует другой базы данных – если у ваших данных есть схема исправления, вам может быть лучше использовать традиционное хранилище SQL.

Не стесняйтесь оставлять комментарии со своими идеями! Также поставьте лайк ❤️ этой истории, если она была вам полезна!

Учебные пособия по NoSQL (Серия из 4 частей)

Оригинал: “https://dev.to/pmgysel/log-capturing-app-with-mongodb-spring-boot-swagger-ui-7op”