SlideShare a Scribd company logo
1 of 35
Download to read offline
MAD · NOV 22-23 · 2019
Micronaut y GraalVM:
La combinación perfecta
Iván López
@ilopmar
Iván López @ilopmar
Iván López (@ilopmar)
- Desarrollador Java/Groovy
- Grails & Micronaut en OCI
- Coordinador de @MadridGUG
- Speaker: Devoxx, GeeCon, Commit, ConFoo,
Voxxed Days, RigaDev Days, Spring One 2GX,...
Iván López @ilopmar
GraalVM
- Universal Polyglot VM de Oracle
- Lenguajes de la JVM + Ruby, Python, JS, R
- Graal Compiler / JVMCI
- Truffle
- Substrate VM
Iván López @ilopmar
GraalVM
Iván López @ilopmar
Limitaciones
- Dynamic class loading (no soportado)
- Reflection (con configuración)
- Dynamic proxy (con configuración)
- Unsafe Memory Access (parcialmente)
- Class initializers (soportado)
- InvokeDynamic bytecode y method handlers (parcialmente)
- Lambda (soportado)
- Finalizers (no soportado)
- Threads (soportado)
Iván López @ilopmar
Micronaut
- Framework para microservicios en la JVM
- Ultra-ligero & reactive (basado en Netty)
- Java, Groovy & Kotlin
- Ahead of Time compilation (AoT)
- Sin reflection ni runtime proxies
- Arranque muy rápido
- Consumo de memoria bajo
- Natively Cloud Native
- Micronaut Data
- Soporte para GraalVM
Iván López @ilopmar
Crear aplicación con soporte para GraalVM
$ mn create-app basic-app
--features=graal-native-image
Iván López @ilopmar
Soporte en Micronaut para GraalVM
- Dependencias
- Dockerfile
compileOnly "com.oracle.substratevm:svm"
annotationProcessor "io.micronaut:micronaut-graal"
FROM oracle/graalvm-ce:19.2.1 as graalvm
COPY . /home/app/basic-app
WORKDIR /home/app/basic-app
RUN native-image --no-server -cp build/libs/basic-app-*-all.jar
FROM frolvlad/alpine-glibc
EXPOSE 8080
COPY --from=graalvm /opt/graalvm-ce-19.2.1/jre/lib/amd64/libsunec.so
/app/libsunec.so
COPY --from=graalvm /home/app/basic-app/basic-app /app/basic-app
ENTRYPOINT ["/app/basic-app", "-Djava.library.path=/app"]
Iván López @ilopmar
Soporte en Micronaut para GraalVM (II)
- native-image.properties
Args = -H:IncludeResources=logback.xml|application.yml|bootstrap.yml 
-H:Name=basic-app 
-H:Class=example.micronaut.Application
Iván López @ilopmar
Native image
native-image 
--no-server 
--class-path build/libs/basic-app-*-all.jar
Iván López @ilopmar
¿Cómo funciona?
- Composable native-image.properties
Iván López @ilopmar
Micronaut incluye todo lo necesario
# inject/native-image.properties
Args = -H:+ReportUnsupportedElementsAtRuntime 
--allow-incomplete-classpath 
-H:EnableURLProtocols=http,https
# http/native-image.properties
Args = -H:IncludeResources=META-INF/http/mime.types
# http-netty/native-image.properties
Args = --initialize-at-run-time=
io.netty.handler.codec.http.HttpObjectEncoder,io.netty.handler.codec.http.websocketx.WebSocket
00FrameEncoder,io.netty.handler.ssl.util.ThreadLocalInsecureRandom,com.sun.jndi.dns.DnsClient,
io.netty.handler.ssl.ConscryptAlpnSslEngine,io.netty.handler.ssl.JettyNpnSslEngine,io.netty.ha
ndler.ssl.ReferenceCountedOpenSslEngine,io.netty.handler.ssl.JdkNpnApplicationProtocolNegotiat
or,io.netty.handler.ssl.ReferenceCountedOpenSslServerContext,io.netty.handler.ssl.ReferenceCou
ntedOpenSslClientContext,io.netty.handler.ssl.util.BouncyCastleSelfSignedCertGenerator,io.nett
y.handler.ssl.ReferenceCountedOpenSslContext 
--initialize-at-build-time=io.netty
Iván López @ilopmar
Soporte en Micronaut
- @Introspected
- @TypeHint
- @ReflectiveAccess
- src/main/graal/reflect.json personalizado
- Graal TypeElementVisitor
Iván López @ilopmar
Depurar errores
[basic-app:15340] classlist: 14,103.05 ms
[basic-app:15340] (cap): 3,947.49 ms
[basic-app:15340] setup: 6,654.60 ms
[basic-app:15340] analysis: 68,716.43 ms
Error: No instances of io.netty.buffer.PooledByteBufAllocator are allowed in the image heap as this
class should be initialized at image runtime. Object has been initialized by the
io.micronaut.buffer.netty.NettyByteBufferFactory class initializer with a trace:
at io.netty.buffer.PooledByteBufAllocator.<init>(PooledByteBufAllocator.java:187)
at io.netty.buffer.PooledByteBufAllocator.<clinit>(PooledByteBufAllocator.java:168)
at io.netty.buffer.ByteBufUtil.<clinit>(ByteBufUtil.java:84)
at io.netty.buffer.ByteBufAllocator.<clinit>(ByteBufAllocator.java:24)
at io.micronaut.buffer.netty.NettyByteBufferFactory.<init>(NettyByteBufferFactory.java:62)
at io.micronaut.buffer.netty.NettyByteBufferFactory.<clinit>(NettyByteBufferFactory.java:44)
. To fix the issue mark io.netty.buffer.PooledByteBufAllocator for build-time initialization with
--initialize-at-build-time=io.netty.buffer.PooledByteBufAllocator or use the the information from
the trace to find the culprit and --initialize-at-run-time=<culprit> to prevent its instantiation.
. To fix the issue mark io.netty.buffer.PooledByteBufAllocator for build-time initialization with
--initialize-at-build-time=io.netty.buffer.PooledByteBufAllocator or use the the information from
the trace to find the culprit and --initialize-at-run-time=<culprit> to prevent its instantiation.
Iván López @ilopmar
Depurar errores
Detailed message:
Trace: object io.micronaut.buffer.netty.NettyByteBufferFactory
object io.micronaut.buffer.netty.NettyByteBufferFactory$$Lambda$95116b6497efb4cbd0dc7c4dc91186562d629e7b
object io.micronaut.core.convert.TypeConverter$$Lambda$802fd3b66b18a7bf114f797df2507ad969fcb1c0
object java.util.concurrent.ConcurrentHashMap$Node
object java.util.concurrent.ConcurrentHashMap$Node[]
object java.util.concurrent.ConcurrentHashMap
object io.micronaut.core.convert.DefaultConversionService
method io.micronaut.http.server.netty.NettyHttpResponseFactory.status(HttpStatus, String)
Call path from entry point to io.micronaut.http.server.netty.NettyHttpResponseFactory.status(HttpStatus, String):
at io.micronaut.http.server.netty.NettyHttpResponseFactory.status(NettyHttpResponseFactory.java:61)
at io.micronaut.http.HttpResponseFactory.status(HttpResponseFactory.java:74)
at io.micronaut.http.HttpResponse.serverError(HttpResponse.java:189)
at
io.micronaut.http.server.netty.RoutingInBoundHandler.lambda$exceptionCaughtInternal$3(RoutingInBoundHandler.java:403)
at io.micronaut.http.server.netty.RoutingInBoundHandler$$Lambda$1102/974221323.call(Unknown Source)
at io.netty.util.concurrent.ScheduledFutureTask.run(ScheduledFutureTask.java:140)
at java.lang.Thread.run(Thread.java:748)
at com.oracle.svm.core.thread.JavaThreads.threadStartRoutine(JavaThreads.java:460)
at com.oracle.svm.core.posix.thread.PosixJavaThreads.pthreadStartRoutine(PosixJavaThreads.java:193)
at com.oracle.svm.core.code.IsolateEnterStub.PosixJavaThreads_pthreadStartRoutine_e1f4a8c0039f8
Error: Use -H:+ReportExceptionStackTraces to print stacktrace of underlying exception
Error: Image build request failed with exit status 1
DEMO
Iván López @ilopmar
Demo
Iván López @ilopmar
¿Y la memoria?
Iván López @ilopmar
Y esto… ¿cómo se testea?
- Crear una imagen nativa tarda mucho
- Y necesita mucha RAM
- GraalVM cambia muy rápido (y a veces rompen cosas)...
- ...y nosotros también ;-)
- Usamos Travis para Micronaut, pero...
- ...Travis tiene límite para la RAM
- Necesitábamos otra opción.
Iván López @ilopmar
Tests usando Gitlab CI
- Job periódico cada hora
- Sólo si nuevos commit en Micronaut o Graal
- Compila Graal desde el código fuente
- Crea imágenes nativas de aplicaciones de prueba de Micronaut
- Ejecuta tests funcionales
- https://github.com/micronaut-graal-tests
- https://gitlab.com/micronaut-projects/micronaut-graal-tests
Iván López @ilopmar
Aplicaciones de prueba Micronaut-GraalVM
- Basic application: DI, serialización de POJO, tipos reactivos
- Micronaut function: AWS Function
- Service discovery: Soporte Consul & HTTP Client
- Static resources & views: Handlebars, Thymeleaf, Freemarker y Velocity
- Endpoints de Management & Metrics
- Distributed tracing: Zipkin
- RabbitMQ: Fire-and-forget & RPC
- Security con JWT
- Micronaut Data: H2, Postgresql, Oracle
Iván López @ilopmar
Gitlab CI
Iván López @ilopmar
Gitlab CI
Iván López @ilopmar
Gitlab CI
Iván López @ilopmar
Gitlab CI
Iván López @ilopmar
Gitlab CI
Iván López @ilopmar
Gitlab CI
Iván López @ilopmar
Gitlab CI
Iván López @ilopmar
Gitlab CI
Iván López @ilopmar
Gitlab CI
Iván López @ilopmar
Resumen
GraalVM es una tecnología
nueva e interesante
Cuidado con las
limitaciones y casos de
uso
Soporte out-of-the-box
en Micronaut
Mejoras en cada release Arranque más rápido &
menos consumo de
memoria
Desarrolladores
contentos y productivos
SLIDE TITLE 27 PT ALL CAPS
¡Gracias!
@ilopmar
lopez.ivan@gmail.com
https://github.com/ilopmar
Iván López
http://bit.ly/commit-mn-graal
¿Preguntas?

