Quarkus es un Java subatómico supersónico. Breve descripción general del marco

Quarkus es un Java subatómico supersónico. Breve descripción general del marco

introducción

El XNUMX de marzo, RedHat (próximamente IBM) presentado nuevo marco - cuarcus. Según los desarrolladores, este marco se basa en GraalVM y OpenJDK HotSpot y está diseñado para Kubernetes. La pila de 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 la implementación de Kubernetes y el desarrollo de aplicaciones sin servidor, proporcionando a los desarrolladores un enfoque unificado para el desarrollo tanto en estilos reactivos como imperativos.

Mirando a este clasificación de marcos, entonces Quarkus se encuentra en algún lugar entre "Agregadores/Generadores de código" y "Marcos completos de alto nivel". Esto ya es más que un agregador, pero ni siquiera llega al full-stack, porque... Diseñado para el desarrollo backend.

Se promete una velocidad muy alta de inicio de aplicaciones y un bajo consumo de memoria. Aquí están los datos del sitio web del desarrollador:

Tiempo desde el inicio hasta la primera(s) respuesta(s):

Configuración
RESTO
DESCANSO+JPA

Quarkus+GraalVM
0.014
0.055

Quarkus+OpenJDK
0.75
2.5

Pila nativa de la nube tradicional*
4.3
9.5

Consumo de memoria (Mb):

Configuración
RESTO
DESCANSO+JPA

Quarkus+GraalVM
13
35

Quarkus+OpenJDK
74
130

Pila nativa de la nube tradicional*
140
218

Impresionante, ¿no?

*No encontré ninguna información sobre esta pila de tecnología, podemos suponer que se trata de una especie de Spring Boot con un kit de carrocería adicional..

Hola Mundo!

La aplicación más sencilla escrita en Quarkus tendría este aspecto:

@Path("/hello")
public class GreetingResource {

   @GET
   @Produces(MediaType.TEXT_PLAIN)
   public String hello() {
       return "hello";
   }
}

¡Es literalmente una clase y es suficiente! Puede ejecutar la aplicación usando Maven en modo de desarrollo:

mvn compile quarkus:dev
…
$ curl http://localhost:8080/hello
hello

¡La diferencia con una aplicación normal es que no existe una clase de Aplicación! Quarkus admite la recarga en caliente, por lo que puede cambiar su aplicación sin reiniciarla, lo que hace que el desarrollo sea aún más rápido.

¿Que sigue? Puede agregar un servicio a un controlador usando una anotación Inyectar. 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 es necesario aprender nada nuevo si ya has trabajado con CDI y JAX-RS antes, por supuesto.

Trabajar con la base de datos

Se utilizan anotaciones JPA estándar y de Hibernación para entidades. Al igual que con los controladores REST, es necesario escribir un mínimo de código. Basta con indicar las dependencias en el archivo ensamblador, agregar anotaciones @Entity y configurar la fuente de datos en application.properties.

Todo. Sin sessionFactory, persistence.xml u otros archivos de servicio. Escribimos sólo el código que se necesita. Sin embargo, si es necesario, puede crear un archivo persistence.xml y configurar la capa ORM con mayor precisión.

Quarkus admite el almacenamiento en caché de entidades, colecciones para relaciones de uno a muchos y consultas. A primera vista parece genial, pero es local almacenamiento en caché, para un nodo de Kubernetes. Aquellos. Los cachés de diferentes nodos no están sincronizados entre sí. Espero que esto sea temporal.

Ejecución de código asincrónico

Como se mencionó anteriormente, Quarkus también admite el estilo de programación reactiva. 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 y el resultado será el mismo.

pruebas

Las pruebas para aplicaciones Quarkus se pueden escribir en JUnit4 o JUnit5. A continuación se muestra una prueba de ejemplo para un punto final, está escrita usando RestAssured, pero se 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 indica que ejecute la aplicación antes de ejecutar las pruebas. El resto es código familiar para todos los desarrolladores.

Aplicación específica de plataforma

Dado que Quarkus está estrechamente integrado con GraalVM, por supuesto, es posible generar código específico de la plataforma. Para hacer esto, necesita instalar GraalVM y especificar la variable de entorno GRAALVM_HOME. Más registrar un perfil para montaje 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. La 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 realizar mediante herencia; como resultado, el código para probar una aplicación dependiente de la plataforma se verá así:

@SubstrateTest
public class GreetingResourceIT extends GreetingResourceTest {

}

La imagen generada se puede empaquetar en Docker y ejecutar en Kubernetes u OpenShift, como se describe en detalle en instrucciones.

Kit de herramientas

El marco Quarkus se puede utilizar con Maven y Gradle. Maven es totalmente compatible, a diferencia de Gradle. Desafortunadamente, por el momento Gradle no admite la generación de un proyecto vacío; hay información detallada en el sitio web. libro de texto.

expansión

Quarkus es un marco extensible. Actualmente hay un pedido 40 extensiones, que agregan varias funciones, desde soporte Contenedor DI de resorte и Camello Apache antes de registrar y publicar métricas para los servicios en ejecución. Y ya existe una extensión para soportar la escritura de aplicaciones en Kotlin, además de Java.

Conclusión

En mi opinión, Quarkus está bastante en línea con las tendencias de la época. El desarrollo de código backend es cada vez más sencillo, y este marco simplifica y acelera aún más el desarrollo de servicios al agregar soporte nativo para Docker y Kubernetes. Una gran ventaja es el soporte integrado para GraalVM y la generación de imágenes dependientes de la plataforma, lo que permite que los servicios se inicien muy rápidamente y ocupen poco espacio en la memoria. Y esto es muy importante en nuestra época de pasión masiva por los microservicios y la arquitectura sin servidor.

Sitio oficial quarkus.io. Ya se encuentran disponibles ejemplos de proyectos para un inicio rápido en GitHub.

Fuente: habr.com

Añadir un comentario