Manejar sesiones con Firestore

En este instructivo, se muestra cómo manejar sesiones en Cloud Run.

En muchas apps, se necesita controlar las sesiones para la autenticación y las preferencias del usuario. El framework de Jetty viene con una implementación basada en memoria para realizar esta función. Sin embargo, esta implementación no es adecuada para las apps que se pueden entregar desde varias instancias, ya que la sesión que se registra en una instancia puede diferir de las que se registran en otras. En este instructivo, se muestra cómo manejar sesiones en Cloud Run.

Objetivos

  • Escribe la aplicación.
  • Ejecuta la aplicación de manera local.
  • Implementa la aplicación en Cloud Run.

Costos

En este documento, usarás los siguientes componentes facturables de Google Cloud:

Para generar una estimación de costos en función del uso previsto, usa la calculadora de precios. Es posible que los usuarios nuevos de Google Cloud califiquen para obtener una prueba gratuita.

Cuando finalices las tareas que se describen en este documento, puedes borrar los recursos que creaste para evitar que continúe la facturación. Para obtener más información, consulta Cómo realizar una limpieza.

Antes de comenzar

  1. Accede a tu cuenta de Google Cloud. Si eres nuevo en Google Cloud, crea una cuenta para evaluar el rendimiento de nuestros productos en situaciones reales. Los clientes nuevos también obtienen $300 en créditos gratuitos para ejecutar, probar y, además, implementar cargas de trabajo.
  2. En la página del selector de proyectos de la consola de Google Cloud, selecciona o crea un proyecto de Google Cloud.

    Ir al selector de proyectos

  3. Asegúrate de que la facturación esté habilitada para tu proyecto de Google Cloud.

  4. Habilita la API de Firestore.

    Habilita la API

  5. En la página del selector de proyectos de la consola de Google Cloud, selecciona o crea un proyecto de Google Cloud.

    Ir al selector de proyectos

  6. Asegúrate de que la facturación esté habilitada para tu proyecto de Google Cloud.

  7. Habilita la API de Firestore.

    Habilita la API

  8. En Google Cloud Console, abre la app en Cloud Shell.

    Ir a Cloud Shell

    Cloud Shell brinda acceso de línea de comandos a los recursos en la nube directamente desde el navegador. Abre Cloud Shell en el navegador y haz clic en Continuar para descargar el código de muestra y pasar al directorio de la app.

  9. En Cloud Shell, configura la CLI de gcloud para usar tu proyecto de Google Cloud nuevo de la siguiente manera:
    # Configure gcloud for your project
    gcloud config set project YOUR_PROJECT_ID
    
  10. Actualiza Maven para usar Java 11 de forma predeterminada:
    sudo update-alternatives --config java
    
    Cuando se te solicite, ingresa el número para seleccionar Java 11. Toma nota de la ruta indicada para esa versión.
  11. Exporta la ruta de acceso que copiaste en el paso anterior como una variable de entorno:
    export JAVA_HOME=java-11-path
    

La app web

Esta app muestra saludos en diferentes idiomas para cada usuario. A los usuarios que regresan siempre se los recibe en el mismo idioma.

Varias ventanas de aplicaciones en las que se muestra un saludo en diferentes idiomas

Antes de que se puedan guardar las preferencias de un usuario en tu aplicación, necesitas una forma de almacenar información sobre el usuario actual en una sesión. Esta aplicación de muestra, se usa un WebFilter para recuperar y actualizar los datos de la sesión en Firestore.

@Override
public void init(FilterConfig config) throws ServletException {
  // Initialize local copy of datastore session variables.
  firestore = FirestoreOptions.getDefaultInstance().getService();
  sessions = firestore.collection("sessions");

  try {
    // Delete all sessions unmodified for over two days.
    Calendar cal = Calendar.getInstance();
    cal.setTime(new Date());
    cal.add(Calendar.HOUR, -48);
    Date twoDaysAgo = Calendar.getInstance().getTime();
    QuerySnapshot sessionDocs =
        sessions.whereLessThan("lastModified", dtf.format(twoDaysAgo)).get().get();
    for (QueryDocumentSnapshot snapshot : sessionDocs.getDocuments()) {
      snapshot.getReference().delete();
    }
  } catch (InterruptedException | ExecutionException e) {
    throw new ServletException("Exception initializing FirestoreSessionFilter.", e);
  }
}