More Related Content

Similar to CommitConf 2019 - Micronaut y GraalVm: La combinación perfecta

Grails: Aumenta tu productividad en tus aplicaciones web Java
Grails: Aumenta tu productividad en tus aplicaciones web JavaGrails: Aumenta tu productividad en tus aplicaciones web Java
Grails: Aumenta tu productividad en tus aplicaciones web Java
Dani Latorre
 
Gwt seminario java_hispano_manolocarrasco
Gwt seminario java_hispano_manolocarrascoGwt seminario java_hispano_manolocarrasco
Gwt seminario java_hispano_manolocarrasco
Manuel Carrasco Moñino
 
Jesús Olmos - ChromeHack, a html5/chrome webhack tool [Rooted CON 2013]
Jesús Olmos - ChromeHack, a html5/chrome webhack tool [Rooted CON 2013]Jesús Olmos - ChromeHack, a html5/chrome webhack tool [Rooted CON 2013]
Jesús Olmos - ChromeHack, a html5/chrome webhack tool [Rooted CON 2013]
RootedCON
 
Un poco más allá con grails. PrimerViernes
Un poco más allá con grails. PrimerViernesUn poco más allá con grails. PrimerViernes
Un poco más allá con grails. PrimerViernes
Dani Latorre
 

Similar to CommitConf 2019 - Micronaut y GraalVm: La combinación perfecta (20)

