Альтернативой какой концепции java является spring framework

Обновлено: 03.07.2024

Фреймворки позволяют строить приложения быстро, просто и эффективно, а также использовать готовые фрагменты кода, избавляя от необходимости писать его с нуля. Их выбор из всего многообразия зависит от потребностей конкретного проекта. Ресурс Technotification подготовил подборку из 10 фреймворков для Java-программистов и разработчиков.

Фреймворки позволяют строить приложения быстро, просто и эффективно, а также использовать готовые фрагменты кода, избавляя от необходимости писать его с нуля. Их выбор из всего многообразия зависит от потребностей конкретного проекта. Ресурс Technotification подготовил подборку из 10 фреймворков для Java-программистов и разработчиков.

Содержание

1. Spring Framework

Spring — один из самых популярных Java-фреймворков. Его предпочитает большинство разработчиков на этом языке, в том числе благодаря возможности внедрения зависимостей.

Spring идеально подходит для создания корпоративных приложений и моделей конфигурации на базе Java. Он позволяет разработчикам сосредоточиться на бизнес-логике приложения. Близко связан с фреймворком Spring Boot.

2. PrimeFaces

PrimeFaces относится к лучшим лёгким Java-фреймворком. Его можно скачать в одном.jar-файле. PriemFaces существует уже много лет и служит UI-фреймворком для спецификаций JavaServer Faces и Java EE. Также он насчитывает более 100 компонентов, среди ключевых — валидация на стороне клиента и инструментарий для сенсорных смартфонов.

3. Blade

Blade — это легковесный MVC-фреймворк на базе Java 8. Он прост и включает интерфейс маршрутизатора в стиле RESTful. Также он относится к тем немногим Java-фреймворкам, в которых отсутствуют навязчивые перехватчики. Под «легковесностью» имеется в виду небольшой по объёму исходный код, который не превышает 500 Кб.

Для использования Blade понадобится создать типичный Maven-проект. Фреймворк поддерживает модульность в Java 9, а также большое число веб-компонентов Java.

Онлайн-курсы, чтобы стать крутым Java-разработчиком

4. Dropwizard

Dropwizard помогает достичь максимальной продуктивности при разработке. Приятный бонус — понятная для новичков документация.

5. Google Web Toolkit (GWT)

Фреймворк Google Web Toolkit выпущен Google с целью помочь разработчикам в написании веб-приложений на Java. Он даёт возможность писать Java-код и компилировать в JavaScript для запуска в браузерах.

GWT поддерживает команда опытных программистов Google. С помощью этого фреймворка можно создавать комплексные веб-приложения, не имея практического опыта с языками фронтенд-разработки, такими как JavaScript.

Фреймворк включает ряд уникальных функций, например абстракция UI, кросс‐браузерная совместимость и интернационализация.

15 курсов по Java, на которые стоит обратить внимание новичкам и профи

15 курсов по Java, на которые стоит обратить внимание новичкам и профи

6. JavaServer Faces (JSF)

MVC-фреймворк JavaServer Faces появился 14 лет назад. Он упрощает разработку пользовательских интерфейсов для веб-приложений. Самая замечательная особенность этого фреймворка в том, что построенные в нём UI-компоненты можно повторно использовать для других веб-страниц. В качестве шаблонов в JSF использует Facelets.

7. JHipster

JHipster — относительно молодой фреймворк, вышедший в 2013 году. Он сочетает Spring Boot, Angular и React в одном большом фреймворке. С помощью него можно запросто построить современное веб-приложение на Java.

Интеграция Spring Boot позволяет создавать приложения на базе фреймворка Spring. Помимо Angular и React, JHipster также использует Bootstrap. Кроме того, JHipster предоставляет два вида архитектур: монолитную или микросервисную. В первом случае фронтенд и бэкенд реализованы в едином приложении, во втором — раздельно.

8. Spark Framework

Spark — оптимальный выбор для программистов, разрабатывающих веб-приложения на Java. В нём можно быстро и без усилий строить бэкенд сайтов. Spark поддерживает практически все функции Java 8 и имеет выразительный API.

9. MyBatis

MyBatis фреймворк для осуществления маппинга между Java-приложениями и базами данных SQL. Обычно для подключения приложения к реляционной БД необходим API Java Database Connectivity. Он позволяет разработчикам выполнять крупные SQL-операции за несколько строчек кода.

MyBatis сравнивают с фреймворком Hibernate, так как оба являются посредниками между приложением и базой данных. Единственное отличие в том, что MyBatis не делает маппинг объектов Java в реляционную БД.

10. Play Framework

Play — ещё один лёгкий Java-фреймворк, завоевавший расположение большинства разработчиков. Он предоставляет интерфейс, через который можно реализовывать изменения в коде без необходимости заново развёртывать или компилировать его.

Фреймворк имеет асинхронные API, которые позволяют разработчикам масштабировать приложения, обходясь без дополнительных ресурсов. Play прекрасно поддерживает различные микросервисные паттерны.

Привет! В данный момент самое популярное направление развития для девелопера со знанием Java — веб-разработка. Само собой, для этой специальности есть список обязательных к изучению технологий. Одна из главных — Spring . Вы можете возразить: вместо него можно изучить Java EE. Это, конечно, верно, но сейчас в подавляющем большинстве новых проектов используется именно Spring , что сделало его фактически дефолтной, обязательной технологией для Java веб-разработчика. И если вы хотите идти нога в ногу с потребностями рынка, вам придется его изучить. Сегодня я хотел бы поговорить о Spring , а именно — немного расширить ваше виденье о нем: рассказать об истории его создания, ключевых отличиях от Java EE стека и сделать небольшой обзор ключевых компонентов Spring стека. Давайте же приступим!

