
Introduccion
El 7 de marzo, RedHat (pronto IBM) presentó el nuevo marco, Quarkus . Según los desarrolladores, este marco se basa en GraalVM y OpenJDK HotSpot y está diseñado para Kubernetes. La pila Quarkus incluye: JPA / Hibernate, JAX-RS / RESTEasy, Eclipse Vert.x, Netty, Apache Camel, Kafka, Prometheus y otros.
El objetivo es hacer de Java la plataforma líder para implementar en Kubernetes y desarrollar aplicaciones sin servidor, proporcionando a los desarrolladores un enfoque unificado para desarrollar estilos reactivos e imperativos.
Si observa esta clasificación de marcos, Quarkus está en algún lugar entre "Agregadores / Generadores de Código" y "Marcos de alto nivel de pila completa". Esto ya es más que un agregador, pero tampoco alcanza la pila completa, porque terreno para el desarrollo del backend.
Se promete una velocidad de inicio de aplicaciones muy alta y un bajo consumo de memoria. Aquí están los datos del sitio del desarrollador:
Tiempo desde el comienzo hasta la primera respuesta (s):
Configuracion | DESCANSO | REST + JPA |
---|
Quarkus + GraalVM | 0,014 | 0,055 |
Quarkus + OpenJDK | 0,75 | 2.5 |
Pila tradicional nativa de la nube * | 4.3 4.3 | 9.5 |
Consumo de memoria (Mb):
Configuracion | DESCANSO | REST + JPA |
---|
Quarkus + GraalVM | 13 | 35 |
Quarkus + OpenJDK | 74 | 130 |
Pila tradicional nativa de la nube * | 140 | 218 |
Impresionante, ¿no es así?
* No encontré información sobre esta pila de tecnología, podemos suponer que se trata de algún tipo de Spring Boot con un kit de carrocería adicional .
Hola mundo
La aplicación más simple escrita en Quarkus se vería así:
@Path("/hello") public class GreetingResource { @GET @Produces(MediaType.TEXT_PLAIN) public String hello() { return "hello"; } }
¡Esto es literalmente una clase y suficiente! Puede iniciar la aplicación usando Maven en modo de desarrollo:
mvn compile quarkus:dev … $ curl http://localhost:8080/hello hello
A diferencia de la aplicación habitual, ¡no hay clase de aplicación! Quarkus admite la recarga en caliente, por lo que puede cambiar la aplicación sin reiniciarla, desarrollándose aún más rápido.
Que sigue Puede agregar un servicio al controlador utilizando la anotación Inject . Código de servicio:
@ApplicationScoped public class GreetingService { public String greeting(String name) { return "Hello " + name + "!"; } }
Controlador:
@Path("/hello") public class GreetingResource { @Inject GreetingService service; @GET @Produces(MediaType.TEXT_PLAIN) @Path("/{name}") public String greeting(@PathParam("name") String name) { return service.greeting(name); } }
$ curl http://localhost:8080/hello/developer Hello developer!
Tenga en cuenta que Quarkus utiliza anotaciones estándar de marcos familiares: CDI y JAX-RS. No necesita aprender nada nuevo si trabajó con CDI y JAX-RS antes de eso, por supuesto.
Trabajar con la base de datos
Usado por Hibernate y anotaciones JPA estándar para entidades. Al igual que con los controladores REST, debe escribir un mínimo de código. Es suficiente especificar las dependencias en el archivo de ensamblaje, organizar las anotaciones @Entity
y configurar la @Entity
datos en application.properties.
Eso es todo. No sessionFactory, persistence.xml y otros archivos de servicio. Escribimos solo el código que se necesita. Sin embargo, si es necesario, puede crear un archivo persistence.xml y configurar la capa ORM más finamente.
Quarkus admite el almacenamiento en caché de entidades, colecciones para relaciones uno a muchos, así como consultas. A primera vista, se ve muy bien, pero es el almacenamiento en caché local , para un solo host Kubernetes. Es decir Las memorias caché de diferentes nodos no están sincronizadas entre sí. Espero que esto sea temporal.
Ejecución asíncrona de código
Como se indicó anteriormente, Quarkus también admite un estilo de programación reactivo. El código de la aplicación anterior se puede escribir de otra forma.
@Path("/hello") public class GreetingResource { @GET @Produces(MediaType.TEXT_PLAIN) @Path("/{name}") public CompletionStage<String> greeting(@PathParam("name") String name) { return CompletableFuture.supplyAsync(() -> { return "Hello " + name + "!"; }); } }
El código asincrónico también se puede transferir al servicio, el resultado será el mismo.
Prueba
Las pruebas para aplicaciones Quarkus se pueden escribir en JUnit4 o JUnit5. La siguiente es una prueba de ejemplo para punto final, se escribió con RestAssured, pero puede usar otro marco:
@QuarkusTest public class GreetingResourceTest { @Test public void testGreetingEndpoint() { String uuid = UUID.randomUUID().toString(); given() .pathParam("name", uuid) .when().get("/hello/{name}") .then() .statusCode(200) .body(is("Hello " + uuid + "!")); } }
La anotación @QuarkusTest le dice que ejecute la aplicación antes de ejecutar las pruebas. El resto es familiar para todos los desarrolladores de código.
Dado que Quarkus está estrechamente integrado con GraalVM, por supuesto, se puede generar código específico de la plataforma. Para hacer esto, configure GraalVM y especifique la variable de entorno GRAALVM_HOME. A continuación, registre un perfil para el ensamblaje y especifíquelo al crear la aplicación:
mvn package -Pnative
Curiosamente, la aplicación generada se puede probar. Y esto es importante porque la ejecución del código "nativo" puede diferir de la ejecución en la JVM. Anotación @SubstrateTest ejecuta código de aplicación específico de la plataforma. La reutilización del código de prueba existente se puede hacer usando la herencia, como resultado, el código para probar la aplicación específica de la plataforma se verá así:
@SubstrateTest public class GreetingResourceIT extends GreetingResourceTest { }
La imagen generada puede empaquetarse en Docker y ejecutarse en Kubernetes u OpenShift, que se describe en detalle en las instrucciones .
Kit de herramientas
El marco Quarkus se puede usar con Maven y Gradle. Maven es totalmente compatible, a diferencia de Gradle. Desafortunadamente, en este momento Gradle no admite la generación de un proyecto vacío, el sitio tiene un tutorial detallado.
Extensiones
Quarkus es un marco extensible. Actualmente, hay alrededor de 40 extensiones que agregan varias funciones, desde soporte para el contenedor Spring DI y Apache Camel hasta el registro y la publicación de métricas para ejecutar servicios. Y ya existe una extensión para admitir aplicaciones de escritura en el lenguaje Kotlin, además de Java.
Conclusión
En mi opinión, Quarkus es una gran parte de las tendencias temporales. El desarrollo del código de back-end se está volviendo cada vez más fácil, y este marco simplifica y acelera aún más el desarrollo de servicios, agregando soporte "nativo" para Docker y Kubernetes. Una gran ventaja es el soporte integrado para GraalVM y la generación de imágenes específicas de la plataforma, lo que le permite hacer que los servicios sean realmente rápidos al iniciar y ocupar poco espacio en la memoria. Y esto es muy importante en nuestro tiempo de enorme entusiasmo por los microservicios y la arquitectura sin servidor.
El sitio web oficial es quarkus.io . Ejemplos de proyectos para un inicio rápido ya están en GitHub .