Codemotion Madrid 2019 - ¡GraalVM y Micronaut: compañeros perfectos!
Codemotion Madrid 2019 - ¡GraalVM y Micronaut: compañeros perfectos!Codemotion Madrid 2019 - ¡GraalVM y Micronaut: compañeros perfectos!
Codemotion Madrid 2019 - ¡GraalVM y Micronaut: compañeros perfectos!
 
JRuby al Rescate de J2EE
JRuby al Rescate de J2EEJRuby al Rescate de J2EE
JRuby al Rescate de J2EE
 
JRuby Al Rescate J2EE
JRuby Al Rescate J2EEJRuby Al Rescate J2EE
JRuby Al Rescate J2EE
 
Lenguaje java
Lenguaje javaLenguaje java
Lenguaje java
 
Docker y PostgreSQL
Docker y PostgreSQLDocker y PostgreSQL
Docker y PostgreSQL
 
GraalVM - MálagaJUG 2018-11-29
GraalVM - MálagaJUG 2018-11-29GraalVM - MálagaJUG 2018-11-29
GraalVM - MálagaJUG 2018-11-29
 
Lenguaje Java
Lenguaje JavaLenguaje Java
Lenguaje Java
 
JConf Perú 2020 - ¡Micronaut en acción!
JConf Perú 2020 - ¡Micronaut en acción!JConf Perú 2020 - ¡Micronaut en acción!
JConf Perú 2020 - ¡Micronaut en acción!
 