1. Как и когда появился Spring и во что развился со временем

  • В июне 2003 года Spring 0.9 выпустили под лицензией Apache 2.0.
  • В марте 2004 года выходит Spring 1.0. Интересно, что даже до выпуска Spring 1.0, предыдущую версию 0.9 очень тепло восприняли, и она получила широкое распространение.
  • В августе 2004 года Род Джонсон, Юрген Хеллер, Кейт Дональд и Колин Сампалеану стали соучредителями interface21 — компании, которая занимается консультированием, обучением и поддержкой по Spring.
  • Октябрь 2006 года: выходит версия Spring 2.0, которая упростила файлы конфигурации XML.
  • В Spring 2.5, появившейся в ноябре 2007 года, были представлены конфигурации аннотаций.
  • Spring 3.2, вышедшая в декабре 2012 года, представила конфигурацию Java, поддерживала Java 7, Hibernate 4, Servlet 3.0, а также требовала как минимум Java 1.5.
  • Янн Карофф покинул команду в самом начале. Род Джонсон покинул “весеннюю” команду в 2012 году. Юрген Хеллер по-прежнему является активным членом команды разработчиков Spring.
  • В Spring 4.0, вышедшая в 2014 году, добавили поддержку Java 8.
  • Также в 2014 году миру представили Spring Boot.
  • Spring 5.0 вышла в 2017 году. Как и Spring Boot 2.x, который поддерживает Spring 5.
  • Собственно, таким образом наш любимый фреймворк и стал таким, каким мы знаем его сейчас.

2. Spring vs Java EE

  • Приложения, написанные на Java EE, считаются более надежными, безопасными и масштабируемыми
  • Java EE — утвержденный промышленностью стандарт API
  • Преимущественно основан на аннотациях и CDI (context and dependency injection), как впрочем и Spring
  • Реализация на основе EJB контейнеров и POJO
  • Сложные приложения с большим количеством транзакций очень хорошо обрабатываются JEE
  • Успешен в использовании для масштабируемого монолитного приложения
  • У Java EE есть свой ООП язык, содержащий определенный стиль и синтаксис
  • Очень сложная среда разработки приложений, которую сложно понять новичкам (и старичкам порой тоже)
  • Окончательная стоимость проекта, включая разработку, развертывание и разработку приложений, может оказаться непомерно высокой
  • Позволяет эффективно организовывать взаимодействия объектов
  • Более прост, нежели Java EE
  • Реализован на основе IOC и AOP, что обеспечивает слабую связанность приложений
  • Работает на основе конфигурации XML, Groovy или аннотаций
  • Позволяет использовать простые старые объекты Java — POJO, разработчикам не нужен корпоративный контейнер, такой как сервер приложений
  • Обеспечивает разработчикам Java высокий уровень модульности
  • Предоставляет реализацию библиотек Java EE, но на свой лад, благодаря чему использование их станет в разы проще
  • Лицензия с открытым исходным кодом
  • Spring Boot сильно упрощает первичную настройку приложения
  • Код приложения Spring, как правило, прост для тестирования
  • Относительно сложно развивать Spring, поскольку в нем отсутствует четкая направленность
  • Для начинающего разработчика Java изучение среды Spring может быть сложной задачей (но все равно проще, чем Java EE)
  • Spring медленнее, чем Java EE

Итоги сравнения

Что нужно знать о Spring: история появления, ключевые модули, сравнение с Java EE - 7

В моём понимании Java EE и Spring — это как JDBC и Hibernate, где JDBC — более быстрая технология, но в то же время с большим количеством лишнего кода. А Hibernate уже использует JDBC, но при этом упрощая и сокращая разработку в разы (хоть и накладывая некоторые ограничения). Нельзя однозначно сказать, кто из них лучше. Также это чем-то напоминает вопрос: что лучше — ArrayList или LinkedList. Ведь ответ будет всё тем же — смотря в какой ситуации. У каждого из них есть свои сильные и слабые стороны, и выбирать из них нужно тщательно, взвесив свою ситуацию и поняв, кто из них сейчас принесет наибольшую пользу.

3. Компоненты Spring

Ну а сейчас давайте немного поговорим о фреймворках, из которых состоит Spring.

Spring framework

  • core — базовый функционал, реализующий понятия IoC (inversion of control) и DI (dependency injection);
  • AOP — Aspect-Oriented Programming — аспектно-ориентированое программирование, направленное на реализацию сквозной логики;
  • MVC и WebFlux — фреймворки для веб взаимодествия;
  • JDBC , ORM — технологии взаимодействия с базами данных;
  • Test — функционал для прозрачного, несложного тестирования данных Spring контейнера;
  • SpEL — Spring Expression Language — язык выражений Spring;
  • и т.д.

Spring Boot

Упрощает создание приложений на основе Spring , сокращая до минимума первичную настройку приложения и автоконфигурирует элементы приложения на Spring. Пример запуска Spring boot за 5 минут

Spring Data

Значительно упрощает использование технологий доступа к данным, реляционных и нереляционных баз данных (убирает повторяющийся код и упрощает взаимодействие с данными). В этой статье — неплохой туториал по подключению Spring Data.

Spring Cloud

Используется в микросервисной архитектуре, упрощая взаимодействие микросервисов между собой и автоматизируя развертывание приложений на облачных платформах типа AWS , Azure и т.д. Развёрнутый туториал по Spring Cloud смотрите здесь, но предупрежу, что данная тема не из легких и ориентирована на специалистов уровня, близкого к синьору.

Spring Security

Что нужно знать о Spring: история появления, ключевые модули, сравнение с Java EE - 8

Предоставляет мощный и настраиваемый инструмент проверки подлинности (аутентификации) и контроля доступа (авторизации) в приложение. Несложный пример подключения Spring Security к своему приложению вы можете найти в этом посте.

