Buenas prácticas y tutoriales

Uso de Couchbase en una aplicación de chat Golang Websocket

No hace mucho escribí sobre la creación de un aplicación de chat que utiliza Angular 2 para el front-end y Golang para el back-end. La comunicación de mensajes entre ambos era posible gracias a los websockets. En este ejemplo, cualquier número de clientes Angular 2 podían conectarse a la aplicación Golang y comunicarse entre sí, pero los nuevos clientes no podían ver los mensajes anteriores. Esto se debe a que los datos no se guardaban después de ser enviados.

Couchbase Golang Chat

Vamos a ampliar la aplicación Golang que se creó anteriormente e incluir Couchbase para que los mensajes se guarden una vez enviados y se carguen cuando se conecten nuevos clientes.

Requisitos

Hay algunos requisitos para poner en marcha este proyecto. Son los siguientes:

  • Couchbase Server 4.1+.
  • Golang 1.7+.
  • Un cliente y un servidor de chat en funcionamiento como se ve en el tutorial anterior.

Es muy importante que tengas el servidor de chat funcionando ya que mucho de lo que veremos será una revisita a lo hecho en la guía anterior. Incluir una base de datos Couchbase NoSQL será trivial, pero Couchbase con soporte para consultas N1QL debe estar ya instalado.

Creación de un bucket de servidor Couchbase y adición de un índice

Este proyecto requerirá la creación de al menos un bucket en Couchbase. Este bucket contendrá todos los datos de los mensajes enviados desde y hacia el servidor de chat Golang. Los datos almacenados serán algo parecido a esto:

Puede optar por utilizar Couchbase por defecto o crear uno nuevo. Voy a utilizar un cubo llamado ejemplo en este proyecto.

Dado que vamos a realizar consultas, necesitamos definir al menos un índice que pueda ser utilizado en nuestro bucket. Este índice puede crearse usando Couchbase Query Workbench o Couchbase Shell (CBQ). Usando una de estas herramientas, ejecuta lo siguiente:

Con el índice creado, la aplicación puede modificarse para incluir almacenamiento NoSQL.

Establecer una conexión con el servidor Couchbase

Antes de que podamos empezar a guardar datos en Couchbase, se debe establecer una conexión desde nuestra aplicación Go. Si has seguido las instrucciones guía anteriorsu aplicación Go podría encontrarse en una ruta similar a $GOPATH/src/github.com/nraboy/realtime-chat/main.go.

Antes de abrir tu archivo de código fuente, necesitas instalar el SDK de Golang para Couchbase. Se puede instalar ejecutando:

Con el SDK de Couchbase instalado, abra $GOPATH/src/github.com/nraboy/realtime-chat/main.go e incluya la siguiente línea fuera de cualquier función:

Hemos incluido la variable fuera de cualquier función porque queremos que sea global a nuestra aplicación, no local a una función en particular.

Dentro de la principal antes de la goroutine de nuestro gestor de clientes, queremos establecer una conexión con el cluster y abrir un bucket en particular. Esto se puede hacer de la siguiente manera:

En el escenario anterior me he conectado a mi nodo que se ejecuta localmente y he abierto el archivo ejemplo creado anteriormente.

En este punto Couchbase está listo para ser utilizado y podemos centrarnos en nuestro modelo de datos.

Definición del modelo de datos JSON de Couchbase

Anteriormente vimos el modelo de datos JSON propuesto, pero necesitamos hacerlo posible a través de Golang. Esto se hace mediante el uso de una estructura de datos Golang.

Cerca de las otras estructuras de datos existentes, se incluyen las siguientes:

Lo anterior Mensaje tiene propiedades asignadas a elementos JSON. Un elemento que no vamos a utilizar, pero que tendría sentido tener es el elemento Destinatario. Nunca se sabe si más adelante querrá enviar mensajes a clientes concretos.

Couchbase puede trabajar directamente con el Mensaje para guardar y leer datos. Para enviarlo a través de un websocket, se puede convertir en JSON.

Guardar y cargar mensajes con Couchbase

Esto nos lleva a guardar y cargar los datos. Tenemos la base de datos configurada con una conexión establecida. Tenemos nuestro modelo de datos. Ahora vamos a ponerlo en uso.

Para simplificar vamos a mantener cada documento id único. Esto se puede hacer a través de una biblioteca UUID que se puede instalar a través de la línea de comandos de esta manera:

Dentro de la aplicación añada un saveMessage como el siguiente:

Observe que estamos aceptando un Mensajegenerando una nueva clave de documento e introduciéndola en la base de datos. Esto significa que cada mensaje se almacenará como su propio documento.

¿Qué tal cargar los datos cuando se establece una conexión?

En el loadMessages aceptamos un Cliente que representará al cliente recién conectado. El cliente que desea obtener el historial de mensajes.

Se crea una consulta N1QL para obtener todos los mensajes y ordenarlos según el criterio marca de tiempo valor. Cada resultado de la consulta se transforma en JSON y se añade al canal del cliente para su envío.

¿Cómo utilizar estos dos métodos?

Cuando se establece una conexión websocket, el gestor de clientes registra al cliente para su difusión. Esto ocurre en el directorio iniciar método. En el iniciar hay una sentencia switch para el registro de clientes. Modifiquémosla para que tenga el siguiente aspecto:

Observe que después de registrar la conexión del cliente, tomamos la conexión y la pasamos a la función loadMessages que acabamos de crear. Esto enviará todos los mensajes almacenados previamente a ese cliente en particular.

Guardar los mensajes será un poco diferente.

En el tutorial anterior creamos un leer método. Modifíquelo para que tenga el siguiente aspecto:

Lo importante son las siguientes líneas:

El servidor recibirá un mensaje del cliente y construirá un verdadero Mensaje con información adicional como quién lo envió y cuándo. A continuación, este mensaje se guarda en la base de datos.

Intenta ejecutar la aplicación Golang de nuevo con el cliente Angular 2. Ahora debería guardar los mensajes.

Conclusión

Acabamos de ver cómo añadir Couchbase a una aplicación ejemplo anterior de websocket que escribí. En el ejemplo anterior teníamos una aplicación de chat cliente y servidor que se comunicaba usando websockets. Expandimos este ejemplo y empezamos a guardar los datos de los mensajes en Couchbase para que pudieran ser cargados por nuevos participantes del chat.

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

Autor

Publicado por Nic Raboy

Nic Raboy es un defensor de las tecnologías modernas de desarrollo web y móvil. Tiene experiencia en Java, JavaScript, Golang y una variedad de frameworks como Angular, NativeScript y Apache Cordova. Nic escribe sobre sus experiencias de desarrollo relacionadas con hacer el desarrollo web y móvil más fácil de entender.

2 Comentarios

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.