Grails: Aumenta tu productividad en tus aplicaciones web Java
Grails: Aumenta tu productividad en tus aplicaciones web JavaGrails: Aumenta tu productividad en tus aplicaciones web Java
Grails: Aumenta tu productividad en tus aplicaciones web Java
 
Vaadin y Grails Barcamp 2013
Vaadin y Grails Barcamp 2013Vaadin y Grails Barcamp 2013
Vaadin y Grails Barcamp 2013
 
Gwt seminario java_hispano_manolocarrasco
Gwt seminario java_hispano_manolocarrascoGwt seminario java_hispano_manolocarrasco
Gwt seminario java_hispano_manolocarrasco
 
Jerónimo López | Introducción a GraalVM | Codemotion Madrid 2018
Jerónimo López | Introducción a GraalVM | Codemotion Madrid  2018  Jerónimo López | Introducción a GraalVM | Codemotion Madrid  2018
Jerónimo López | Introducción a GraalVM | Codemotion Madrid 2018
 
Jesús Olmos - ChromeHack, a html5/chrome webhack tool [Rooted CON 2013]
Jesús Olmos - ChromeHack, a html5/chrome webhack tool [Rooted CON 2013]Jesús Olmos - ChromeHack, a html5/chrome webhack tool [Rooted CON 2013]
Jesús Olmos - ChromeHack, a html5/chrome webhack tool [Rooted CON 2013]
 
40 Novedades de JavaSE 9
40 Novedades de JavaSE 940 Novedades de JavaSE 9
40 Novedades de JavaSE 9
 
Jruby On Rails. Ruby on Rails en la JVM
Jruby On Rails. Ruby on Rails en la JVMJruby On Rails. Ruby on Rails en la JVM
Jruby On Rails. Ruby on Rails en la JVM
 
Grails 2013 - PUCMM - Santiago - Sistemas
Grails 2013 - PUCMM - Santiago - SistemasGrails 2013 - PUCMM - Santiago - Sistemas
Grails 2013 - PUCMM - Santiago - Sistemas
 
Madrid-GUG - ¡Micronaut en acción!
Madrid-GUG - ¡Micronaut en acción!Madrid-GUG - ¡Micronaut en acción!
Madrid-GUG - ¡Micronaut en acción!
 
CommitConf 2023 - Spring Framework 6 y Spring Boot 3
CommitConf 2023 - Spring Framework 6 y Spring Boot 3CommitConf 2023 - Spring Framework 6 y Spring Boot 3
CommitConf 2023 - Spring Framework 6 y Spring Boot 3
 
Codemotion Madrid 2020 - Serverless con Micronaut
Codemotion Madrid 2020 - Serverless con MicronautCodemotion Madrid 2020 - Serverless con Micronaut
Codemotion Madrid 2020 - Serverless con Micronaut
 