Spring GraphQL

Данный модуль обеспечивает поддержку приложений Spring, построенных на GraphQL Java. GraphQL — это язык запросов для API, позволяющий клиентам запрашивать ограниченное множество данных, в которых они нуждаются, что в свою очередь позволяет собирать данные в ограниченном количестве запросов. Если вы уже знакомы с JPA, возможно уже встречали EntityGraph, со схожей (или той же) концепцией. Подробнее о GraphQL можно почитать вот тут.

Spring Session

Данная часть фреймворка Spring предоставляет API и реализации для управления информацией о сеансе пользователя (данные сеанса пользователя сохраняются в постоянном хранилище вроде Redis , MongoDb , HazelCast и т. д). С примером использования Spring Session можно ознакомиться вот тут.

Spring Integration

Spring REST

Предоставляет богатый набор инструментов, упрощающий разработку REST API: инструменты для маршрутизации запросов, для преобразования JSON/XML в объекты требуемых типов и т.д. Пример RESTful сервиса на Spring можно найти в этом материале.

Spring Web Flow

Spring WebServices

Spring HATEOAS

Модуль предоставляет некоторые API-интерфейсы для упрощения создания REST контроллеров, которые следуют принципу HATEOAS при работе со Spring и особенно Spring MVC. HATEOAS — Hypermedia As The Engine Of Application State — Гипермедиа как двигатель состояния приложения. Использование данной библиотеки Spring вы можете увидеть здесь.

Spring Batch

Данный модуль предоставляет функционал для пакетных обработок данных (когда данные обрабатываются большими кусками — пакетами), жизненно важных для повседневной работы корпоративных систем. В Spring Batch предоставлены функции многократного использования, которые необходимы для обработки больших объемов записей, включая ведение журнала / трассировку, управление транзакциями, статистику обработки заданий, перезапуск заданий, пропуск и управление ресурсами. Интересный обзор по Spring Batch вы можете найти по этой ссылке.

Spring AMQP

Spring for Apache Kafka

Spring CredHub

Предоставляет поддержку на стороне клиента для хранения, получения и удаления учетных данных с сервера CredHub, работающего на платформе Cloud Foundry. CredHub — предоставляет API для безопасного хранения, создания, извлечения и удаления учетных данных различных типов. Spring CredHub предоставляет привязку Java для CredHub API, что упрощает интеграцию приложений Spring с CredHub.

Spring FLO

Это библиотека JavaScript, которая предлагает простой встраиваемый визуальный конструктор HTML5 для конвейеров и простых графиков для мониторинга потоковой и пакетной передачи данных. Демо данной технологии — в видео по ссылке.

Spring LDAP

Данная библиотека упрощает операции по протоколу LDAP и основана на шаблоне Spring JdbcTemplate. Фреймворк позволяет осуществлять поиск и закрытие контекста, просмотр результатов, кодирование/декодирование значений, фильтры и многое другое (построенная на тех же принципах, что и Spring Jdbc) Пример реализации Spring LDAP можно найти здесь.

Spring Roo

Spring Shell

Библиотека позволяет легко создавать полнофункциональное приложение оболочки (также известное как командная строка), полагаясь на jar-файлы Spring Shell и добавляя свои собственные команды (которые поступают как методы в Spring beans). Создание приложения командной строки может быть полезно, например, для взаимодействия с REST API вашего проекта или для работы с локальным содержимым файла. Подробнее читайте тут и тут.

Spring Statemachine

Данный модуль позволяет разработчикам приложений использовать концепции конечного автомата с приложениями Spring. Детальный пример использования данной функциональности можно найти вот тут и вот тут.

Вопросы и ответы на собеседование по теме Spring Framework. Часть 1.

к списку вопросов раздела JEE

Вопросы

1. Расскажите о Spring Framework.
2. Какие некоторые из важных особенностей и преимуществ Spring Framework?
3. Что вы понимаете под Dependency Injection (DI)?
4. Как реализуется DI в Spring Framework?
5. Какие преимущества использования Spring Tool Suite?
6. Приведите названия некоторых важных Spring модулей.
7. Что вы понимаете под аспектно-ориентированным программированием (Aspect Oriented Programming — AOP)?
8. Что такое Aspect, Advice, Pointcut, JoinPoint и Advice Arguments в АОП?
9. В чем разница между Spring AOP и AspectJ АОП?
10. Что такое IoC контейнер Spring?
11. Что такое Spring бин?
12. Какое значение имеет конфигурационный файл Spring Bean?
13. Какие различные способы настроить класс как Spring Bean?
14. Какие вы знаете различные scope у Spring Bean?
15. Что такое жизненный цикл Spring Bean?
16. Как получить объекты ServletContext и ServletConfig внутри Spring Bean?
17. Что такое связывание в Spring и расскажите об аннотации @Autowired?
18. Какие различные типы автоматического связывания в Spring?
19. Является ли Spring бин потокобезопасным?
20. Что такое контроллер в Spring MVC?
21. Какая разница между аннотациями @Component, @Repository и @Service в Spring?
22. Расскажите, что вы знаете о DispatcherServlet и ContextLoaderListener.
23. Что такое ViewResolver в Spring?
24. Что такое MultipartResolver и когда его использовать?
25. Как обрабатывать исключения в Spring MVC Framework?
26. Как создать ApplicationContext в программе Java?
27. Можем ли мы иметь несколько файлов конфигурации Spring?
28. Какие минимальные настройки, чтобы создать приложение Spring MVC?
29. Как бы вы связали Spring MVC Framework и архитектуру MVC?
30. Как добиться локализации в приложениях Spring MVC?

