introducción
El XNUMX de marzo, RedHat (próximamente IBM)
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
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
@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
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
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.
expansión
Quarkus es un marco extensible. Actualmente hay un pedido
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
Fuente: habr.com