Un poco más allá con grails. PrimerViernes
Un poco más allá con grails. PrimerViernesUn poco más allá con grails. PrimerViernes
Un poco más allá con grails. PrimerViernes
 

More from Iván López Martín

More from Iván López Martín (20)

SalmorejoTech 2024 - Spring Boot <3 Testcontainers
SalmorejoTech 2024 - Spring Boot <3 TestcontainersSalmorejoTech 2024 - Spring Boot <3 Testcontainers
SalmorejoTech 2024 - Spring Boot <3 Testcontainers
 
CommitConf 2024 - Spring Boot <3 Testcontainers
CommitConf 2024 - Spring Boot <3 TestcontainersCommitConf 2024 - Spring Boot <3 Testcontainers
CommitConf 2024 - Spring Boot <3 Testcontainers
 
Voxxed Days CERN 2024 - Spring Boot <3 Testcontainers.pdf
Voxxed Days CERN 2024 - Spring Boot <3 Testcontainers.pdfVoxxed Days CERN 2024 - Spring Boot <3 Testcontainers.pdf
Voxxed Days CERN 2024 - Spring Boot <3 Testcontainers.pdf
 
VMware - Testcontainers y Spring Boot
VMware - Testcontainers y Spring BootVMware - Testcontainers y Spring Boot
VMware - Testcontainers y Spring Boot
 
Spring IO 2023 - Dynamic OpenAPIs with Spring Cloud Gateway
Spring IO 2023 - Dynamic OpenAPIs with Spring Cloud GatewaySpring IO 2023 - Dynamic OpenAPIs with Spring Cloud Gateway
Spring IO 2023 - Dynamic OpenAPIs with Spring Cloud Gateway
 
Codemotion Madrid 2023 - Testcontainers y Spring Boot
Codemotion Madrid 2023 - Testcontainers y Spring BootCodemotion Madrid 2023 - Testcontainers y Spring Boot
Codemotion Madrid 2023 - Testcontainers y Spring Boot
 
Construyendo un API REST con Spring Boot y GraalVM
Construyendo un API REST con Spring Boot y GraalVMConstruyendo un API REST con Spring Boot y GraalVM
Construyendo un API REST con Spring Boot y GraalVM
 
jLove 2020 - Micronaut and graalvm: The power of AoT
jLove 2020 - Micronaut and graalvm: The power of AoTjLove 2020 - Micronaut and graalvm: The power of AoT
jLove 2020 - Micronaut and graalvm: The power of AoT
 
Developing Micronaut Applications With IntelliJ IDEA
Developing Micronaut Applications With IntelliJ IDEADeveloping Micronaut Applications With IntelliJ IDEA
Developing Micronaut Applications With IntelliJ IDEA
 
Greach 2019 - Creating Micronaut Configurations
Greach 2019 - Creating Micronaut ConfigurationsGreach 2019 - Creating Micronaut Configurations
Greach 2019 - Creating Micronaut Configurations
 
VoxxedDays Bucharest 2019 - Alexa, nice to meet you
VoxxedDays Bucharest 2019 - Alexa, nice to meet youVoxxedDays Bucharest 2019 - Alexa, nice to meet you
VoxxedDays Bucharest 2019 - Alexa, nice to meet you
 
JavaDay Lviv 2019 - Micronaut in action!
JavaDay Lviv 2019 - Micronaut in action!JavaDay Lviv 2019 - Micronaut in action!
JavaDay Lviv 2019 - Micronaut in action!
 
CrossDvlup Madrid 2019 - Alexa, encantado de conocerte
CrossDvlup Madrid 2019 - Alexa, encantado de conocerteCrossDvlup Madrid 2019 - Alexa, encantado de conocerte
CrossDvlup Madrid 2019 - Alexa, encantado de conocerte
 
Codemotion Madrid 2018 - Microservicios Reactivos con Micronaut
Codemotion Madrid 2018 - Microservicios Reactivos con MicronautCodemotion Madrid 2018 - Microservicios Reactivos con Micronaut
Codemotion Madrid 2018 - Microservicios Reactivos con Micronaut
 
