Недавно Джеймс Уорд написал замечательное сообщение в блоге «Java не сосет — вы просто неправильно его используете» , в котором освещены многочисленные проблемы, с которыми сталкиваются корпоративные Java-разработчики в своей повседневной рутинной работе по созданию Java-приложений. Хорошей новостью является то, что вырваться из рутины разработки гораздо проще, чем вы думаете. За последние несколько лет Spring пересмотрел, как создаются современные Java-приложения, значительно улучшив при этом скорость разработки. В этом посте я буду использовать пост в блоге Джеймса Уорда в качестве фона, чтобы объяснить, как Spring помогает разработчикам качать JVM (используя Java), решая при этом все проблемы, изложенные Джеймсом.
Мгновенная настройка среды разработки Rocks
В блоге Джеймса он утверждает, что «10 Page Wikis to Setup Dev Environments Suck». Мы все создали эти вики-страницы в какой-то момент нашей карьеры и пытались постоянно обновлять их. Эти вики долго были источником разочарования для новых членов команды, поскольку они часто завалены устаревшей информацией. Хорошей новостью является то, что поддержка сборки Spring Boot делает автоматизацию этого процесса довольно простой.
Для начала работы с существующим приложением достаточно просто клонировать исходный репозиторий и запустить приложение. Spring Boot обеспечивает поддержку самых популярных инструментов сборки Java, Maven и Gradle. Получить полнофункциональное приложение, работающее с вашим любимым инструментом сборки, очень просто:
Maven пример:
mvn spring-boot:run
Пример Gradle:
gradle bootRun
Поскольку приложение Spring Boot представляет собой автономную рабочую нагрузку, которая объединяет код приложения, сервер и сторонние зависимости в единый модуль сборки и развертывания (исполняемый файл .jar), командам разработчиков предоставляется простой и воспроизводимый опыт разработки независимо от среды IDE. , Разработчики освобождаются от трудоемких инструкций по настройке среды и могут сосредоточиться на создании великолепных приложений. Запуск приложения Spring Boot вне сборки можно выполнить, выполнив:
java -jar target/my-application-1.0.1-SNAPSHOT.jar
Совет: Хотите попробовать это самостоятельно? Следуйте в одном из многочисленных руководств по началу работы на spring.io. Для разработчиков, впервые знакомых с Spring Boot, отличной отправной точкой является руководство по созданию приложения с помощью Spring Boot .
Конгруэнтная среда развертывания Rock
Следующая задача, которую подчеркивает Джеймс Уорд, заключается в том, чтобы «минимизировать риск при продвижении сборок из dev в стадию к производству, единственное, что должно измениться между каждой средой, — это конфигурация». Модификация артефактов развертывания вручную — это путь к катастрофе, который может привести к задержкам или сбоям развертывания. Конфигурация конкретной среды должна быть выведена наружу, гарантируя, что тот же код, протестированный при разработке, является «золотой копией», которая попадет в производство. Это единственный экономически эффективный способ доказать, что то, что вы тестировали, — это то, что вы развернули!
Spring Boot облегчает экстернализацию вашей конфигурации, используя очень специфический порядок PropertySource, который предназначен для разумного переопределения значений. Часто желательно предоставить конфигурацию по умолчанию в вашем проекте для локальной разработки, но переопределить эти значения при продвижении кода через среды. Spring Boot обеспечивает всестороннюю поддержку внешней конфигурации с помощью аргументов командной строки, атрибутов JNDI, свойств системы Java, переменных среды ОС, файлов конфигурации, вариантов конфигурации на основе профиля и многого другого . Поддержка Spring Boot переменных среды делает следование лучшим рекомендациям по настройке приложений из двенадцати факторов (строгое отделение кода от конфигурации) очень просто.
Совет 1. При использовании облачных платформ, таких как Cloud Foundry, приложения Spring Boot могут использовать Spring Cloud Connectors для автоматической привязки к сервисам Cloud Foundry, таким как базы данных и системы обмена сообщениями. Преимущество этого заключается в уменьшении количества свойств конфигурации, специфичных для среды, которые необходимо поддерживать приложению, что значительно снижает риск возникновения ошибок при продвижении кода между средами.
Совет 2: Любопытно, почему приложения с двенадцатью факторами имеют значение? Прочтите этот пост в блоге, Почему 12-факторные шаблоны приложений, микросервисы и CloudFoundry Matter .
Скалы быстрого запуска сервера
Spring Boot поддерживает легкие встраиваемые контейнеры / серверы, которые быстро запускаются. Простое приложение REST может быть запущено всего за 3 секунды. Начиная с Spring Boot 1.2, есть встроенная поддержка сервера приложений для Tomcat (контейнер по умолчанию), Jetty и Undertow. Spring Boot не только поддерживает ведущие облегченные контейнеры, но и позволяет разработчику полностью контролировать эти решения, упрощая замену настроек по умолчанию.
Следующая конфигурация сборки Gradle обеспечивает поддержку веб-разработки с полным стеком, включая поддержку встроенных Tomcat и spring-webmvc.
Пример Gradle:
... apply plugin:'java' repositories { jcenter()} dependencies { compile("org.springframework.boot:spring-boot-starter-web:1.2.0.RELEASE")}...
Как отмечает Джеймс Уорд в своем первоначальном сообщении в блоге, время запуска может быть дополнительно улучшено путем разбивки монолитных развертываний на микросервисы. Позже в этом посте тема микросервисов будет рассмотрена более подробно (см. Раздел « Архитектура стиля микросервисов» ).
Управляемый Рок Зависимостей
Современным разработчикам нужны инструменты и технологии, которые позволят им быстро начать работу с наименьшим трением. Они также требуют модульной, легкой и продуманной технологии для оптимизации производительности. Spring Boot ставит перед собой цель быстро начать работу и значительно повысить скорость разработки.
Как верно указывает Джеймс Уорд, «это отстой, если какой-либо из ваших библиотечных зависимостей не управляет инструмент сборки». Spring Boot делает эту передовую практику первой практикой, не только поддерживая современные технологии сборки, но и предоставляя удобные дескрипторы зависимостей, называемые начальными POMS . Начальные POM предоставляют группы зависимостей для общих рабочих нагрузок разработки, которые вы можете просто включить в свое приложение.
Чтобы начать работу с Spring Boot, вы можете указать свой браузер на Spring Initializer — http://start.spring.io . Spring Initializer предоставляет веб-интерфейс, позволяющий разработчикам выбирать приложение / рабочую нагрузку и соответствующие зависимости. Затем он сгенерирует начальное приложение с поддержкой сборки (поддерживает Maven POM, проект Maven, Gradle Config, проект Gradle).
Снимок экрана Spring Initializer:
Разработчик, предпочитающий командную строку, может установить CLI Spring Boot, выполнив:
curl http://start.spring.io/install.sh | sh
Новый проект можно инициализировать с помощью командной строки, просто выполнив следующую команду:
spring init --dependencies=web,data-jpa my-project
Результатом этой инициализации (через Spring Initializer или Boot CLI) является полностью работоспособное приложение, в котором необходимые зависимости были включены и автоматически настроены Spring Boot.
Платформа Spring IO (которая включает Spring Boot) также предоставляет расширенный набор зависимостей, управляемых начальными POM Spring Boot. Spring IO устанавливает уровни зависимостей в портфеле Spring и имеет более длительный цикл выпуска, чем Spring Boot, предоставляя предприятиям моментальный снимок версий зависимостей, которые были протестированы и, как известно, работают вместе. Дистрибутив Spring IO Platform не является монолитной загрузкой библиотек, и разработчики могут выбирать только те части, которые им необходимы в их приложении. Дистрибутив Spring IO Platform содержит версии модулей Spring, библиотек тестирования, каркасов журналирования, управления базами данных, SQL / No-SQL и многое другое. Распределение Spring IO идеально подходит для предприятий, которые хотят использовать зависимости Spring IO Platform с более постепенным темпом.
Следующая конфигурация Gradle демонстрирует, как настроить спецификацию Spring IO Platform и использовать веб-стартер POM Spring Boot:
buildscript { repositories { jcenter()} dependencies { classpath 'io.spring.gradle:dependency-management-plugin:0.3.0.RELEASE'}} apply plugin:'io.spring.dependency-management' repositories { mavenCentral()} dependencyManagement { imports { mavenBom 'io.spring.platform:platform-bom:1.1.0.RELEASE'}} dependencies { compile 'org.springframework.boot:spring-boot-starter-web'}
Короткие циклы разработки / валидации действительно рок
Большинство современных приложений создаются с использованием богатых пользовательских интерфейсов, взаимодействующих с внутренними сервисами. Построение приложений таким способом имеет сильное разделение проблем между пользовательским интерфейсом и логикой на стороне сервера. Большинство современных IDE обеспечивают динамическую перезагрузку статических ресурсов, что позволяет разработчикам видеть изменения без перезагрузки сервера.
Spring Boot также поддерживает технологии шаблонизации на стороне сервера, такие как Thymeleaf, Freemarker и Groovy. Spring Boot позволяет динамически перезагружать эти технологии шаблонов без перезапуска сервера. Для Thymeleaf это так же просто, как установить следующее свойство в файле application.properties:
spring.thymeleaf.cache:false
На стороне сервера разбиение ваших монолитных приложений на микросервисы сократит время запуска приложений Spring Boot (которое уже довольно быстро благодаря использованию легких встроенных контейнеров). Кроме того, Spring Boot поддерживает автоконфигурирование утилит тестирования. Включение автоконфигурации Boot для тестирования так же легко, как и включение POM spring-boot-starter-test Starter. Это позволяет использовать зависимости Spring Test, JUnit, Hamcrest и Mockito, что упрощает включение Test Driven Development (TDD) в повседневные рабочие процессы. TDD позволяет разработчикам получать немедленную обратную связь об изменениях в своем коде.
Наконец, JRebel обеспечивает всестороннюю поддержку перезагрузки классов с поддержкой более 80 фреймворков Java (включая Spring). Посетите вебинар Spring Boot и JRebel 6 с Джошом Лонгом и Адамом Кобленцем для получения более подробной информации.
Микросервис Стиль Архитектура Рок
Заявление Джеймса о том, что «Monolithic Releases Suck» подходит для больших или сложных распределенных систем. Большинство разработчиков хотят работать более итеративно (гибко) и выпускать чаще. Архитектура в стиле микросервиса приобрела популярность как способ борьбы с проблемами монолитных приложений. Для новичков в микросервисах Мартин Фаулер подробно описывает этот стиль архитектуры в своем блоге .
При создании распределенных приложений (включая приложения в стиле микросервисов) появляется много общих системных шаблонов. Spring Cloud упрощает принятие этих шаблонов, предоставляя готовые сервисы для решения наиболее распространенных проблем. В Spring Cloud реализованы такие шаблоны, как управление конфигурацией, обнаружение служб, автоматический выключатель, интеллектуальная маршрутизация, микропрокси и шина управления. Spring Boot упрощает интеграцию этих возможностей в ваше приложение.
Например, проект Spring Cloud Netflix делает создание службы обнаружения сервисов с помощью Eureka Netflix так же просто, как:
@SpringBootApplication @EnableEurekaServer public class Application { public static void main(String[] args) { new SpringApplicationBuilder(Application.class).web(true).run(args); } }
Клиентские приложения могут зарегистрироваться как клиент Eureka, просто используя @EnableEurekaClient:
@SpringBootApplication @EnableEurekaClient @RestController public class Application { @RequestMapping("/") public String home() { return "Hello world"; } public static void main(String[] args) { new SpringApplicationBuilder(Application.class).web(true).run(args); } }
Совет 1: Spring Cloud обеспечивает поддержку многочисленных шаблонов распределенной обработки. Чтобы начать работу, ознакомьтесь с репозиторием github Spring Cloud Samples . Сессии Spring Cloud, Spring Boot и Netflix OSS SpringOne, проведенные Дейвом Сайером и Спенсером Гиббом, — еще один отличный способ понять и научиться внедрять архитектуры микросервисного стиля.
Совет 2: Если вы хотите создавать API-интерфейсы REST в стиле Hypermedia, обязательно ознакомьтесь с Руководством по началу работы, Доступ к данным JPA с помощью REST . Spring Data REST поможет ускорить развитие вашего сервиса. Spring Data REST поддерживает репозитории SQL и No-SQL.
Наличие технологии, позволяющей быстро кодировать микросервисы, — это только полдела. Разработчики часто страдают от многочисленных задержек в переносе их кода на рабочие платформы. Некоторые из наиболее распространенных препятствий включают развертывание вручную, тестирование, предоставление инфраструктуры и предоставление услуг. Непрерывная доставка направлена на автоматизацию процесса продвижения кода в производство при минимизации рисков. Это позволяет организациям вносить постепенные изменения в приложения, делая развертывание бизнес-решением, а не ресурсным решением. Сама по себе это довольно большая тема, но я настоятельно рекомендую выступление Мэтта Стайна « Разработка микросервисов для PaaS с использованием Spring и Cloud Foundry». который отлично справляется с задачей, подчеркивая преимущества сочетания гибких методов проектирования с автоматизацией Pivotal Cloud Foundry.
Рок приложений без сохранения состояния
Джеймс отмечает, что «липкие сеансы и состояние сервера обычно являются одним из лучших способов снизить производительность и отказоустойчивость. Состояние сеанса (в традиционном смысле сервлета) очень затрудняет выполнение непрерывной доставки и масштабирование по горизонтали ».
Удаление состояния сеанса из вашего приложения может значительно упростить операции, позволяя повторно развертывать, завершать или масштабировать приложения, не опасаясь потери данных сеанса. Существуют допустимые сценарии использования для поддержания состояния, например общего состояния аутентификации, но это состояние должно сохраняться за пределами приложения (обычно в высокопроизводительном хранилище, таком как NoSQL, распределенный кэш или даже хранилище данных в памяти). Внешнее состояние приложения не должно быть трудоемким, и Spring Session предоставляет общую инфраструктуру, которая делает этот процесс простым и переносимым. Весенняя сессия обеспечивает:
- Поддержка кластеризации независимым от производителя способом
- Поддержка RESTful API — поддерживает идентификаторы сессий в заголовках
- Сменная стратегия для определения идентификатора сессии
- Поддержка, чтобы поддерживать HttpSession, когда активен WebSocket
- Поддержка хранилищ сессий с поддержкой Redis и Hazelcast
- Возможность управлять несколькими одновременными сеансами в одном браузере (т.е. аналогично поддержке нескольких учетных записей Google)
Настроить Spring Session с помощью Redis так же просто, как:
@EnableRedisHttpSession public class Config { @Bean public JedisConnectionFactory connectionFactory() { return new JedisConnectionFactory(); } }
Совет: Spring Session 1.0 недавно прошел GA , поэтому попробуйте примеры Spring Session, чтобы увидеть все это в действии. Дейв Сайер недавно опубликовал пост в блоге под названием «Шаблон шлюза API: Angular JS и Spring Security Part IV» , в котором подробно описывается вариант использования общего состояния аутентификации. Настоятельно рекомендуется к прочтению!
Наконец, если вы используете Pivotal Cloud Foundry, пакет сборки Java Cloud Foundry предоставляет еще один вариант, позволяющий легко экстернализовать состояние через автоматически настроенное хранилище состояний сеанса CF. Проверьте это сообщение в блоге для деталей.
Неблокирующие приложения Rock
Ряд современных архитектур приложений может значительно выиграть от асинхронной и неблокирующей обработки запросов. Эти варианты использования могут включать в себя составление нескольких вызовов бэкэнда и приложений в стиле WebSocket.
Project Reactor (часть платформы Spring IO) обеспечивает основу для создания этих асинхронных неблокирующих приложений. В версии 2.0 Reactor обеспечит полную реализацию спецификации Reactive Streams, которая открывает интеграцию с другими реализациями Reactive Streams, такими как Akka Streams , Ratpack , RxJava .
В следующем фрагменте кода показано, как использовать API Reactive Streams для создания потока, добавления к нему бизнес-логики и публикации в нем данных:
// by default Streams use the Disruptor RingBufferDispatcher Broadcaster<String> helloStream = Streams.broadcast(env); helloStream.map(s -> "Hello " + s + "!") .consume(log::info); helloStream.onNext("World");
Совет: Spring Boot обеспечивает поддержку проекта Reactor, что упрощает его начало. Следуйте инструкциям в Руководстве по началу работы с асинхронным, управляемым событиями приложением с Reactor, чтобы создать первое реактивное приложение. Также обязательно посетите вебинар « Использование Reactor для Asynch», неблокирующие микросервисы .
В Spring Framework 4 появилась поддержка приложений, управляемых событиями, в стиле WebSocket. Этот прагматический подход выходит далеко за рамки JSR-356 и включает в себя опции отката на стороне клиента с SockJS, поддержку подпротокола обмена сообщениями (STOMP), безопасность (Spring Security 4), поддержку посредника сообщений, основанный на Reactor MessageChannel для передачи сообщений, обработку разъединения клиента и знакомая модель программирования Spring.
Совет: Spring Boot делает настройку приложений WebSocket несложной. Следуйте указаниям раздела Использование WebSocket для создания интерактивного руководства по веб-приложениям .
Скалы языка Java
Spring Boot предоставляет разработчикам возможность использовать Java 6, 7, 8, а также Groovy для создания приложений следующего поколения. В сообщении Джеймса он утверждает, что «Java Language Kinda Sucks», но с выпуском Java 8, Java была продвинута вперед и предоставляет много мощных языковых функций, которые повысят производительность. Некоторые из замечательных функций Java 8 включают поддержку лямбда-выражений, потоков и улучшений параллелизма. Spring Boot облегчает начало работы с Java 8 или Groovy.
Совет: Если вы новичок в функциях Java 8, я настоятельно рекомендую книгу Venkat Subramaniam « Функциональное программирование на Java: использование возможностей Java 8 Lambda Expressions» и его выступление на SpringOne2GX 2014
Вывод
Создание современных Java-приложений не должно быть болезненным опытом. Spring Boot отказался от создания приложений, сделав Java еще более увлекательным. Spring удаляет шаблоны из каждого уровня вашего приложения — бизнес-логики (проекты Spring Foundation), конфигурации и времени выполнения (Spring Boot), а также шаблонов распределенных систем (Spring Cloud). Лучший способ начать работу — погрузиться в Руководства по началу работы Spring и развернуть их на Pivotal Web Services (общедоступная, размещенная версия Cloud Foundry, которая бесплатна в течение 60 дней).