Перейти к основному содержимому

Micronaut против Spring Boot

· 7 мин. чтения

Задача: Сумма двух чисел

Напишите функцию twoSum. Которая получает массив целых чисел nums и целую сумму target, а возвращает индексы двух чисел, сумма которых равна target. Любой набор входных данных имеет ровно одно решение, и вы не можете использовать один и тот же элемент дважды. Ответ можно возвращать в любом порядке...

ANDROMEDA

1. Обзор

В этом уроке мы собираемся сравнить Micronaut и Spring Boot . Spring Boot — это часть популярной среды Spring, которая используется для быстрого запуска и запуска приложений Spring. Micronaut — это фреймворк на основе JVM, созданный для устранения некоторых недостатков Spring/Spring Boot.

Мы сравним две платформы в нескольких областях. Во-первых, мы сравним простоту создания нового приложения, языковую поддержку и другие параметры конфигурации. Затем мы рассмотрим два простых приложения REST. Наконец, мы сравним код и измерим различия в производительности.

2. Особенности

В следующих разделах мы разберем несколько функций двух фреймворков.

2.1. Настраивать

Во-первых, мы сравним простоту запуска и запуска нового приложения в двух средах.

И Micronaut, и Spring Boot предлагают несколько удобных способов создания новых приложений. Например, мы можем создать новое приложение, используя любой фреймворк с интерфейсом командной строки. В качестве альтернативы мы могли бы использовать Spring Initializr для Spring Boot или аналогичный инструмент для Micronaut под названием Launch .

Что касается поддержки IDE, мы можем использовать плагины Spring Boot для большинства популярных IDE, включая Eclipse Spring Tools Suite . У нас есть подключаемый модуль Micronaut, если мы используем IntelliJ.

2.2. Языковая поддержка

Когда мы обратимся к языковой поддержке, мы обнаружим, что она почти идентична для Spring Boot и Micronaut. Для обоих фреймворков мы можем выбирать между Java, Groovy или Kotlin . Если мы выбираем Java, обе платформы поддерживают Java 8, 11 и 17. Кроме того, мы можем использовать либо Gradle, либо Maven с обеими платформами.

2.3. Контейнер сервлетов

Используя Spring Boot, наше приложение будет использовать Tomcat по умолчанию. Однако мы можем настроить Spring Boot для использования Jetty или Undertow .

Наши приложения Micronaut по умолчанию будут работать на HTTP-сервере на базе Netty. Однако мы можем переключить наше приложение для работы на Tomcat, Jetty или Undertow.

2.4. Конфигурация свойств

Для Spring Boot мы можем определить наши свойства в application.properties или application.yml . Мы можем использовать соглашение application-{env}.properties , чтобы предоставить разные свойства для разных сред. Кроме того, мы можем переопределить свойства этих файлов приложений, используя системные свойства, переменные среды или атрибуты JNDI.

Мы можем использовать application.properties , application.yml и application.json для наших файлов свойств в Micronaut. Мы также можем использовать то же соглашение для предоставления файлов свойств, специфичных для среды. Если нам нужно переопределить какие-либо свойства, мы можем использовать системные свойства или переменные среды.

2.5. Поддержка обмена сообщениями

Если мы используем обмен сообщениями с Spring Boot, нам доступны Active MQ , Artemis, Rabbit MQ и Apache Kafka .

Со стороны Micronaut в качестве опций у нас есть Apache Kafka, Rabbit MQ и Nats.io.

2.6. Безопасность

Spring Boot предлагает пять стратегий авторизации: базовая, вход через форму, JWT, SAML и LDAP. Если мы используем Micronaut, у нас есть те же параметры, но без SAML.

Оба фреймворка предоставляют нам поддержку OAuth2 .

С точки зрения фактического применения безопасности обе платформы позволяют нам использовать аннотации для защиты методов.

2.7. Управление и мониторинг

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

Однако привод Spring Boot предоставляет несколько больше встроенных конечных точек, чем Micronaut.

2.8. Языки шаблонов

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

Для Spring Boot мы выбираем Thymeleaf , Apache Freemarker , Mustache и Groovy. Мы также можем использовать JSP, хотя это не рекомендуется.

У нас есть еще несколько опций, доступных в Micronaut: Thymeleaf, Handlebars, Apache Velocity, Apache Freemarker, Rocker, Soy/Closure и Pebbles.

2.9. Облачная поддержка

Приложения Spring Boot полагаются на сторонние библиотеки для многих облачных функций.

Micronaut изначально разработан для облачных микросервисов. Облачные концепции, которые Micronaut изначально будет обрабатывать для нас, включают распределенную конфигурацию, обнаружение сервисов, балансировку нагрузки на стороне клиента, распределенную трассировку и бессерверные функции.

3. Кодекс

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