Commit Conf 2018 - Alexa, encantado de conocerte
Commit Conf 2018 - Alexa, encantado de conocerteCommit Conf 2018 - Alexa, encantado de conocerte
Commit Conf 2018 - Alexa, encantado de conocerte
 
Devoxx Belgium 2018 - Micronaut in Action!
Devoxx Belgium 2018 - Micronaut in Action!Devoxx Belgium 2018 - Micronaut in Action!
Devoxx Belgium 2018 - Micronaut in Action!
 
Heisenbug 2018 - Test your Java applications with Spock
Heisenbug 2018 - Test your Java applications with SpockHeisenbug 2018 - Test your Java applications with Spock
Heisenbug 2018 - Test your Java applications with Spock
 
Codemotion Rome 2018 - Functional Java with Vavr
Codemotion Rome 2018 - Functional Java with VavrCodemotion Rome 2018 - Functional Java with Vavr
Codemotion Rome 2018 - Functional Java with Vavr
 
Greach 2018 - I've seen Grails code you wouldn't believe...
Greach 2018 - I've seen Grails code you wouldn't believe...Greach 2018 - I've seen Grails code you wouldn't believe...
Greach 2018 - I've seen Grails code you wouldn't believe...
 
Codemotion 2017 - Sé funcional con Java y Vavr
Codemotion 2017 - Sé funcional con Java y VavrCodemotion 2017 - Sé funcional con Java y Vavr
Codemotion 2017 - Sé funcional con Java y Vavr
 

Recently uploaded

Modulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdfModulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdf
AnnimoUno1
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial Uninove
FagnerLisboa3
 

Recently uploaded (15)

guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Joseph
 
presentacion de PowerPoint de la fuente de poder.pptx
presentacion de PowerPoint de la fuente de poder.pptxpresentacion de PowerPoint de la fuente de poder.pptx
presentacion de PowerPoint de la fuente de poder.pptx
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNIT
 
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdfRefrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
 
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
 
Desarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdfDesarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdf
 
Modulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdfModulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdf
 
Presentación de elementos de afilado con esmeril
Presentación de elementos de afilado con esmerilPresentación de elementos de afilado con esmeril
Presentación de elementos de afilado con esmeril
 
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptxPROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial Uninove
 
Presentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxPresentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptx
 
Avances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estosAvances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estos
 
Avances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvanaAvances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvana
 
Trabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíaTrabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnología
 
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptxEL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
 

