Successfully reported this slideshow.
Your SlideShare is downloading. ×

Codemotion Madrid 2019 - ¡GraalVM y Micronaut: compañeros perfectos!

Ad

¡GraalVM y Micronaut:
compañeros perfectos!
Iván López - @ilopmar
24-25 September, 2019

Ad

Iván López @ilopmar
Iván López (@ilopmar)

Ad

Iván López @ilopmar
¿De qué vamos a hablar?

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Loading in …3
×

Check these out next

1 of 34 Ad
1 of 34 Ad

Codemotion Madrid 2019 - ¡GraalVM y Micronaut: compañeros perfectos!

Download to read offline

Micronaut es un framework para microservicios de la JVM que utiliza ahead-of-time (AoT) compilation en lugar de reflection. GraalVM es una nueva máquina virtual de Oracle que tiene la habilidad de compilar las aplicaciones Java a binarios nativos, haciendo que sea el compañero ideal de Micronaut. Con ambos el arranque de las aplicaciones es extremadamente rápido y el consumo de memoria muy pequeño. En esta charla aprenderás cómo sacar provecho a GraalVM en tus aplicaciones Micronaut convirtiéndolas a aplicaciones nativas y cómo funciona la integración de ambos frameworks.

Micronaut es un framework para microservicios de la JVM que utiliza ahead-of-time (AoT) compilation en lugar de reflection. GraalVM es una nueva máquina virtual de Oracle que tiene la habilidad de compilar las aplicaciones Java a binarios nativos, haciendo que sea el compañero ideal de Micronaut. Con ambos el arranque de las aplicaciones es extremadamente rápido y el consumo de memoria muy pequeño. En esta charla aprenderás cómo sacar provecho a GraalVM en tus aplicaciones Micronaut convirtiéndolas a aplicaciones nativas y cómo funciona la integración de ambos frameworks.

Advertisement
Advertisement

More Related Content

Advertisement

Codemotion Madrid 2019 - ¡GraalVM y Micronaut: compañeros perfectos!

  1. 1. ¡GraalVM y Micronaut: compañeros perfectos! Iván López - @ilopmar 24-25 September, 2019
  2. 2. Iván López @ilopmar Iván López (@ilopmar)
  3. 3. Iván López @ilopmar ¿De qué vamos a hablar?
  4. 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
  5. 5. Iván López @ilopmar GraalVM
  6. 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. 7. 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
  8. 8. Iván López @ilopmar Crear aplicación con soporte para GraalVM $ mn create-app basic-app --features=graal-native-image
  9. 9. 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.0.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 /home/app/basic-app . ENTRYPOINT ["./basic-app"]
  10. 10. 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
  11. 11. Iván López @ilopmar Native image native-image --no-server --class-path build/libs/basic-app-*-all.jar
  12. 12. Iván López @ilopmar ¿Cómo funciona? - Composable native-image.properties - src/main/resources/META-INF/native-image/ example.micronaut/app
  13. 13. 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
  14. 14. Iván López @ilopmar Soporte en Micronaut - @Introspected - @TypeHint - @ReflectiveAccess - src/main/graal/reflect.json personalizado - Graal TypeElementVisitor
  15. 15. 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.
  16. 16. 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
  17. 17. DEMO
  18. 18. Iván López @ilopmar Demo
  19. 19. 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.
  20. 20. 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
  21. 21. 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
  22. 22. Iván López @ilopmar Gitlab CI
  23. 23. Iván López @ilopmar Gitlab CI
  24. 24. Iván López @ilopmar Gitlab CI
  25. 25. Iván López @ilopmar Gitlab CI
  26. 26. Iván López @ilopmar Gitlab CI
  27. 27. Iván López @ilopmar Gitlab CI
  28. 28. Iván López @ilopmar Gitlab CI
  29. 29. Iván López @ilopmar Gitlab CI
  30. 30. Iván López @ilopmar Resumen GraalVM es una tecnología nueva e interesante Micronaut AoT es el complemento perfecto Soporte out-of-the-box en Micronaut Mejoras en cada release Arranque más rápido & menos consumo de memoria Desarrolladores contentos y productivos
  31. 31. SLIDE TITLE 27 PT ALL CAPS ¡Gracias! @ilopmar lopez.ivan@gmail.com https://github.com/ilopmar Iván López http://bit.ly/codemotion-mn-graal ¿Preguntas?

×