El siguiente diagrama, se ilustra cómo Firestore maneja las sesiones para la aplicación Cloud Run.

Diagrama de arquitectura: usuario, Cloud Run, Firestore.

La HttpServletRequest usa una cookie a fin de almacenar un ID único para la sesión local, que corresponde a un documento en Firestore con los detalles de la sesión.

Borra sesiones

Firestore no borra las sesiones antiguas o vencidas. Puedes borrar los datos de las sesiones en Google Cloud Console o implementar una estrategia de eliminación automática. Cuando usas soluciones de almacenamiento para sesiones, como Memcache o Redis, las sesiones vencidas se borran de forma automática.

Ejecución local

  1. Inicia el servidor HTTP:

    mvn jetty:run
    
  2. Visualiza la app en el navegador web:

    Cloud Shell

    En la barra de herramientas de Cloud Shell, haz clic en Vista previa en la Web Vista previa en la Web y selecciona Vista previa en el puerto 8080.

    Máquina local

    En tu navegador, ve a http://localhost:8080.

    Ves uno de los cinco saludos: "Hola Mundo", "Hallo Welt", "Hola mundo", "Salut le Monde" o "Ciao Mondo". El idioma cambia si abres la página en un navegador diferente o en modo incógnito. Puedes ver y editar los datos de las sesiones en Google Cloud Console.

    Sesiones de Firestore en Cloud Console

  3. Para detener el servidor HTTP, presiona Control+C en la ventana de la terminal.

Implementa y ejecuta en Cloud Run

Puede usar Cloud Run para crear y, luego, implementar una aplicación que se ejecute de manera confiable bajo una gran carga y con grandes cantidades de datos.

  1. En la ventana de la terminal, crea y, luego, implementa una imagen del código en Google Container Registry (GCR) con el complemento Jib de Maven.

    mvn clean package jib:build

  2. Implementa la aplicación en Cloud Run:

       gcloud beta run deploy session-handling --image gcr.io/MY_PROJECT/session-handling 
    --platform managed --region us-central1 --memory 512M

    Reemplaza MY_PROJECT con la ID del proyecto en la nube que creaste. Visita la URL que muestra este comando para ver cómo persisten los datos de sesión entre las cargas de la página.

Depura la app

Si no puedes conectarte a la aplicación Cloud Run, verifica lo siguiente:

  1. Comprueba que los comandos de implementación de gcloud se completaron correctamente y no generaron ningún error. Si hubo errores (por ejemplo, message=Build failed), corrígelos y, luego, intenta implementar la aplicación Cloud Run nuevamente.
  2. En Cloud Console, ve a la página Explorador de registros.

    Ir a la página Explorador de registros

    1. En la lista desplegable Recursos seleccionados recientemente, haz clic en Aplicación de Cloud Run, y, luego, haz clic en All module_id. Verás una lista de las solicitudes de cuando visitaste la app. Si no la ves, asegúrate de haber seleccionado Todos los module_id en la lista desplegable. Si ves mensajes de error impresos en Cloud Console, comprueba que el código de la app coincida con el código de la sección sobre cómo escribir la app web.

    2. Asegúrate de que la API de Firestore esté habilitada.

Limpia

Borra el proyecto

  1. En la consola de Google Cloud, ve a la página Administrar recursos.

    Ir a Administrar recursos

  2. En la lista de proyectos, elige el proyecto que quieres borrar y haz clic en Borrar.
  3. En el diálogo, escribe el ID del proyecto y, luego, haz clic en Cerrar para borrar el proyecto.

Borra la instancia de Cloud Run

Borra el servicio de Cloud Run.

  • En Cloud Console, ve a la página Servicios de Cloud Run.

    Ir a la página de servicios

  • Selecciona el servicio que deseas borrar.
  • Haz clic en Borrar para borrar el servicio.

¿Qué sigue?