Задача создания действительно реактивного микросервиса с реляционной базой данных
В 2011 году, когда реактивные приложения начали становиться все более распространенными в Java, я часто шутил о них, поскольку доступ к базам данных SQL с помощью JDBC был полностью блокирующим механизмом. Конечно, в то время считалось, что базы данных SQL – это старый хлам, и что решения NoSQL без схемы станут нормой в ближайшие 5 лет. Весна была мертва! Базы данных SQL умрут следующими!
По странному повороту истории, спустя годы у нас все еще есть базы данных Spring и SQL, правящие миром… Но теперь они оба прекрасно работают в реактивной, облачной и бессерверной архитектуре!
В этом сообщении в блоге мы рассмотрим, как создать такое приложение с использованием следующих технологий:
- Поток Spring Web flux, поэтому у нас есть реактивные конечные точки REST
- R2DBC , поэтому мы используем новые реактивные драйверы SQL, которые позволяют нашему приложению полностью реагировать от базы данных к конечным точкам REST
- Бессерверная версия SQL Server, поэтому мы масштабируем нашу базу данных в зависимости от наших потребностей
ПРЕДУПРЕЖДЕНИЕ многие технологии, которые мы здесь используем, включая R2DBC, являются очень новыми и еще не готовы к производству. Мы создаем рабочее приложение, и мы надеемся, что этот пост поможет распространить и стабилизировать эти технологии, но используйте их на свой страх и риск!
Образец заявления
Мы разрабатываем здесь простой микросервис Spring Web flux, который взаимодействует с базой данных SQL. Окончательный код доступен на GitHub по адресу Окончательный код доступен на GitHub по адресу
Бессерверный SQL-сервер
Не все базы данных имеют реактивные драйверы с R2DBC, и именно поэтому мы выбрали здесь SQL Server. Другая причина заключается в том, что у is есть опция “без сервера”, которая стоит очень мало денег. На самом деле возможности масштабируемости SQL Server впечатляют, поскольку это единственная облачная база данных с тремя следующими опциями:
- Очень высокая производительность, доступность и объем памяти (до 100 МБ!) благодаря опции hyperscale
- Оптимизированная цена/производительность и масштабируемость с использованием эластичных пулов баз данных
- Очень низкая стоимость и цены по запросу, используя (мой любимый!) бессерверные экземпляры баз данных
Мы собираемся использовать здесь опцию “без сервера”, чтобы мы могли создавать все по чрезвычайно низкой цене: перейдите на портал Azure и выберите “База данных SQL”.:
Мы выбрали самый дешевый вариант: наша база данных будет стоить нам 0,15 евро в месяц плюс 0,000067 евро за использованную секунду (таким образом, за один час это будет около 0,24 Евро). Это действительно хорошо для среды разработки или тестирования, так как счет выставляется только тогда, когда он используется.
Для создания схемы базы данных у нас есть простой скрипт доступный здесь :
CREATE TABLE person ( id BIGINT NOT NULL IDENTITY PRIMARY KEY, first_name VARCHAR(100), last_name VARCHAR(100), company VARCHAR(100) )
Существует множество вариантов запуска этого скрипта в базе данных, но самый простой из них – использовать онлайн-редактор, доступный через портал Azure :
Использование и настройка R2DBC
R2DBC – это спецификация для реактивных драйверов для Java. Более конкретно, мы будем использовать RD2BC SQL Server , который является его реализацией для Microsoft SQL Server.
У нас было довольно много проблем с его использованием, например эта досадная ошибка SSL , и именно поэтому мы используем здесь выпуски моментальных снимков:
io.r2dbc r2dbc-mssql 0.8.0.BUILD-20190819.142517-35 org.springframework.data spring-data-r2dbc 1.0.0.gh-151-SNAPSHOT
Эти проблемы в настоящее время решаются командой Spring, и мы обновим образец проекта, как только появятся стабильные версии.
Конфигурация пружины для R2DBC
Существует Spring Boot starter для автоматической настройки R2DBC с помощью Spring Boot, или вы, конечно, можете настроить R2DBC вручную, как мы это сделали здесь:
@Bean public MssqlConnectionFactory connectionFactory() { log.info("Connecting to database '{}'...", host); return new MssqlConnectionFactory(MssqlConnectionConfiguration.builder() .host(host) .port(1433) .database(database) .username(username) .password(password) .build()); }
Код доступа к данным с помощью Spring Data и R2DBC
Хорошей новостью является то, что Spring Data частично работает с R2DBC: у вас не будет всех функций, таких как генерация SQL-запросов “на лету”, но большая часть фреймворка работает, а это значит, что у нас могут быть очень простые репозитории, как показано здесь:
@Repository public interface PersonRepository extends ReactiveCrudRepository{ }
Таким образом, этот репозиторий затем можно использовать в наших конечных точках REST, как обычный репозиторий Spring JDBC или Spring JPA:
@RestController public class PersonController { private final PersonRepository personRepository; public PersonController(PersonRepository personRepository) { this.personRepository = personRepository; } @GetMapping("/persons") public Fluxlist() { return personRepository.findAll(); } }
Заключение и заключительные мысли
Пример проекта, который мы разработали здесь, доступен на https://github.com/jdubois/spring-reactive-sql-server . В будущем этот проект должен использовать стабильные версии R2DBC, а также его проекты starter и connection pool , но он уже полностью пригоден для использования.
Хорошей новостью является то, что, несмотря на использование некоторых очень передовых функций, наш код по-прежнему выглядит как обычное приложение Spring Boot: большая часть используемой конфигурации и API должны быть знакомы пользователям Spring, и это работает как любое обычное приложение Spring Boot.
Убийственная особенность этой настройки заключается в том, что благодаря “бессерверной” версии SQL Server, а также благодаря R2DBC и Spring Webflux мы можем иметь очень масштабируемое приложение, стоимость которого будет варьироваться в зависимости от использования. На стороне приложения использование Spring Web flux означает, что наше приложение запускается очень быстро (чуть более 1 секунды на MacBook Pro) и что использование памяти ограничено. Таким образом, наш конечный результат отличается высокой масштабируемостью и эффективностью!
Оригинал: “https://dev.to/azure/building-a-fully-reactive-and-scalable-spring-application-with-r2dbc-and-a-serverless-database-1jke”