Учебные пособия по 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 MongoCollectiongetMongoCollection() { MongoClient mongoClient = MongoClients.create(); MongoDatabase db = mongoClient.getDatabase("mydb"); return db.getCollection("logEvents"); } }
Давайте используем вышеописанный компонент для поиска записей в MongoDB с помощью идентификатор
:
public class MongoDbService { @Autowired MongoCollectioncollection; 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 MaplogEvent; }
Мы представляем каждую запись в журнале в виде карты с строковыми
ключами и значениями.
Примечание: в приведенном выше фрагменте кода используется Lombok , который предлагает удобный способ создания сеттеров, геттеров и конструкторов.
Наш уровень базы данных представляет журналы в виде Документа
, но наш уровень обслуживания использует Событие входа в систему
. Поэтому нам нужен метод сопоставления:
public LogEvent toLog(Document document) { Mapmap = 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 ResponseEntitygetLogById( @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”