Прежде чем мы углубимся в код, давайте рассмотрим существенную разницу между Spring Boot и Micronaut. Хотя две платформы обеспечивают внедрение зависимостей, они делают это по-разному. Наше приложение Spring Boot обрабатывает внедрение зависимостей во время выполнения, используя отражение и прокси. Напротив, наше приложение Micronaut создает данные для внедрения зависимостей при компиляции.

3.1. Приложение Spring Boot

Во-первых, давайте определим класс в нашем приложении Spring Boot с именем ArithmeticService :

@Service
public class ArithmeticService {
public float add(float number1, float number2) {
return number1 + number2;
}

public float subtract(float number1, float number2) {
return number1 - number2;
}

public float multiply(float number1, float number2) {
return number1 * number2;
}

public float divide(float number1, float number2) {
if (number2 == 0) {
throw new IllegalArgumentException("'number2' cannot be zero");
}
return number1 / number2;
}
}

Далее создадим наш REST-контроллер:

@RestController
@RequestMapping("/math")
public class ArithmeticController {
@Autowired
private ArithmeticService arithmeticService;

@GetMapping("/sum/{number1}/{number2}")
public float getSum(@PathVariable("number1") float number1, @PathVariable("number2") float number2) {
return arithmeticService.add(number1, number2);
}

@GetMapping("/subtract/{number1}/{number2}")
public float getDifference(@PathVariable("number1") float number1, @PathVariable("number2") float number2) {
return arithmeticService.subtract(number1, number2);
}

@GetMapping("/multiply/{number1}/{number2}")
public float getMultiplication(@PathVariable("number1") float number1, @PathVariable("number2") float number2) {
return arithmeticService.multiply(number1, number2);
}

@GetMapping("/divide/{number1}/{number2}")
public float getDivision(@PathVariable("number1") float number1, @PathVariable("number2") float number2) {
return arithmeticService.divide(number1, number2);
}
}

Наш контроллер имеет конечную точку для каждой из четырех арифметических функций.

3.2. Приложение Микронавта

Теперь давайте создадим сервисный слой нашего приложения Micronaut:

@Singleton 
public class ArithmeticService {
// implementation identical to the Spring Boot service layer
}

Далее мы напишем наш контроллер REST с теми же четырьмя конечными точками, что и приложения Spring Boot:

@Controller("/math")
public class ArithmeticController {
@Inject
private ArithmeticService arithmeticService;

@Get("/sum/{number1}/{number2}")
public float getSum(float number1, float number2) {
return arithmeticService.add(number1, number2);
}

@Get("/subtract/{number1}/{number2}")
public float getDifference(float number1, float number2) {
return arithmeticService.subtract(number1, number2);
}

@Get("/multiply/{number1}/{number2}")
public float getMultiplication(float number1, float number2) {
return arithmeticService.multiply(number1, number2);
}

@Get("/divide/{number1}/{number2}")
public float getDivision(float number1, float number2) {
return arithmeticService.divide(number1, number2);
}
}

Мы видим много общего между нашими очень простыми примерами приложений. Что касается различий, мы видим, что Micronaut использует преимущества аннотаций Java для внедрения, тогда как Spring Boot использует свои собственные. Кроме того, наши конечные точки REST Micronaut не требуют каких-либо специальных аннотаций для переменных пути, передаваемых в методы.

3.3. Базовое сравнение производительности

Micronaut рекламирует быстрое время запуска, поэтому давайте сравним наши два приложения.

Во-первых, давайте запустим приложение Spring Boot и посмотрим, сколько времени это займет:

[main] INFO  c.b.m.v.s.CompareApplication - Started CompareApplication in 3.179 seconds (JVM running for 4.164)

Далее посмотрим, как быстро запускается наше приложение Micronaut:

21:22:49.267 [main] INFO  io.micronaut.runtime.Micronaut - Startup completed in 1278ms. Server Running: http://localhost:57535

Мы видим, что наше приложение Spring Boot запускается чуть более чем за три секунды и чуть более одной секунды в Micronaut.

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

Начнем с приложения Spring Boot. Во-первых, давайте вызовем каждую из четырех арифметических конечных точек, а затем вытащим нашу конечную точку памяти:

Initial: 0.25 GB 
Used: 0.02 GB
Max: 4.00 GB
Committed: 0.06 GB

Далее давайте проделаем то же упражнение с нашим приложением Micronaut:

Initial: 0.25 GB 
Used: 0.01 GB
Max: 4.00 GB
Committed: 0.03 GB

В этом ограниченном примере оба наших приложения используют мало памяти, но Micronaut использует примерно вдвое меньше памяти, чем приложение Spring Boot.

4. Вывод

В этой статье мы сравнили Spring Boot с Micronaut. Во-первых, мы начали с обзора двух фреймворков. Затем мы рассмотрели несколько функций и сравнили варианты. Наконец, мы сравнили два простых примера приложений друг с другом. Мы взглянули на код обоих приложений, а затем рассмотрели запуск и производительность памяти.

Как всегда, пример кода доступен на GitHub как для Spring Boot , так и для приложения Micronaut .