Создание микросервисов на Groovy с Micronaut
![2b35cd848783539590859dfd507e32db.png](https://habrastorage.org/getpro/habr/upload_files/2b3/5cd/848/2b35cd848783539590859dfd507e32db.png)
Привет, Хабр!
Micronaut — фреймворк для ЯП Groovy. Он предназначен для создания микросервисов и серверных приложений на JVM. Он был разработан с учетом всех недостатков и ограничений предыдущих фреймворков, таких как Spring и Grails.
В статье рассмотрим, как работать в Groovy с Micronaut на практическом примере.
Начало работы
Для работы с Micronaut требуется JDK версии 17 или выше. Можно загрузить JDK с оф. сайта Oracle или использовать одну из альтернативных дистрибуций, таких как OpenJDK.
После установки JDK желательно проверить, что переменная окружения JAVA_HOME
настроена правильно:
export JAVA_HOME=/path/to/your/jdk
export PATH=$JAVA_HOME/bin:$PATH
Micronaut CLI позволяет создавать проекты и управлять ими, установим:
sdk install micronaut
Для юзеров Windows вдобавок стоит установить SDKMAN! и использовать его для установки Micronaut CLI.
Для создания нового проекта Micronaut на Groovy есть команда в Micronaut CLI:
mn create-app example.micronaut.micronautguide --lang=groovy
Команда создаст новый проект с именем example.micronaut.micronautguide
, использующий Groovy в качестве основного ЯП.
После создания проекта будет следующая директория и файлы:
example.micronaut.micronautguide
├── build.gradle
├── src
│ ├── main
│ │ ├── groovy
│ │ │ └── example
│ │ │ └── micronaut
│ │ │ └── Application.groovy
│ │ └── resources
│ │ └── application.yml
│ └── test
│ ├── groovy
│ │ └── example
│ │ └── micronaut
│ │ └── ApplicationSpec.groovy
│ └── resources
├── gradle
│ └── wrapper
│ └── gradle-wrapper.properties
└── gradlew
└── gradlew.bat
build.gradle: файл конфигурации Gradle, в котором определяются зависимости и настройки сборки проекта.
src/main/groovy: основная директория для исходного кода на Groovy. Здесь находится главный класс приложения
Application.groovy
.src/main/resources: директория для ресурсов приложения, включая файл конфигурации
application.yml
.src/test/groovy: директория для тестового кода на Groovy. Здесь находится тестовый класс
ApplicationSpec.groovy
.gradle и gradlew: скрипты и конфигурации для сборки проекта с помощью Gradle.
Пошаговое создание микросервиса
Откроем файл build.gradle
и там убедимся, что зависимости для Groovy и Micronaut добавлены:
plugins {
id 'groovy'
id 'io.micronaut.application' version '3.0.0'
}
version '0.1'
group 'example.micronaut'
repositories {
mavenCentral()
}
dependencies {
implementation "io.micronaut:micronaut-runtime"
implementation "io.micronaut.groovy:micronaut-runtime-groovy"
testImplementation "io.micronaut.test:micronaut-test-spock"
testImplementation "org.spockframework:spock-core"
}
micronaut {
runtime "netty"
testRuntime "spock"
processing {
incremental true
annotations "example.micronaut.*"
}
}
Здесь подключаем необходимые плагины и зависимости. Плагин groovy
позволяет использовать Groovy в проекте, а io.micronaut.application
предоставляет возможности для работы с Micronaut.
Создание основного приложения
Создаем файл src/main/groovy/example/micronaut/Application.groovy
:
package example.micronaut
import io.micronaut.runtime.Micronaut
import groovy.transform.CompileStatic
@CompileStatic
class Application {
static void main(String[] args) {
Micronaut.run(Application, args)
}
}
Файл содержит основной класс приложения, который запускает Micronaut. Аннотация @CompileStatic
апдейтит производительность за счет статической компиляции Groovy-кода.
Создание контроллера
Создаем контроллер src/main/groovy/example/micronaut/HelloController.groovy
:
package example.micronaut
import groovy.transform.CompileStatic
import io.micronaut.http.annotation.Controller
import io.micronaut.http.annotation.Get
import io.micronaut.http.annotation.Produces
import io.micronaut.http.MediaType
@CompileStatic
@Controller("/hello")
class HelloController {
@Get
@Produces(MediaType.TEXT_PLAIN)
String index() {
"Hello World"
}
}
Контроллер обрабатывает GET-запросы на /hello
и возвращает строку »Hello World». Аннотация @Controller
указывает, что этот класс является контроллером, а аннотация @Get
указывает, что метод index
обрабатывает GET-запросы.
Настроим конфигурацию приложения
Открываем файл src/main/resources/application.yml
и добавляем конфигурацию:
micronaut:
application:
name: micronautguide
Файл конфигурации задает имя приложения.
Создание теста для контроллера
Создаем файл src/test/groovy/example/micronaut/HelloControllerSpec.groovy
:
package example.micronaut
import io.micronaut.http.HttpRequest
import io.micronaut.http.client.HttpClient
import io.micronaut.http.client.annotation.Client
import io.micronaut.test.extensions.spock.annotation.MicronautTest
import spock.lang.Specification
import jakarta.inject.Inject
@MicronautTest
class HelloControllerSpec extends Specification {
@Inject
@Client("/")
HttpClient client
void "test hello world response"() {
when:
HttpRequest request = HttpRequest.GET('/hello')
String rsp = client.toBlocking().retrieve(request)
then:
rsp == "Hello World"
}
}
Тст проверяет, что контроллер возвращает строку »Hello World» при GET-запросе на /hello
. Аннотация @MicronautTest
указывает, что это тест для Micronaut-приложения.
Добавим новый контроллер для работы с книгами и расширим функционал микросервиса.
Создаем файл src/main/groovy/example/micronaut/BookController.groovy
:
package example.micronaut
import groovy.transform.CompileStatic
import io.micronaut.http.annotation.Controller
import io.micronaut.http.annotation.Get
import io.micronaut.http.annotation.Produces
import io.micronaut.http.MediaType
@CompileStatic
@Controller("/books")
class BookController {
@Get
@Produces(MediaType.APPLICATION_JSON)
List listBooks() {
[
new Book("The Stand", "Stephen King"),
new Book("The Hobbit", "J.R.R. Tolkien")
]
}
}
@CompileStatic
class Book {
String title
String author
Book(String title, String author) {
this.title = title
this.author = author
}
}
Контроллер обрабатывает GET-запросы на /books
и возвращает список книг в формате JSON. Также создали класс Book
для представления книги.
Создаем файл src/test/groovy/example/micronaut/BookControllerSpec.groovy
:
package example.micronaut
import io.micronaut.http.HttpRequest
import io.micronaut.http.client.HttpClient
import io.micronaut.http.client.annotation.Client
import io.micronaut.test.extensions.spock.annotation.MicronautTest
import spock.lang.Specification
import jakarta.inject.Inject
@MicronautTest
class BookControllerSpec extends Specification {
@Inject
@Client("/")
HttpClient client
void "test list books response"() {
when:
HttpRequest request = HttpRequest.GET('/books')
List books = client.toBlocking().retrieve(request, List)
then:
books.size() == 2
books[0].title == "The Stand"
books[1].title == "The Hobbit"
}
}
Тест проверяет, что контроллер возвращает список из двух книг.
Запуск и тестирование приложения
Сборка и запуск приложения:
./gradlew run
Запуск тестов:
./gradlew test
После выполнения всех шагов приложение будет запущено и доступно по адресу http://localhost:8080/hello
, возвращая текст «Hello World», а также по адресу http://localhost:8080/books
, возвращая список книг. Тесты проверят правильность работы контроллеров.
Micronaut и Groovy — мощное сочетание для создания микросервисов. Подробнее с библиотекой можно ознакомиться здесь.
Материал подготовлен в рамках онлайн-курса «Groovy Developer».