¡En este post iremos reactivos hasta el final!

Algunos clientes de Couchbase utilizan Vert.xun marco para escribir aplicaciones totalmente asíncronas, sabiendo que el SDK Java de Couchbase encaja bien en este cuadro, siendo asíncrono desde el principio y exponiendo un RxJava-API asíncrona.

Así que vamos a ver cómo ponerse en marcha rápidamente con un Couchbase Vertical que establece una conexión con Couchbase Grupo y Cubo sirve documentos JSON desde la base de datos, utilizando Java 8.

Esta entrada del blog asume que usted está familiarizado con el fundamentos de Vert.x. He aquí una breve tabla de contenidos:

Iniciar un nuevo proyecto Vert.x

Empecemos por crear un nuevo proyecto basado en Maven: crea una carpeta raíz para tu proyecto e inicializa una estructura de directorios maven (o utiliza tu arquetipo Maven favorito). Por ejemplo, puedes utilizar el siguiente comando "mkdir -p cbvertx/src/main/java/com/couchbase/demo/vertx/“.

Ahora vamos a iniciar el pom.xml en la raíz del proyecto:

Como puede ver, utilizaremos Vert.x versión 3.1.0 y su extensión para bindings en RxJava, SDK Java de Couchbase versión 2.2.2 y RxJava versión 1.0.15

Esqueleto de la vértebra

Basaremos nuestra CouchbaseVerticle en el ArtículoAbstracto en io.vertx.rxjava.core (de la extensión vertx-rx-java). Vamos a crear su esqueleto en el proyecto:

La fase init que escribiremos justo después mostrará cómo usar la configuración Vert.x para determinar en tiempo de ejecución desde qué nodo(s) del cluster Couchbase arrancaremos. Instanciación del CouchbaseCluster sigue siendo lo suficientemente ligero como para que se pueda hacer así durante el init.

Añade el siguiente método init a la directiva CouchbaseVerticle:

Obtención asíncrona de un cubo

El principal punto de entrada a la API de Couchbase es la aplicación Cubo para la API de sincronización, o AsyncBucket para la API asíncrona. Establecer la conexión con el cubo ("abrirlo") es mucho más pesado, por lo que debe hacerse de forma asíncrona.

Veamos cómo podemos iniciar nuestra Verticula abriendo primero el cubo que utilizaremos durante toda la vida de la Verticula. Queremos mantener una referencia a él, y utilizar la función start(Futuro startFuturo) para notificar de forma asíncrona a Vert.x que la Verticula está lista:

Observa que primero obtenemos el nombre del bucket (y la contraseña asociada si es relevante) dinámicamente, desde la configuración de Vert.x. Abrimos el bucket de forma asíncrona, estableciendo las conexiones y recursos internos del SDK.

En doOnNext se utiliza para registrar la apertura del cubo.

A continuación, nos suscribimos a nuestro Observable y describir cómo queremos "consumir" los datos finales:

  • al recibir la referencia del cubo, la almacenamos en un campo para su uso posterior
  • si hay un error en el camino, fallamos el arranque del Verticle usando el comando Futuro1TP5Fallo método.
  • de lo contrario, notificamos a Vert.x que la Verticle se ha iniciado correctamente mediante el comando Futuro#completo método.

Es un buen comienzo.

Desmontando con elegancia el SDK

Cuando el Verticle se detiene, los recursos creados por el SDK deben eliminarse correctamente. El sitio Grupo tiene un objeto desconectar que hace esto, llamando recursivamente a cerrar en cada Cubo que abrió (close se puede utilizar para deshacerse de un solo Bucket).

También desde 1.0.15 RxJava tiene un método para apagar sus Threads internos: Programadores.apagado. Esto debe ser invocado sólo cuando no habrá un uso posterior de RxJava en la aplicación, por lo que podría ser una mejor idea hacerlo al cerrar Vert.x...

Una vez más, detendremos la Verticle de forma asíncrona, utilizando un comando Futuro para notificar al marco la finalización de la parada:

(hemos optado por apagar RxJava al finalizar la desconexión del SDK)

Nota Puede ajustar el SDK pasando un parámetro CouchbaseEnvironment tras la creación del Grupo. En ese caso, le corresponde a usted también llamar a cierre en el entorno cuando se cierra todo el SDK (es decir, cuando se cierran todos los Clusters en los que se utilizó el entorno, generalmente sólo uno).

Si no ha creado un entorno específico, el SDK creará internamente uno y lo cerrará correctamente, cuyo resultado se ve arriba en la imagen isDisconnectedCleanly variable.

Verlo en acción