31. Как мы можем использовать Spring для создания веб-службы RESTful, возвращающей JSON?
32. Приведите пример часто используемых аннотаций Spring.
33. Можем ли мы послать объект как ответ метода обработчика контроллера?
34. Как загрузить файл в Spring MVC?
35. Как проверить (валидировать) данные формы в Spring Web MVC Framework?
36. Что вы знаете Spring MVC Interceptor и как он используется?
37. Spring JdbcTemplate класс и его применение.
38. Как использовать Tomcat JNDI DataSource в веб-приложении Spring?
39. Каким образом можно управлять транзакциями в Spring?
40. Расскажите о Spring DAO.
41. Как интегрировать Spring и Hibernate?
42. Расскажите о Spring Security.
43. Как внедрить java.util.Properties в Spring Bean?
44. Назовите некоторые из шаблонов проектирования, используемых в Spring Framework?
45. Best Practices в Spring Framework.

Ответы

1. Расскажите о Spring Framework.

Spring Framework (или коротко Spring) — универсальный фреймворк с открытым исходным кодом для Java-платформы. Несмотря на то, что Spring Framework не обеспечивает какую-либо конкретную модель программирования, он стал широко распространённым в Java-сообществе главным образом как альтернатива и замена модели Enterprise JavaBeans. Spring Framework предоставляет бо́льшую свободу Java-разработчикам в проектировании; кроме того, он предоставляет хорошо документированные и лёгкие в использовании средства решения проблем, возникающих при создании приложений корпоративного масштаба. Обычно Spring описывают как облегченную платформу для построения Java-приложений, но с этим утверждением связаны два интересных момента. Во-первых, Spring можно использовать для построения любого приложения на языке Java (т.е. автономных, веб приложений, приложений JEE и т.д.), что отличает Spring от многих других платформ, таких как Apache Struts, которая ограничена только веб-приложениями. Во-вторых, характеристика “облегченная” в действительности не имеет никакого отношения к количеству классов или размеру дистрибутива; напротив, она определяет принцип всей философии Spring — минимальное воздействие. Платформа Spring является облегченной в том смысле, что для использования ядра Spring вы должны вносить минимальные (если вообще какие-либо) изменения в код своего приложения, а если в какой-то момент вы решите больше не пользоваться Spring, то и это сделать очень просто. Обратите внимание, что речь идет только о ядре Spring — многие дополнительные компоненты Spring, такие как доступ к
данным, требуют более тесной привязки к Spring Framework.

2. Какие некоторые из важных особенностей и преимуществ Spring Framework?

Spring Framework обеспечивает решения многих задач, с которыми сталкиваются Java-разработчики и организации, которые хотят создать информационную систему, основанную на платформе Java. Из-за широкой функциональности трудно определить наиболее значимые структурные элементы, из которых он состоит. Spring Framework не всецело связан с платформой Java Enterprise, несмотря на его масштабную интеграцию с ней, что является важной причиной его популярности.

Spring Framework, вероятно, наиболее известен как источник расширений (features), нужных для эффективной разработки сложных бизнес-приложений вне тяжеловесных программных моделей, которые исторически были доминирующими в промышленности. Ещё одно его достоинство в том, что он ввел ранее неиспользуемые функциональные возможности в сегодняшние господствующие методы разработки, даже вне платформы Java. Этот фреймворк предлагает последовательную модель и делает её применимой к большинству типов приложений, которые уже созданы на основе платформы Java. Считается, что Spring Framework реализует модель разработки, основанную на лучших стандартах индустрии, и делает её доступной во многих областях Java. Таким образом к достоинствам Spring можно отнести:

  • Относительная легкость в изучении и применении фреймворка в разработке и поддержке приложения.
  • Внедрение зависимостей (DI) и инверсия управления (IoC) позволяют писать независимые друг от друга компоненты, что дает преимущества в командной разработке, переносимости модулей и т.д..
  • Spring IoC контейнер управляет жизненным циклом Spring Bean и настраивается наподобие JNDI lookup (поиска).
  • Проект Spring содержит в себе множество подпроектов, которые затрагивают важные части создания софта, такие как вебсервисы, веб программирование, работа с базами данных, загрузка файлов, обработка ошибок и многое другое. Всё это настраивается в едином формате и упрощает поддержку приложения.

3. Что вы понимаете под Dependency Injection (DI)?

Внедрение зависимости (Dependency injection, DI) — процесс предоставления внешней зависимости программному компоненту. Является специфичной формой «инверсии управления» ( Inversion of control, IoC), когда она применяется к управлению зависимостями. В полном соответствии с принципом единой обязанности объект отдаёт заботу о построении требуемых ему зависимостей внешнему, специально предназначенному для этого общему механизму. К достоинствам применения DI можно отнести:

  • Сокращение объема связующего кода. Одним из самых больших плюсов DI является возможность значительного сокращения объема кода, который должен быть написан для связывания вместе различных компонентов приложения. Зачастую этот код очень прост — при создании зависимости должен создаваться новый экземпляр соответствующего объекта.
  • Упрощенная конфигурация приложения. За счет применения DI процесс конфигурирования приложения значительно упрощается. Для конфигурирования классов, которые могут быть внедрены в другие классы, можно использовать аннотации или XML-файлы.
  • Возможность управления общими зависимостями в единственном репозитории. При традиционном подходе к управлению зависимостями в общих службах, к которым относятся, например, подключение к источнику данных, транзакция, удаленные службы и т.п., вы создаете экземпляры (или получаете их из определенных фабричных классов) зависимостей там, где они нужны — внутри зависимого класса. Это приводит к распространению зависимостей по множеству классов в приложении, что может затруднить их изменение. В случае использования DI вся информация об общих зависимостях содержится в единственном репозитории (в Spring есть возможность хранить эту информацию в XML-файлах или Java классах), что существенно упрощает управление зависимостями и снижает количество возможных ошибок.
  • Улучшенная возможность тестирования. Когда классы проектируются для DI, становится возможной простая замена зависимостей. Это особенно полезно при тестировании приложения.
  • Стимулирование качественных проектных решений для приложений. Вообще говоря, проектирование для DI означает проектирование с использованием интерфейсов. Используя Spring, вы получаете в свое распоряжение целый ряд средств DI и можете сосредоточиться на построении логики приложения, а не на поддерживающей DI платформе.

