Введение в Micronaut: облачная платформа Java

автор vadim


Платформа Spring долгое время доминировала в разработке серверной части Java, но несколько новых платформ бросают вызов этому статус-кво. Micronaut – один из самых привлекательных. Micronaut, разработанный командой разработчиков Grails, создан для современных архитектур.

Эта статья представляет собой практическое введение в Micronaut. Мы начнем с простого приложения на основе RESTful API, проведем его рефакторинг для реактивного неблокирующего ввода-вывода (реактивного NIO), а затем кратко рассмотрим поддержку Micronaut для облачной разработки микросервисов и бессерверных архитектур.

Что особенного в Микронавте

Micronaut предоставляет множество преимуществ, почерпнутых из старых фреймворков, таких как Spring и Grails. Он заявлен как «исходно облачный», что означает, что он был создан с нуля для облачных сред. Его облачные возможности включают обнаружение среды, обнаружение сервисов и распределенную трассировку.

Micronaut также предлагает новый контейнер с инверсией управления (IoC), который использует упреждающую компиляцию (AoT) для более быстрого запуска. Компиляция AoT означает, что время запуска не увеличивается с увеличением размера кодовой базы. Это особенно важно для бессерверных и контейнерных развертываний, где узлы часто отключаются и активируются в ответ на спрос.

Micronaut — многоязычная JVM-инфраструктура, в настоящее время поддерживающая Java, Groovy и Kotlin, а поддержка Scala находится в разработке.

Наконец, Micronaut поддерживает реактивное программирование. Разработчики могут использовать ReactiveX или Reactor внутри платформы. Начиная с Micronaut 3, выпущенного в июле 2021 года, рекомендуемым подходом является Reactor. (Обратите внимание, что в новые выпуски в качестве транзитивных зависимостей не включены реактивные библиотеки.)

Начните работу с Micronaut

Micronaut легко установить в любую систему на базе Unix, включая Linux и macOS, через SDKMan. Если вы используете Windows, загрузите двоичный файл Micronaut и добавьте его в свой путь.

После завершения установки вы увидите mn инструмент, доступный в вашей командной строке.

Откройте ракушку и найдите удобное место. Тип mn create-app micronaut-idg --build maven. Micronaut поддерживает Gradle и Maven через оболочки, поэтому вам не нужно устанавливать сам инструмент сборки. Я предпочитаю Мавен. Если вам нравится Gradle, оставьте --build maven флаг в предыдущей команде.

Если вы запустите сервер с mvnw mn:runзатем вы можете нажать http://локальный хост:8080/ в вашем браузере, и он выдаст вам ответ JSON по умолчанию «не найден».

Если вы изучите макет проекта-примера, то увидите, что это стандартный проект Maven с main класс в src/main/java/micronaut/idg/Application.java. Обратите внимание, что main class запускает встроенный сервер. Когда вы вносите изменения в код, сервер разработки Micronaut автоматически обновляет работающее приложение.

Добавьте контроллер Micronaut

Как и в Spring MVC, вы можете добавлять классы контроллеров для сопоставления URL-адресов с обработчиками кода. Добавьте класс в src/main/java/micronaut/idg/controller/SimpleController. Давайте воспользуемся этим контроллером для создания текстового ответа, как показано в листинге 1.

Листинг 1. Использование контроллера Micronaut


package micronaut.idg.controller; 

import io.micronaut.http.MediaType; 
import io.micronaut.http.annotation.Controller; 
import io.micronaut.http.annotation.Get; 

@Controller("/simple") 
public class SimpleController { 

    @Get(produces = MediaType.TEXT_PLAIN) 
    public String index() { 
        return "A Simple Endpoint"; 
    } 
} 

Теперь вы можете увидеть, насколько легко вернуть ответ в формате JSON, как показано в листинге 2.

Листинг 2. Ответ в формате JSON


package micronaut.idg.controller; 

import io.micronaut.http.MediaType; 
import io.micronaut.http.annotation.Controller; 
import io.micronaut.http.annotation.Get; 

import java.util.Map; 
import java.util.HashMap; 

@Controller("/simple") 
public class SimpleController { 
 
    @Get(produces = MediaType.APPLICATION_JSON) 
    public Map index() { 
      Map msg = new HashMap(); 
      msg.put("message", "A simple message"); 
      return msg;   

    } 
} 

Листинг 2 демонстрирует интеллектуальную обработку Micronaut produces аргумент в пользу @Get аннотация. В этом случае он выдает заданный нами ответ в формате JSON.

Добавьте уровень сервиса Micronaut

Реализация IoC в Micronaut уникальна по своей сути, поскольку она запускается заранее, но при этом она по-прежнему является полной реализацией спецификации CDI (контексты и внедрение зависимостей). Это означает, что вы можете использовать все знакомые DI-аннотации, которые вы, вероятно, знаете из Spring (например, @Inject).

В листинге 3 мы подключим компонент сервисного уровня для предоставления сообщения. В реальном приложении этот класс может обращаться к хранилищу данных или другому удаленному API через компонент доступа к данным.

Создать src/main/java/micronaut/idg/service папку и добавьте два файла из листинга 3 — интерфейс (Simple) и его реализация (SimpleService).

Листинг 3. Создание простого компонента сервисного уровня


// Simple.java 
package micronaut.idg.service; 

public interface Simple { 
  public String getMessage(); 

} 

// SimpleService.java 
package micronaut.idg.service; 

import jakarta.inject.Singleton; 

@Singleton 
public class SimpleService implements Simple { 
  public String getMessage(){ 
    return "A simple service message"; 

  } 
} 

Теперь вы можете использовать новый уровень сервиса, внедрив его в SimpleController вы создали в листинге 1. В листинге 4 показан Constructor инъекция.

Листинг 4. Внедрение сервисного компонента в контроллер


@Controller("/simple") 
public class SimpleController { 

  @Inject 
  private final Simple simpleService; 

  public SimpleController(@Named("simpleService") Simple simple) {  // (1) 
    this.simpleService = simple; 

  } 

  @Get(produces = MediaType.APPLICATION_JSON) 
  public Map index() { 
    Map msg = new HashMap(); 
    msg.put("message", simpleService.getMessage()); 
    return msg; 
  } 
} 

Критическая работа выполняется в строке с комментарием «(1)», куда служебный компонент подключается по имени. Теперь, если вы посетите http://локальный хост:8080/простойвы увидите ответ от уровня сервиса: {"message":"A simple service message"}.

Реактивный NIO с Micronaut

Далее давайте рассмотрим использование Micronaut с Reactor. В этом случае мы просто проведем рефакторинг нашего текущего приложения для использования Reactor и неблокирующего ввода-вывода. Приложение будет выполнять ту же задачу, но с использованием неблокирующего стека Reactor и Netty.

Как я упоминал ранее, Micronaut 3 по умолчанию не включает реактивную библиотеку, поэтому начните с добавления ядра Reactor в ваш Maven POM, как показано в листинге 5.

Листинг 5. Добавление Reactor в pom.xml


<dependency> 
    <groupId>io.projectreactor</groupId> 
    <artifactId>reactor-core</artifactId> 
    <version>3.4.11</version> 
</dependency> 

Теперь вы можете вернуться в SimpleController и измените его, как показано в листинге 6.

Листинг 6. Сделайте контроллер неблокирующим


import reactor.core.publisher.Mono; 

//... 

@Get 
  public Mono<map> index() { 
    Map msg = new HashMap(); 
    msg.put("message", simpleService.getMessage()); 
    return Mono.just(msg); 
  } 
} 

Как видите, мы просто оборачиваем один и тот же тип возвращаемого значения (карту string/string) с реактором Mono сорт.

Аналогичная поддержка существует для реактивного использования удаленных сервисов, поэтому вы можете запускать приложение полностью на неблокирующем вводе-выводе.

Использование интерфейса командной строки Micronaut для создания новых компонентов

Вы можете использовать инструмент командной строки Micronaut для блокировки компонентов. Например, если вы хотите добавить новый контроллер, вы можете использовать команду mn add-controller MyController. В результате выводится новый контроллер и тесты для него, как показано в листинге 7.

Листинг 7. Создание нового контроллера с помощью командной строки Micronaut


mn create-controller MyController 
| Rendered controller to src/main/java/micronaut/idg/MyControllerController.java 
| Rendered test to src/test/java/micronaut/idg/MyControllerControllerTest.java 

Облачная разработка с Micronaut

Ранее я упоминал, что Micronaut был создан с нуля для облачных микросервисов и бессерверной разработки. Одна из облачных концепций, которую поддерживает Micronaut, — это федерация. Идея федерации заключается в том, что несколько небольших приложений используют одни и те же настройки и могут быть развернуты в тандеме. Если это очень похоже на архитектуру микросервисов, вы правы. Цель — упростить разработку микросервисов и сохранить управляемость. Дополнительную информацию о федеративных сервисах см. в документации Micronaut.

Micronaut также упрощает выбор облачных сред для развертывания. Например, вы можете настроить таргетинг на реестр Docker Google Cloud Platform, как показано в листинге 8.

Листинг 8. Развертывание приложения Micronaut с использованием реестра Docker GCP


./mvnw deploy \ 
     -Dpackaging=docker \ 
     -Djib.to.image=gcr.io/my-org/my-project:latest 

В этом случае проект будет помещен в реестр GCP Docker как образ Docker. Обратите внимание, что мы использовали плагин Jib Maven, который превращает проект Java в образ Docker, не требуя создания реального файла Docker.

Также обратите внимание, что мы определили Docker как инструмент упаковки с помощью -Dpackaging=docker. После завершения упаковки вы можете развернуть проект с помощью инструмента командной строки GCP, как показано в листинге 9.

Листинг 9. Запуск образа Docker из командной строки


gcloud run deploy \ 
    --image=gcr.io/my-org/my-project:latest \ 
    --platform managed \ 
    --allow-unauthenticated

Трассировка — еще одна облачная функция, которую поддерживает Micronaut. Например, Micronaut позволяет довольно просто включить распределенную трассировку Jaeger с помощью аннотаций.

В листинге 10 Jaeger настраивает отслеживание всех запросов в приложении микросервиса. application.xml файл.

Листинг 10. Конфигурация Jaeger в файле application.xml


tracing: 
  jaeger: 
    enabled: true 
    sampler: 
      probability: 1 

Заключение

Micronaut предоставляет набор функций, которые прекрасно подходят для разработки облачных технологий и микросервисов. В то же время платформа делает более традиционную разработку на основе API простой и понятной. И он хорошо интегрируется с Reactor и Netty для реактивного NIO.

Micronaut работает рядом с Quarkus, Dropwizard и другими облачными Java-фреймворками. Это обновленная альтернатива существующим решениям.

Related Posts

Оставить комментарий