Publicidad
Publicidad

Más contenido relacionado

Más de Iván López Martín(20)

Publicidad

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. 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
  4. Iván López @ilopmar GraalVM
  5. 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)
  6. 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
  7. Iván López @ilopmar Crear aplicación con soporte para GraalVM $ mn create-app basic-app --features=graal-native-image
  8. 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"]
  9. 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
  10. Iván López @ilopmar Native image native-image --no-server --class-path build/libs/basic-app-*-all.jar
  11. Iván López @ilopmar ¿Cómo funciona? - Composable native-image.properties
  12. 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
  13. Iván López @ilopmar Soporte en Micronaut - @Introspected - @TypeHint - @ReflectiveAccess - src/main/graal/reflect.json personalizado - Graal TypeElementVisitor
  14. 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.
  15. 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
  16. DEMO
  17. Iván López @ilopmar Demo
  18. Iván López @ilopmar ¿Y la memoria?
  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. 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. 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
  22. Iván López @ilopmar Gitlab CI
  23. Iván López @ilopmar Gitlab CI
  24. Iván López @ilopmar Gitlab CI
  25. Iván López @ilopmar Gitlab CI
  26. Iván López @ilopmar Gitlab CI
  27. Iván López @ilopmar Gitlab CI
  28. Iván López @ilopmar Gitlab CI
  29. Iván López @ilopmar Gitlab CI
  30. Iván López @ilopmar Gitlab CI
  31. 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
  32. 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?
Publicidad