4. Как реализуется DI в Spring Framework?

Реализация DI в Spring основана на двух ключевых концепциях Java — компонентах JavaBean и интерфейсах. При использовании Spring в качестве поставщика DI вы получаете гибкость определения конфигурации зависимостей внутри своих приложений разнообразными путями (т.е. внешне в XML-файлах, с помощью конфигурационных Java классов Spring или посредством аннотаций Java в коде). Компоненты JavaBean (также называемые POJO (Plain Old Java Object — простой старый объект Java)) предоставляют стандартный механизм для создания ресурсов Java, которые являются конфигурируемыми множеством способов. За счет применения DI объем кода, который необходим при проектировании приложения на основе интерфейсов, снижается почти до нуля. Кроме того, с помощью интерфейсов можно получить максимальную отдачу от DI, потому что бины могут использовать любую реализацию интерфейса для удовлетворения их зависимости.

К типам реализации внедрения зависимостей в Spring относят:

Constructor Dependency Injection — это тип внедрения зависимостей, при котором зависимости компонента предоставляются ему в его конструкторе (или конструкторах).



Определим набор требований к каждому сервису:

Каркас разработки был создан в Oracle для внутреннего использования, впоследствии став open-source’ным. Существует две модели разработки на основе этого фреймворка: Standard Edition (SE) и MicroProfile (MP). В обоих случаях сервис будет обычной Java SE программой. Подробнее о различиях можно узнать на этой странице.

Если коротко, то Helidon MP — это одна из реализаций Eclipse MicroProfile, что даёт возможность использования множества API, как ранее известных разработчикам на Java EE (например, JAX-RS, CDI), так и более новых (Health Check, Metrics, Fault Tolerance и т. д.). В варианте Helidon SE разработчики руководствовались принципом “No magic”, что выражается, в частности, в меньшем количестве или полном отсутствии аннотаций, необходимых для создания приложения.

Для разработки микросервиса выбран Helidon SE. Помимо прочего в нём отсутствуют средства для реализации Dependency Injection, поэтому для внедрения зависимостей использован Koin. Далее приведён класс, содержащий main-метод. Для реализации Dependency Injection класс наследуется от KoinComponent. Сначала стартует Koin, далее инициализируются требуемые зависимости и вызывается метод startServer() , где создаётся объект типа WebServer, которому предварительно передаётся конфигурация приложения и настройка роутинга; после старта приложение регистрируется в Consul:


Роутинг настраивается следующим образом:


В приложении используется конфиг в формате HOCON:


Для конфигурирования возможно также использовать файлы в форматах JSON, YAML и properties (подробнее здесь).

Фреймворк написан на Kotlin. Новый проект можно создать несколькими способами: используя систему сборки, start.ktor.io или плагин к IntelliJ IDEA (подробнее здесь).

Как и в Helidon SE, в Ktor отсутствует DI “из коробки”, поэтому перед стартом сервера с помощью Koin осуществляется внедрение зависимостей:


Необходимые приложению модули указываются в конфигурационном файле (возможно использование только формата HOCON; подробнее о конфигурировании Ktor-сервера здесь), содержимое которого представлено ниже:


В Ktor и Koin используется термин “модуль”, обладающий при этом разными значениями. В Koin модуль — это аналог контекста приложения в Spring Framework. Модуль Ktor — это определённая пользователем функция, которая принимает объект типа Application и может осуществлять конфигурирование пайплайна, установку фич (features), регистрацию роутов, обработку
запросов и т. д.:


В этом фрагменте кода настраивается роутинг запросов, в частности, статический ресурс logo.jpg .

Ktor-сервис может содержать фичи. Фича — это функциональность, встраиваемая в пайплайн запрос-ответ (DefaultHeaders, Compression и другие в примере кода выше). Возможна реализация собственных фич, например, ниже приведён код, имплементирующий паттерн Service Discovery в сочетании с клиентской балансировкой нагрузки на основе алгоритма Round-robin:


Основная логика находится в методе install : во время фазы запроса Render (которая выполняется перед фазой Send) сначала определяется название вызываемого сервиса, далее у consulClient запрашивается список инстансов этого сервиса, после чего вызывается инстанс, определённый с помощью алгоритма Round-robin. Таким образом становится возможным следующий вызов:

Micronaut разрабатывается создателями фреймворка Grails и вдохновлён опытом построения сервисов с использованием Spring, Spring Boot и Grails. Фреймворк является полиглотом, поддерживая языки Java, Kotlin и Groovy; возможно, будет поддержка Scala. Внедрение зависимостей осуществляется на этапе компиляции, что приводит к меньшему потреблению памяти и более быстрому запуску приложения по сравнению со Spring Boot.

Main-класс имеет следующий вид:


Некоторые компоненты приложения на основе Micronaut похожи на свои аналоги в приложении на Spring Boot, например, ниже приведён код контроллера:


Поддержка Kotlin в Micronaut реализована на основе плагина компилятора kapt (подробнее здесь). Сборочный скрипт при этом конфигурируется так:


Далее показано содержимое конфигурационного файла:


Конфигурирование микросервиса возможно также файлами форматов JSON, properties и Groovy (подробнее здесь).

Фреймворк был создан с целью упростить разработку приложений, использующих экосистему Spring Framework. Это достигается посредством механизмов автоконфигурации при подключении библиотек. Ниже приведён код контроллера:


Микросервис конфигурируется файлом формата YAML:


Также для конфигурирования возможно использовать файлы формата properties (подробнее здесь).

Проект работает на JDK 12, хотя, вероятно, и на 11-й версии тоже, требуется только соответствующим образом поменять в сборочных скриптах параметр jvmTarget :


Перед запуском микросервисов нужно установить Consul и запустить агент — например, так: consul agent -dev .

Запуск микросервисов возможен из:


  • IDE
    Пользователи IntelliJ IDEA могут увидеть примерно следующее:

  • консоли
    Для этого нужно перейти в папку проекта и последовательно выполнить:


В качестве примера приведены результаты тестирования API Helidon service:

Размер артефакта


C целью сохранения простоты настройки и запуска приложений в сборочных скриптах не были исключены какие-либо транзитивные зависимости, поэтому размер uber-JAR сервиса на Spring Boot значительно превышает размеры аналогов на других фреймворках (т. к. при использовании стартеров импортируются не только нужные зависимости; при желании размер можно существенно уменьшить):
Микросервис Размер артефакта, Мбайт
Helidon service 16,6
Ktor service 20,9
Micronaut service 16,5
Spring Boot service 42,7

Время запуска


Время запуска каждого приложения непостоянно и попадает в некоторое “окно”; в таблице ниже приведено время запуска артефакта без указания каких-либо дополнительных параметров:
Микросервис Время запуска, секунды
Helidon service 2,2
Ktor service 1,4
Micronaut service 4,0
Spring Boot service 10,2

Стоит отметить, что если “почистить” приложение на Spring Boot от ненужных зависимостей и уделить внимание настройке запуска приложения (например, сканировать только нужные пакеты и использовать ленивую инициализацию бинов), то можно значительно сократить время запуска.

Нагрузочное тестирование

Для проведения тестирования были использованы Gatling и скрипт на Scala. Генератор нагрузки и тестируемый сервис были запущены на одной машине (Windows 10, четырёхъядерный процессор 3,2 ГГц, 24 Гбайт RAM, SSD). Порт этого сервиса указывается в Scala-скрипте.

Для каждого микросервиса определяется:

  • минимальный объём heap-памяти ( -Xmx ), необходимый для запуска работоспособного (отвечающего на запросы) микросервиса
  • минимальный объём heap-памяти, необходимый для прохождения нагрузочного теста 50 пользователей * 1000 запросов
  • минимальный объём heap-памяти, необходимый для прохождения нагрузочного теста 500 пользователей * 1000 запросов
Микросервис Минимальный объём heap-памяти, Мбайт
Для запуска сервиса Для нагрузки 50 * 1000 Для нагрузки 500 * 1000
Helidon service 9 9 11
Ktor service 11 11 13
Micronaut service 13 13 17
Spring Boot service 22 23 25