Vamos a crear un principal que incrusta Vert.x, despliega el Verticle y luego se detiene. Tenga en cuenta que esta es una implementación bastante ingenua con CountDownLatches, donde normalmente preferiría utilizar la línea de comandos o Lanzador como clase principal.

Si ejecutas esto, esto es lo que deberías ver (¿notas la diferencia en el formato de la marca de tiempo? 2015-12-11 son del SDK mientras que 11 de diciembre de 2015 son de Vert.x):

¿Cómo verificar el comportamiento del error? Podríamos simplemente cambiar la contraseña por una que sea incorrecta, sólo para comprobar los registros, que entonces se ven como:

Así que hemos desplegado (y detenido) con éxito nuestro primer Couchbase Verticle.
¡Choca esos cinco!

/! no olvides volver a cambiar la contraseña por la correcta

Ir más lejos

Intentemos hacer un poco más con este Verticle. ¿Qué tal si intentamos preparar datos de ejemplo en Couchbase y servirlos en un endpoint REST gestionado por Vert.x?

Creación de datos de muestra en Couchbase al inicio

Crearemos dos documentos de ejemplo en Couchbase durante el arranque del Verticle, los usuarios Alice y Bob.

Uno puede almacenar JSON en Couchbase usando dos Documento implementaciones:

  • JsonDocument es la predeterminada. Se basa en una representación JSON sencilla proporcionada por el SDK, la representación JsonObject.
  • Documento RawJson es útil cuando ya tienes JSON marshalling/unmarshalling en tu aplicación (u otra forma de representar JSON como el propio Vert.x's JsonObject). En esta implementación lo que se pasa es la representación JSON String sin procesar.

Aquí están Alice y Bob, creados utilizando ambas alternativas:

y

Ahora, el método de inicio necesita un pequeño ajuste. En lugar de guardar la referencia a la cubeta en la suscripción, vamos a mover que antes en un doOnNext. Después, crearemos los documentos y los convertiremos en observables utilizando Observable.just. Esto se puede enviar al SDK para su inserción utilizando flatMap:

El uso de upsert garantiza que los documentos se crearán, tanto si la clave ya existe en la base de datos como si no.

Servir datos JSON desde Couchbase

Modifiquemos nuestra verticula para que no se detenga de inmediato, en su lugar giraremos un Servidor HTTP que intentará recuperar un documento json de la base de datos y enviarlo a un cliente cuando la ruta usuario/{id} se utiliza:

He aquí una forma rápida y sucia de utilizar Vert.x's Lanzador para iniciar el programa (que no detendrá el núcleo Vert.x de inmediato). Sustituye el contenido de nuestro principal con lo siguiente:

Nota: En una aplicación real, Lanzador normalmente se convertiría en la clase principal del tarro y se pasarían los argumentos de la línea de comandos directamente.

Ahora hagamos girar un Servidor HTTP en el arranque de Verticle. Encadena el siguiente código en el directorio iniciar justo después del método flatMap(doc -> bucket.upsert(doc)) llamar:

Tenemos que crear el asa para configurar esa ruta:

Vamos a probarlo: ejecuta la aplicación y ve a esta url: http://localhost:8080/users/user1. Deberías ver el JSON de Alice, ¡servido directamente desde Couchbase!

Para otra llavedebería ver la excepción en formato JSON:

Detención del Verticle a través de un punto final HTTP

Añadamos rápidamente una ruta que pare Vert.x, por diversión y beneficio :)

Cierre de Couchbase y Vertx

Tenga en cuenta que si se ejecuta desde un Inicio vertx, esto no matará el hilo principal

"); vertx.close(); }

Apertura http://localhost:8080/stop hará que toda la aplicación Vert.x se detenga, destruyendo los Verticles desplegados.

Nota: Como se indica en el mensaje, esto no mata el proceso cuando se ejecuta desde el IDE.

Conclusión

En esta entrada de blog, hemos descubierto cómo Vert.x y el SDK Java de Couchbase pueden trabajar juntos para construir una aplicación totalmente asíncrona.

¡Feliz codificación asíncrona!

Autor

Publicado por Simon Basle, Ingeniero de Software, Pivotal

Simon Basl_ es un Ingeniero de Software residente en París que trabaja en el equipo Spring de Pivotal. Anteriormente, trabajó en el equipo de Couchbase Java SDK. Sus intereses abarcan aspectos de diseño de software (OOP, patrones de diseño, arquitectura de software), clientes ricos, lo que hay más allá del código (integración continua, (D)VCS, mejores prácticas) y programación reactiva. También es editor de la versión francesa de InfoQ.com.

1 Comentarios

  1. ¿tiene un enlace github repo donde la aplicación anterior está disponible

Dejar una respuesta