Buenas prácticas y tutoriales

Dale un poco de amor Ratpack a tu aplicación Spring Boot

Hace poco empecé a trabajar con Ratpack y me gusta bastante. Principalmente he hecho proyectos rápidos desde cero. Pero me gustaría usarlo en una aplicación Spring Boot existente para reemplazar la parte MVC tradicional. Esto es realmente fácil de hacer ya que todo ha sido pensado ya gracias a su Módulo de primavera.

Si sigues este blog quizás recuerdes un antiguo post sobre almacenamiento, indexación y búsqueda archivos con Couchbase y Spring Boot. Utilizaré el código relacionado como ejemplo. La idea es sustituir Spring MVC por Ratpack, y hacer que mis servicios heredados, síncronos y bloqueantes, sean asíncronos y no bloqueantes. El código resultante está disponible en github también.

Añadir las dependencias adecuadas

Estoy usando Gradle. Ratpack está muy bien integrado con él. Todo lo que necesitas hacer para añadir un módulo es añadir la dependencia correcta llamando a ratpack.dependency("miModuloFavorito"). Así que en nuestro caso, para añadir soporte para Spring Boot, es necesario añadir ratpack.dependency("spring-boot"). Desafortunadamente la versión gestionada automáticamente por Ratpack es inferior a 1.4.0.M3, que es la versión que trae la configuración automática de Couchbase. Así que esta vez tendré que añadir las dependencias manualmente.

Lo que se puede ver aquí es que ratpack.dependency("spring-boot") es un atajo para añadir org.springframework.boot:spring-boot-autoconfigure:1.4.0.M3 y io.ratpack:ratpack-spring-boot:1.3.3. Lo que este módulo te da es la capacidad de integrar un servidor Ratpack a tu aplicación Spring. Podrás recuperar @Beans de Spring desde el contexto de Ratpack y declarar manejadores como configuración de Spring.

Declarar la configuración de Ratpack

Una cosa que te tiene que encantar de Spring Boot es la autoconfiguración. Sólo necesitas asegurarte de que el SDK de Couchbase está en el classpath, y que la propiedad spring.couchbase.bootstrap-hosts se declara. En ese momento se instanciarán beans de Spring para un Bucket por defecto. Y esta instancia de bucket estará disponible como bean o en el contexto de Ratpack. Así que no tienes que declarar ningún binding para Couchbase en la capa de Ratpack.

Lo primero que se hace tradicionalmente con Ratpack es iniciar un servidor y definir la configuración y los manejadores. Aquí ya tenemos una aplicación Spring Boot ejecutándose. Todas las clases anotadas con @Configuration serán recogidas automáticamente y añadidas a la configuración de la aplicación. El primer paso para declarar esa configuración es crear una Clase que implemente RatpackServerCustomizer y anótelo con @Confguration. Te permite definir una lista de handlers, bindings y configuración del servidor. En el siguiente ejemplo estoy registrando algunas propiedades del servidor y vinculando varias clases al contexto de Ratpack. La propiedad 'server.maxContentLength' es el tamaño máximo de archivo que puedes subir.

El sistema de plantillas de la aplicación se basa en Handlebars, por lo que necesitas el HandlebarsModule. FileHandler se encargará de todas las llamadas a la API '/file' y StoredFileRenderer se asegurará de que StoredFile se muestre correctamente. Los dos últimos bindings son para la gestión de errores.

Lo más importante que ocurre aquí es la fileAPI que declara mi manejador. Un manejador define lo que sucede cuando un usuario accede a una URL en particular. Aquí asociamos cada llamada a '/file/*' a la clase FileHandler. También definimos el comportamiento para POST en '/fulltext' y '/n1ql'.

Ratpack utiliza promesas. Así que cuando analices un formulario procedente de una petición POST, obtendrás una promesa. Lo que puedes ver en cada uno de esos POST es que el SearchService se obtiene del contexto de Ratpack. Aunque nunca se haya vinculado en la configuración. Esto se debe a que los beans de Spring están disponibles en el contexto como parte de la integración.

El siguiente paso es llamar a ese servicio de búsqueda que devuelve un Observable. Podemos utilizar el módulo rx-java de Ratpack que proporciona un envoltorio para Observables. Envolverá esto como una promesa. Entonces puedes simplemente renderizar la respuesta.

En este punto nos deshicimos de todo el Spring MVC controladores. Como puedes ver mi servicio devuelve un Observable. Que no es el caso en mi aplicación anterior.

Migración de servicios para Ratpack

La mayoría de mis servicios se basan en Couchbase. El SDK está basado en RxJava por lo que es muy fácil convertir la mayoría de ellos a un modo asíncrono, no bloqueante y hacer que devuelvan Observable.

Uso de RxJava

Este es un ejemplo muy simple. Es una consulta N1QL que mapea los resultados a una Lista de Mapa. Las dos primeras líneas no cambian en absoluto, ya que son en su mayoría la definición de la consulta. Puedes ver que el mapeo se siente más natural cuando se utiliza el cubo síncrono en la segunda versión.

Se convierte en

¿Y el bloqueo del código heredado?

Algunos de mis servicios se basan en código antiguo y bloqueante. Aunque no hay una forma mágica de hacerlos no bloqueantes, podemos envolverlos fácilmente en una Promesa. Esto nos permitirá utilizarlos fácilmente en los Handlers. Envolver una llamada bloqueante es super fácil, todo lo que necesitas hacer es envolver tu función con 'Blocking.get()'. Aquí tienes un ejemplo muy sencillo:

se convierte en

Conclusión

Ahora ya sabes casi todo lo que necesitas saber para darle un poco de Ratpack Love a tu aplicación Spring Boot. Si sientes que falta algo, por favor ponte en contacto conmigo en twitter o en los comentarios a continuación.

Comparte este artículo
Recibe actualizaciones del blog de Couchbase en tu bandeja de entrada
Este campo es obligatorio.

Autor

Publicado por Laurent Doguin

Laurent es un metalero empollón que vive en París. Principalmente escribe código en Java y texto estructurado en AsciiDoc, y a menudo habla sobre datos, programación reactiva y otras cosas de moda. También fue Developer Advocate de Clever Cloud y Nuxeo, donde dedicó su tiempo y experiencia a ayudar a esas comunidades a crecer y fortalecerse. Ahora dirige las relaciones con los desarrolladores en Couchbase.

Deja un comentario

¿Listo para empezar con Couchbase Capella?

Empezar a construir

Consulte nuestro portal para desarrolladores para explorar NoSQL, buscar recursos y empezar con tutoriales.

Utilizar Capella gratis

Ponte manos a la obra con Couchbase en unos pocos clics. Capella DBaaS es la forma más fácil y rápida de empezar.

Póngase en contacto

¿Quieres saber más sobre las ofertas de Couchbase? Permítanos ayudarle.