Upgrade to Pro — share decks privately, control downloads, hide ads and more …

JConf Peru 2023 - Micronaut con Kotlin Coroutines

JConf Peru 2023 - Micronaut con Kotlin Coroutines

Micronaut es un framework completo para la construcción de microservicios. El framework ofrece un tiempo de arranque rápido, bajo de consumo de memoria, inyección eficiente de dependencias en tiempo de compilación y está diseñado para construir microservicios resistentes. Micronaut también soporta coroutines Kotlin. En esta charla, exploraremos cómo construir microservicios con coroutines. Veremos casos de uso para utilizar funciones suspending, scopes, y dispatchers. También nos sumergiremos en cómo probar el microservicio. Al final de esta charla, tendrás un buen punto de partida para utilizar Micronaut con coroutines.

Que veremos en esta sesión, un paso a paso de cómo crear un Microservicio usando Micronaut. Después de la sesión, usted sabrá con precisión: - Crear una API REST. - Coroutines. - Acceso a datos.

Carlos Zela Bueno

December 04, 2023
Tweet

More Decks by Carlos Zela Bueno

Other Decks in Programming

Transcript

  1. Agenda • Construir API REST • Coroutines • Acceso a

    Datos • Interruptores automáticos (Retries, Circuit breakers & FAllbacks)
  2. Micronaut es un moderno y ligero framework de microservicios para

    la JVM que está diseñado para construir aplicaciones rápidas, eficientes y escalables: • Facilmente testeables • Soporte para Java, Kotlin o Groovy • Creado por Graham Rose (Grails) Que es Micronaut?
  3. • Arranque rápido y memoria pequeña. • Uso mínimo de

    reflection y de proxies. • No genera bytecode en tiempo de ejecución. • Prueba unitarias sencillas. Beneficios
  4. Que es Kotlin? “Kotlin es un lenguaje de programación de

    tipado estático que se ejecuta en la máquina virtual Java (JVM). Fue desarrollado por JetBrains y ahora cuenta con el apoyo oficial de Google para el desarrollo de Android. Kotlin está diseñado para ser conciso, expresivo y seguro, por lo que es una opción ideal para el desarrollo de software moderno.” - Documentación de Kotlin
  5. • Soporte de Programación Reactivo. • Integración Perfecta. • Mejor

    Experiencia para el Desarrollador. • Mejor Rendimiento. Porque Micronaut & Kotlin ?
  6. Herramienta Micronaut CLI para la creación de proyectos • Descargar

    a través de SDKMAN • Generar la estructura inicial de la aplicación • Crear controladores, beans o clientes.
  7. Crear un Controller mn create-controller | Rendered controller to src/…/GreetingController.kt

    | Rendered test to src/test/…/GreetingControllerTest.kt com.perujug.micronautapp.Greeting
  8. Testing @MicronautTest class GreetingControllerTest { @Test fun `should get greeting`(spec:

    RequestSpecification) { val name = "Micronaut" spec .`when`() .get("/greet/$name") .then() .statusCode(200) .body(`is`("Greetings Micronaut")) } }
  9. • Creación del proyecto Micronaut. • Creación de un Controlador

    en Micronaut. • Prueba de la API REST con REST-Assured. Resumen
  10. Micronaut con Kotlin & Coroutines • Construir API REST •

    Coroutines • Acceso a Datos • Interruptores automáticos (Retries, Circuit breakers & FAllbacks)
  11. Micronaut es un moderno y ligero framework de microservicios para

    la JVM que está diseñado para construir aplicaciones rápidas, eficientes y escalables: • Facilmente testeables • Soporte para Java, Kotlin o Groovy • Creado por Graham Rose (Grails) Coroutines?
  12. Coroutines Suspend suspend fun doSomething() { println("Start") delay(1000) // Simulando

    una operación asíncrona println("End") } fun main() = runBlocking { println("Coroutine start") doSomething() println("Coroutine end") }
  13. Micronaut con Kotlin & Coroutines • Construir API REST •

    Coroutines • Acceso a Datos • Interruptores automáticos (Retries, Circuit breakers & FAllbacks) • Integración con Apache Kafka
  14. Task REST API • GET /tasks/list • GET /tasks/{taskId} •

    POST /tasks { “Id”: taskId “description”: “” }
  15. Task REST API • GET /tasks/list • GET /tasks/{taskId} •

    POST /tasks • PUT /tasks { “Id”: taskId “description”:“” }
  16. Task REST API • GET /tasks/list • GET /tasks/{taskId} •

    POST /tasks • PUT /tasks • DELETE /tasks/{taskId}
  17. Acceso a Datos - Entidad @Serdeable @MappedEntity data class Task

    ( val id : Long val description : String = “ ” )
  18. Acceso a Datos - Entidad @Serdeable @MappedEntity data class Task

    ( @field: Id val id: Long, val description: String )
  19. Acceso a Datos - Entidad @Serdeable @MappedEntity data class Task

    ( @field:Id @field:GeneratedValue(GeneratedValue.Type.AUTO) val id : Long val description : String )
  20. Task REST API • GET /tasks/list • GET /tasks/{taskId} •

    POST /tasks • PUT /tasks • DELETE /tasks/{taskId}
  21. Acceso a Datos - Service @Singleton class TaskService (@Inject private

    val repository: TaskRepository) { fun getAll(): Flow<Task> = repository.findAll() }
  22. Task REST API • GET /tasks/list • GET /tasks/{taskId} •

    POST /tasks • PUT /tasks • DELETE /tasks/{taskId}
  23. Acceso a Datos - Validación @Serdeable data class TaskCommand (

    @field:NotBlank val description: String )
  24. Acceso a Datos - Service @Singleton class TaskService (@Inject private

    val repository: TaskRepository) { suspend fun save(task: TaskCommand): Task { } }
  25. Acceso a Datos - Service @Singleton class TaskService (@Inject private

    val repository: TaskRepository) { suspend fun save(task: TaskCommand): Task { return repository.save(task.toModel()) } }
  26. Task REST API • GET /tasks/list • GET /tasks/{taskId} •

    POST /tasks • PUT /tasks • DELETE /tasks/{taskId}
  27. Acceso a Datos - Service @Singleton class TaskService (val repository:

    TaskRepository) { suspend fun delete(id: Long) : Boolean { val found = repository.existsById(id) if (found) { repository.deleteById(id) } return found } }
  28. Task REST API • GET /tasks/list • GET /tasks/{taskId} •

    POST /tasks • PUT /tasks • DELETE /tasks/{taskId}
  29. Acceso a Datos - Controller @Controller(“/tasks”) open class TaskController (private

    val service: TaskService) { @Get(“/list”) fun getAll() : Flow<Task> = service.getAll() }
  30. Task REST API • GET /tasks/list • GET /tasks/{taskId} •

    POST /tasks • PUT /tasks • DELETE /tasks/{taskId}
  31. Acceso a Datos - Controller @Controller(“/tasks”) open class TaskController (private

    val service: TaskService) { @Post open suspend fun create(@Body @Valid task: TaskCommand): HttpResponse<Task> { return HttpResponse.created(service.save(task) } }
  32. Task REST API • GET /tasks/list • GET /tasks/{taskId} •

    POST /tasks • PUT /tasks • DELETE /tasks/{taskId}
  33. Acceso a Datos - Controller @Controller(“/tasks”) open class TaskController (private

    val service: TaskService) { @Delete(“/{taskId}”) open suspend fun delete(taskId: Long) : HttpResponse<Task> { taskService.delete(taskId) return HttpResponse.noContent() } }
  34. • Configurar controlador para API REST. • HTTP Request &

    Response. • Acceso a Datos. • Creación de Cliente. Resumen
  35. Micronaut con Kotlin & Coroutines • Construir API REST •

    Coroutines • Acceso a Datos • Interruptores automáticos (Retries, Circuit breakers & FAllbacks)
  36. Controller @Controller(“/tasks”) open class TaskController (private val service: TaskService) {

    @Get(“/list”) fun getAll() : Flow<Task> = service.getAll() } Exception
  37. Micronaut con Kotlin & Coroutines • Construir API REST •

    Coroutines • Acceso a Datos • Interruptores automáticos (Retries, Circuit breakers & FAllbacks)
  38. Referencias • Kotlin Essentials book • Kotlin Coroutines book •

    Proyecto Recomendaciones • Pluralsight - Micronaut Fundamentals • Documentación de Micronaut