CommitConf 2019 - Micronaut y GraalVm: La combinación perfecta

  • 1. MAD · NOV 22-23 · 2019 Micronaut y GraalVM: La combinación perfecta Iván López @ilopmar
  • 2. Iván López @ilopmar Iván López (@ilopmar) - Desarrollador Java/Groovy - Grails & Micronaut en OCI - Coordinador de @MadridGUG - Speaker: Devoxx, GeeCon, Commit, ConFoo, Voxxed Days, RigaDev Days, Spring One 2GX,...
  • 3.
  • 4. Iván López @ilopmar GraalVM - Universal Polyglot VM de Oracle - Lenguajes de la JVM + Ruby, Python, JS, R - Graal Compiler / JVMCI - Truffle - Substrate VM
  • 6. Iván López @ilopmar Limitaciones - Dynamic class loading (no soportado) - Reflection (con configuración) - Dynamic proxy (con configuración) - Unsafe Memory Access (parcialmente) - Class initializers (soportado) - InvokeDynamic bytecode y method handlers (parcialmente) - Lambda (soportado) - Finalizers (no soportado) - Threads (soportado)
  • 7.
  • 8. Iván López @ilopmar Micronaut - Framework para microservicios en la JVM - Ultra-ligero & reactive (basado en Netty) - Java, Groovy & Kotlin - Ahead of Time compilation (AoT) - Sin reflection ni runtime proxies - Arranque muy rápido - Consumo de memoria bajo - Natively Cloud Native - Micronaut Data - Soporte para GraalVM
  • 9. Iván López @ilopmar Crear aplicación con soporte para GraalVM $ mn create-app basic-app --features=graal-native-image
  • 10. Iván López @ilopmar Soporte en Micronaut para GraalVM - Dependencias - Dockerfile compileOnly "com.oracle.substratevm:svm" annotationProcessor "io.micronaut:micronaut-graal" FROM oracle/graalvm-ce:19.2.1 as graalvm COPY . /home/app/basic-app WORKDIR /home/app/basic-app RUN native-image --no-server -cp build/libs/basic-app-*-all.jar FROM frolvlad/alpine-glibc EXPOSE 8080 COPY --from=graalvm /opt/graalvm-ce-19.2.1/jre/lib/amd64/libsunec.so /app/libsunec.so COPY --from=graalvm /home/app/basic-app/basic-app /app/basic-app ENTRYPOINT ["/app/basic-app", "-Djava.library.path=/app"]
  • 11. Iván López @ilopmar Soporte en Micronaut para GraalVM (II) - native-image.properties Args = -H:IncludeResources=logback.xml|application.yml|bootstrap.yml -H:Name=basic-app -H:Class=example.micronaut.Application
  • 12. Iván López @ilopmar Native image native-image --no-server --class-path build/libs/basic-app-*-all.jar
  • 13. Iván López @ilopmar ¿Cómo funciona? - Composable native-image.properties
  • 14. Iván López @ilopmar Micronaut incluye todo lo necesario # inject/native-image.properties Args = -H:+ReportUnsupportedElementsAtRuntime --allow-incomplete-classpath -H:EnableURLProtocols=http,https # http/native-image.properties Args = -H:IncludeResources=META-INF/http/mime.types # http-netty/native-image.properties Args = --initialize-at-run-time= io.netty.handler.codec.http.HttpObjectEncoder,io.netty.handler.codec.http.websocketx.WebSocket 00FrameEncoder,io.netty.handler.ssl.util.ThreadLocalInsecureRandom,com.sun.jndi.dns.DnsClient, io.netty.handler.ssl.ConscryptAlpnSslEngine,io.netty.handler.ssl.JettyNpnSslEngine,io.netty.ha ndler.ssl.ReferenceCountedOpenSslEngine,io.netty.handler.ssl.JdkNpnApplicationProtocolNegotiat or,io.netty.handler.ssl.ReferenceCountedOpenSslServerContext,io.netty.handler.ssl.ReferenceCou ntedOpenSslClientContext,io.netty.handler.ssl.util.BouncyCastleSelfSignedCertGenerator,io.nett y.handler.ssl.ReferenceCountedOpenSslContext --initialize-at-build-time=io.netty
  • 15. Iván López @ilopmar Soporte en Micronaut - @Introspected - @TypeHint - @ReflectiveAccess - src/main/graal/reflect.json personalizado - Graal TypeElementVisitor
  • 16. Iván López @ilopmar Depurar errores [basic-app:15340] classlist: 14,103.05 ms [basic-app:15340] (cap): 3,947.49 ms [basic-app:15340] setup: 6,654.60 ms [basic-app:15340] analysis: 68,716.43 ms Error: No instances of io.netty.buffer.PooledByteBufAllocator are allowed in the image heap as this class should be initialized at image runtime. Object has been initialized by the io.micronaut.buffer.netty.NettyByteBufferFactory class initializer with a trace: at io.netty.buffer.PooledByteBufAllocator.<init>(PooledByteBufAllocator.java:187) at io.netty.buffer.PooledByteBufAllocator.<clinit>(PooledByteBufAllocator.java:168) at io.netty.buffer.ByteBufUtil.<clinit>(ByteBufUtil.java:84) at io.netty.buffer.ByteBufAllocator.<clinit>(ByteBufAllocator.java:24) at io.micronaut.buffer.netty.NettyByteBufferFactory.<init>(NettyByteBufferFactory.java:62) at io.micronaut.buffer.netty.NettyByteBufferFactory.<clinit>(NettyByteBufferFactory.java:44) . To fix the issue mark io.netty.buffer.PooledByteBufAllocator for build-time initialization with --initialize-at-build-time=io.netty.buffer.PooledByteBufAllocator or use the the information from the trace to find the culprit and --initialize-at-run-time=<culprit> to prevent its instantiation. . To fix the issue mark io.netty.buffer.PooledByteBufAllocator for build-time initialization with --initialize-at-build-time=io.netty.buffer.PooledByteBufAllocator or use the the information from the trace to find the culprit and --initialize-at-run-time=<culprit> to prevent its instantiation.
  • 17. Iván López @ilopmar Depurar errores Detailed message: Trace: object io.micronaut.buffer.netty.NettyByteBufferFactory object io.micronaut.buffer.netty.NettyByteBufferFactory$$Lambda$95116b6497efb4cbd0dc7c4dc91186562d629e7b object io.micronaut.core.convert.TypeConverter$$Lambda$802fd3b66b18a7bf114f797df2507ad969fcb1c0 object java.util.concurrent.ConcurrentHashMap$Node object java.util.concurrent.ConcurrentHashMap$Node[] object java.util.concurrent.ConcurrentHashMap object io.micronaut.core.convert.DefaultConversionService method io.micronaut.http.server.netty.NettyHttpResponseFactory.status(HttpStatus, String) Call path from entry point to io.micronaut.http.server.netty.NettyHttpResponseFactory.status(HttpStatus, String): at io.micronaut.http.server.netty.NettyHttpResponseFactory.status(NettyHttpResponseFactory.java:61) at io.micronaut.http.HttpResponseFactory.status(HttpResponseFactory.java:74) at io.micronaut.http.HttpResponse.serverError(HttpResponse.java:189) at io.micronaut.http.server.netty.RoutingInBoundHandler.lambda$exceptionCaughtInternal$3(RoutingInBoundHandler.java:403) at io.micronaut.http.server.netty.RoutingInBoundHandler$$Lambda$1102/974221323.call(Unknown Source) at io.netty.util.concurrent.ScheduledFutureTask.run(ScheduledFutureTask.java:140) at java.lang.Thread.run(Thread.java:748) at com.oracle.svm.core.thread.JavaThreads.threadStartRoutine(JavaThreads.java:460) at com.oracle.svm.core.posix.thread.PosixJavaThreads.pthreadStartRoutine(PosixJavaThreads.java:193) at com.oracle.svm.core.code.IsolateEnterStub.PosixJavaThreads_pthreadStartRoutine_e1f4a8c0039f8 Error: Use -H:+ReportExceptionStackTraces to print stacktrace of underlying exception Error: Image build request failed with exit status 1
  • 18. DEMO
  • 21. Iván López @ilopmar Y esto… ¿cómo se testea? - Crear una imagen nativa tarda mucho - Y necesita mucha RAM - GraalVM cambia muy rápido (y a veces rompen cosas)... - ...y nosotros también ;-) - Usamos Travis para Micronaut, pero... - ...Travis tiene límite para la RAM - Necesitábamos otra opción.
  • 22.
  • 23. Iván López @ilopmar Tests usando Gitlab CI - Job periódico cada hora - Sólo si nuevos commit en Micronaut o Graal - Compila Graal desde el código fuente - Crea imágenes nativas de aplicaciones de prueba de Micronaut - Ejecuta tests funcionales - https://github.com/micronaut-graal-tests - https://gitlab.com/micronaut-projects/micronaut-graal-tests
  • 24. Iván López @ilopmar Aplicaciones de prueba Micronaut-GraalVM - Basic application: DI, serialización de POJO, tipos reactivos - Micronaut function: AWS Function - Service discovery: Soporte Consul & HTTP Client - Static resources & views: Handlebars, Thymeleaf, Freemarker y Velocity - Endpoints de Management & Metrics - Distributed tracing: Zipkin - RabbitMQ: Fire-and-forget & RPC - Security con JWT - Micronaut Data: H2, Postgresql, Oracle
  • 34. Iván López @ilopmar Resumen GraalVM es una tecnología nueva e interesante Cuidado con las limitaciones y casos de uso Soporte out-of-the-box en Micronaut Mejoras en cada release Arranque más rápido & menos consumo de memoria Desarrolladores contentos y productivos
  • 35. SLIDE TITLE 27 PT ALL CAPS ¡Gracias! @ilopmar lopez.ivan@gmail.com https://github.com/ilopmar Iván López http://bit.ly/commit-mn-graal ¿Preguntas?