Helidоn

  • плюсы
    • параметры приложения
      По всем параметрам показал хорошие результаты;
    • “No magic”
      Фреймворк оправдал заявленный разработчиками принцип: для создания приложения потребовалась всего одна аннотация ( @JvmStatic — для интеропа Java-Kotlin).
    • микрофреймворк
      Отсутствуют “из коробки” некоторые необходимые для промышленной разработки компоненты, например, внедрение зависимостей и реализация Service Discovery.
    • плюсы
      • имплементация Eclipse MicroProfile
        По сути, MicroProfile — это Java EE, оптимизированная для МСА. Таким образом, во-первых, вы получаете доступ ко всему многообразию Java EE API, в том числе, разработанному специально для МСА, во-вторых, вы можете изменить имплементацию MicroProfile на любую другую (Open Liberty, WildFly Swarm и т. д.).
      • на MicroProfile Starter вы можете с нуля создать проект с нужными параметрами по аналогии с похожими инструментами для других фреймворков (например, Spring Initializr). На момент публикации статьи Helidon реализует MicroProfile 1.2, тогда как последняя версия спецификации — 3.0.
      • плюсы
        • легковесность
          Позволяет подключать только те функции, которые непосредственно нужны для выполнения поставленной задачи;
        • параметры приложения
          Хорошие результаты по всем параметрам.
        • “заточен” под Kotlin, то есть, разрабатывать на Java, вроде, можно, но не нужно;
        • микрофреймворк (см. аналогичный пункт для Helidon SE).
        • проблеме с поиском специалистов;
        • увеличению времени на выполнение задач по сравнению со Spring Boot из-за необходимости явного конфигурирования требуемой функциональности.

        Micronaut

        • плюсы
          • AOT
            Как ранее было отмечено, AOT позволяет уменьшить время старта и потребляемую приложением память по сравнению с аналогом на Spring Boot;
          • Spring-подобная модель разработки
            У программистов с опытом разработки на Spring не займёт много времени освоение этого фреймворка;
          • параметры приложения
            Хорошие результаты по всем параметрам;
          • полиглот
            Поддержка на уровне first-class citizen языков Java, Kotlin, Groovy; возможно, будет поддержка Scala. На мой взгляд, это может положительно повлиять на рост сообщества. К слову, на июнь 2019 Groovy в рейтинге популярности языков программирования TIOBE занимает 14-е место, взлетев с 60-го годом ранее, таким образом, находясь на почётном втором месте среди JVM-языков;
          • проект Micronaut for Spring позволяет в том числе изменить среду выполнения имеющегося Spring Boot приложения на Micronaut (с ограничениями).

          Spring Boot

          • плюсы
            • зрелость платформы и экосистема
              Фреймворк “на каждый день”. Для бОльшей части повседневных задач уже есть решение в парадигме программирования Spring, т. е. привычным для многих программистов способом. Разработку упрощают концепции стартеров и автоконфигураций;
            • наличие большого количества специалистов на рынке труда, а также значительная база знаний (включая документацию и ответы на Stack Overflow);
            • перспектива
              Думаю, многие согласятся, что в ближайшем будущем Spring останется лидирующим каркасом разработки.
            • параметры приложения
              Приложение на этом фреймворке не было в числе лидеров, однако некоторые параметры, как было отмечено ранее, могут быть оптимизированы самостоятельно. Также стоит вспомнить о наличии находящегося в активной разработке проекта Spring Fu, использование которого позволяет уменьшить эти параметры.
            • менее развитая экосистема;
            • малое количество специалистов с опытом работы с этими технологиями;
            • большее время выполнения задач;
            • неясные перспективы.

            Не берусь судить о том, “выстрелит” ли тот или иной фреймворк в ближайшем будущем, поэтому, на мой взгляд, пока лучше продолжить наблюдать за развитием событий, используя имеющийся каркас разработки для решения рабочих задач.

            В то же время, как было показано в статье, новые фреймворки выигрывают у Spring Boot по рассмотренным параметрам полученных приложений. Если для какого-то из ваших микросервисов критически важны какие-либо из этих параметров, то, возможно, стоит обратить внимание на фреймворки, показавшие по ним лучшие результаты. Однако, не стоит забывать, что Spring Boot, во-первых, продолжает совершенствоваться, во-вторых, имеет огромную экосистему и с ним знакомы значительное количество Java-программистов. Есть и другие фреймворки, не освещённые в настоящей статье: Javalin, Quarkus и т. д.

            Spring Framework — один из самых популярных фреймворков для создания веб-приложений на Java. Несмотря на то, что Spring не обеспечивал какую-либо конкретную модель программирования, он стал широко распространённым в Java-сообществе главным образом как альтернатива и замена модели Enterprise JavaBeans. Spring предоставляет бо́льшую свободу Java-разработчикам в проектировании, так как Spring предлагает массу функций, которые недоступны в качестве стандартов Java EE, например, Spring Batch или Spring Integration; кроме того, он предоставляет хорошо документированные и лёгкие в использовании средства решения проблем, возникающих при создании приложений корпоративного масштаба. [Источник 2]

            Между тем, особенности ядра Spring применимы в любом Java-приложении, и существует множество расширений и усовершенствований для построения веб-приложений на Java Enterprise платформе. По этим причинам Spring приобрёл большую популярность и признаётся разработчиками как стратегически важный фреймворк.

            Содержание

            Структура

            Spring — это не один какой-то конкретный фреймворк. Это общее название для целого ряда небольших фреймворков, каждый из которых выполняет свою работу.

            У Spring модульная структура. Это позволяет подключать только те модули, которые нужны для нашего приложения и не подключать те, которыми заведомо не будем пользоваться. Именно этот подход и помог Spring обойти своего конкурента в то время (EJB) и захватить лидерство. [Источник 3] Данная структура показана на Рисунке 1.


            Spring состоит из нескольких модулей:

            Модуль data access содержит в себе средства для работы с данными (в основном, с базами данных), web — для работы в сети (в том числе и для создания веб-приложений).

            Кроме того, есть еще так-называемая целая спринг-инфраструктура: множество других проектов, которые не входят в сам фреймворк официально, но при этом бесшовно интегрируются в ваш проект на спринге (например, тот же spring security для работы с авторизацией пользователей на сайте).

            Компоненты Spring Framework

            Spring - огромный фреймворк, так как создатели охватили практически все области Java-приложений. Отсюда следует, что существует большое количество составных частей у Spring Framework (Данная схема фреймворка показана на Рисунке 2.):

            • IoC (Inversion of Control) контейнер;
            • AOP-фреймворк (включая интеграцию с AspectJ);
            • Data Access фреймворк;
            • Transaction management;
            • MVC-фреймворк;
            • Remote Access фреймворк;
            • Batch processing;
            • Фреймворк аутентификации и авторизации;
            • Remote Management;
            • Messaging-фреймворк;
            • Testing-фреймворк.

            DI/IoC

            IoC (Inversion of Control) — инверсия управления. При использовании библиотеки вы сами прописываете в своем коде какой метод какого объекта вызвать, а в случает с фреймворками — чаще всего уже фреймворк будет вызывать в нужный ему момент тот код, который уже написали. То есть, тут уже не вы управляете процессом выполнения кода/программы, а фреймворк это делает за вас. Вы передали ему управление (инверсия управления).

            Под DI(Dependency Injection) - внедрение зависимостей, это встраивание различных объектов в определённые классы.

            Spring MVC

            Ядро платформы, предоставляет базовые средства для создания приложений — управление компонентами (бинами, beans), внедрение зависимостей, MVC фреймворк, транзакции, базовый доступ к БД. В основном это низкоуровневые компоненты и абстракции. По сути, неявно используется всеми другими компонентами. Данный интерфейс изображен на Рисунке 3:


            Spring Security

            Spring Security это Java/JavaEE framework, предоставляющий механизмы построения систем аутентификации и авторизации, а также другие возможности обеспечения безопасности для корпоративных приложений, созданных с помощью Spring Framework. У Spring Security есть несколько характеристик: [Источник 4]

            • Авторизация и аутентификация;
            • доступ к данным, методам и т.п.;
            • OAuth;
            • LDAP;
            • куча разных провайдеров.

            Spring Boot

            Spring Boot позволяет избежать XML конфигурации, также настраивает ( т.е. приводит в порядок зависимости между компонентами) приложение, упаковывает его в исполняемый связующее звено, которое объединяет вместе набор компонентов в готовое приложение.

            Функции Spring Boot:

            • Он не использует кодогенерацию. Из кода, который генерится, присутствует только метод main. Если вы ищете утилиту для генерации приложений — это скорее JHipster
            • Не использует XML для конфигурации. Все конфигурится через аннотации
            • Используются автоконфигурации по максимуму. Если у вас добавлена зависимость на Mongo, и не указано, куда подключаться — Boot попробует localhost:27017
            • Используется convention over configuration. Для большинства конфигураций не нужно ничего настраивать
            • Его легко отодвинуть в сторону и "перекрыть" конфигурацию по умолчанию. Например, если в настройках указать хост для подключения к Монго — он автоматически перекроет localhost

            Преимущества Spring Framework

            Считается, что Spring Framework реализует модель разработки, основанную на лучших стандартах индустрии, и делает её доступной во многих областях Java. Таким образом к достоинствам Spring можно отнести:

            1. Относительная легкость в изучении и применении фреймворка в разработке и поддержке приложения.
            2. Внедрение зависимостей (DI) и инверсия управления (IoC) позволяют писать независимые друг от друга компоненты, что дает преимущества в командной разработке, переносимости модулей и т.д..
            3. Spring IoC контейнер управляет жизненным циклом Spring Bean и настраивается наподобие JNDI lookup (поиска).
            4. Проект Spring содержит в себе множество подпроектов, которые затрагивают важные части создания софта, такие как веб сервисы, веб программирование, работа с базами данных, загрузка файлов, обработка ошибок и многое другое. Всё это настраивается в едином формате и упрощает поддержку приложения.

            Аспектно-ориентированное программирование (Aspect Oriented Programming — AOP)

            Аспектно-ориентированное программирование (АОП) — это одна из “моделей программирования текущего момента” в мире Java. АОП предоставляет возможность реализации сквозной логики — т.е. логики, которая применяется к множеству частей приложения — в одном месте и обеспечения автоматического применения этой логики по всему приложению. Подход Spring к АОП заключается в создании “динамических прокси” для целевых объектов и “привязывании” объектов к конфигурированному совету для выполнения сквозной логики.

            Aspect, Advice, Pointcut, JointPoint и Advice Arguments в АОП

            Существуют пункты, из которых состоит аспектно-ориентированное программирование: [Источник 5]

            • Точка соединения (joinpoint) — это четко определенная точка во время выполнения приложения. Типовые примеры точек соединения включают обращение к методу, собственно Method Invocation, инициализацию класса и создание экземпляра объекта. Точки соединения являются ключевой концепцией АОП и определяют места в приложении, в которые можно вставлять дополнительную логику с использованием АОП.
            • Советы (advice). Фрагмент кода, который должен выполняться в отдельной точке соединения, представляет собой совет (advice). Существует несколько типов советов, среди которых перед, когда совет выполняется до точки соединения, и после, когда совет выполняется после точки соединения. В ООП совет принимает форму метода внутри класса.
            • Срез (pointcut) — это коллекция точек соединения, которая используется для определения ситуации, когда совет должен быть выполнен. Создавая срезы, вы получаете точный контроль над тем, как применять совет к компонентам приложения. Как упоминалось ранее, типичной точкой соединения является Method Invocation. А типичный срез представляет собой коллекцию всех точек соединения Method Invocation в отдельном классе. Часто между срезами можно установить сложные отношения, чтобы обеспечить дополнительные ограничения на то, когда будет выполнен совет.
            • Аспект (aspect) — это комбинация совета и срезов. Такая комбинация дает в результате определение логики, которая должна быть включена в приложение, и указание мест, где она должна выполняться.
            • Связывание (weaving) представляет собой процесс действительной вставки аспектов в определенную точку кода приложения. Для решений АОП времени компиляции это делается на этапе компиляции, обычно в виде дополнительного шага процесса сборки. Аналогично, для решений АОП времени выполнения связывание происходит динамически во время выполнения. В AspectJ поддерживается еще один механизм связывания под названием связывание во время загрузки (load-time weaving — LTW), который перехватывает лежащий в основе загрузчик классов JVM и обеспечивает связывание с байт-кодом, когда он загружается загрузчиком классов.
            • Цель (target) — это объект, поток выполнения которого изменяется каким-то процессом АОП. На целевой объект часто ссылаются как на объект, снабженный советом.
            • Введение (introduction) представляет собой процесс, посредством которого можно изменить структуру объекта за счет введения в него дополнительных методов или полей. Введение можно использовать для обеспечения реализации любым объектом определенного интерфейса без необходимости в том, чтобы класс этого объекта реализовывал такой интерфейс явно.

            Spring Bean

            Термин бин в Spring используется для ссылки на любой компонент, управляемый контейнером. Обычно бины на определенном уровне придерживаются спецификации JavaBean, но это не обязательно особенно если для связывания бинов друг с другом планируется применять Constructor Injection. Для получения экземпляра бина используется ApplicationContext. IoC контейнер управляет жизненным циклом спринг бина, областью видимости и внедрением.

            Scope у Spring Bean

            В Spring предусмотрены различные области времени действия бинов:

            Жизненный цикл Spring Bean

            Жизненный цикл Spring бина — время существования класса. Spring бины инициализируются при инициализации Spring контейнера и происходит внедрение всех зависимостей. Когда контейнер уничтожается, то уничтожается и всё содержимое. Если нам необходимо задать какое-либо действие при инициализации и уничтожении бина, то нужно воспользоваться методами init() и destroy(). Для этого можно использовать аннотации @PostConstruct и @PreDestroy().

            Читайте также: