Локальный запуск micronaut без сервера
Я пытаюсь создать функцию AWS Lambda с помощью micronaut, используя функции, т.е. я создал свой проект poc с помощью:
mn create-function-app --build=maven --jdk=11 micronaut-test
Я могу очень легко собрать и развернуть его на AWS, но мне интересно, есть ли способ запустить его локально, чтобы я мог быстро протестировать изменения так же, как вы можете запустить обычное приложение Micronaut с
mvn mn:run
Прямо сейчас это всего лишь образец приложения, переформулирующий мой вопрос; Могу ли я запустить метод execute в BookRequestHandler, не загружая его в AWS?
Заранее спасибо.
2 ответа
Я хотел добиться того же результата, используя проект Micronaut с Gradle и Kotlin, и после долгих поисков это было единственное решение, которое я нашел. Теперь я хотел бы поделиться своим решением с другими, кто может столкнуться с той же проблемой при работе с Gradle.
Определите новую конфигурацию в файле build.gradle:
configurations {
create("localRuntime")
}
Добавьте зависимость времени выполнения Micronaut Netty в блок зависимостей:
dependencies {
...
localRuntime("io.micronaut:micronaut-http-server-netty:$micronautVersion")
}
Обязательно замените $micronautVersion соответствующей версией Micronaut. Создайте новую задачу Gradle для локального запуска проекта:
tasks.register('runLocal', JavaExec) {
print(configurations.getByName("localRuntime"))
classpath = configurations.getByName("localRuntime") + sourceSets.main.runtimeClasspath
mainClass = "com.example.ApplicationKt"
args("--micronaut.runtime=netty")
}
Запустите проект локально, используяrunLocal
задача:
gradle runLocal
МойApplication.kt
:
package com.example
import io.micronaut.runtime.Micronaut.run
fun main(args: Array<String>) {
run(*args)
}
Контроллер:
package com.example
import io.micronaut.http.annotation.Controller
import io.micronaut.http.annotation.Get
@Controller
class ExampleController {
@Get("/hello")
fun helloWorld() = mapOf("message" to "Hello World")
}
Профили Maven можно использовать для выбора среды выполнения (в этом примере используется netty) и основного класса:
<profiles>
<profile>
<id>local</id>
<properties>
<exec.mainClass>micronaut.Application</exec.mainClass>
<micronaut.runtime>netty</micronaut.runtime>
</properties>
<dependencies>
<dependency>
<groupId>io.micronaut</groupId>
<artifactId>micronaut-http-server-netty</artifactId>
<scope>compile</scope>
</dependency>
</dependencies>
</profile>
</profiles>
Создайте основной класс с контроллером с методом Post, который вызывает функцию
package micronaut;
import io.micronaut.http.annotation.Body;
import io.micronaut.http.annotation.Controller;
import io.micronaut.http.annotation.Post;
import io.micronaut.runtime.Micronaut;
import micronaut.test.Book;
import micronaut.test.BookRequestHandler;
import micronaut.test.BookSaved;
public class Application {
public static void main(String[] args) {
Micronaut.run(Application.class, args);
}
@Controller()
public static class LambdaController {
private static final BookRequestHandler handler = new BookRequestHandler();
@Post
public BookSaved execute(@Body Book book) {
return handler.execute(book);
}
}
}
и беги с
mvnw mn:run -Plocal
Теперь вы можете использовать
curl --location --request POST 'http://localhost:8080/' \
--header 'Content-Type: application/json' \
--data-raw '{"name": "Test"}'
возвращение
{
"name": "Test",
"isbn": "2a163c3d-4bd6-444d-914d-58daf3e649b8"
}
Это немного взломано, чтобы проверить свою функцию, вы можете просмотреть класс micronaut-test / src / test / java / micronaut / test / BookRequestHandlerTest.java или просмотреть официальные документы Testing Lambda Handlers .
Примечание. Для приложений, созданных с помощью mn create-app -f aws-lambda ... не требуется <exec.mainClass> в pom.xml, и создается Application.java.