Como gerenciar sessões com o Firestore

Este tutorial mostra como lidar com sessões no Cloud Run.

Muitos aplicativos precisam gerenciar sessões de autenticação e preferências do usuário. O framework Jetty vem com uma implementação baseada em memória para executar esta função. No entanto, essa implementação não é adequada para um aplicativo que pode ser veiculado de várias instâncias, porque a sessão gravada em uma instância pode ser diferente nas outras. Este tutorial mostra como lidar com sessões no Cloud Run.

Objetivos

  • Gravar o aplicativo.
  • Executar o aplicativo localmente.
  • Implantar o aplicativo no Cloud Run.

Custos

Neste tutorial, usamos os seguintes componentes faturáveis do Google Cloud:

Para gerar uma estimativa de custo baseada na projeção de uso deste tutorial, use a calculadora de preços. Novos usuários do Google Cloud podem ser qualificados para uma avaliação gratuita.

Ao concluir este tutorial, exclua os recursos criados para evitar o faturamento contínuo. Para mais informações, consulte Como fazer a limpeza.

Antes de começar

  1. Faça login na sua conta do Google Cloud. Se você começou a usar o Google Cloud agora, crie uma conta para avaliar o desempenho de nossos produtos em situações reais. Clientes novos também recebem US$ 300 em créditos para executar, testar e implantar cargas de trabalho.
  2. No Console do Google Cloud, na página do seletor de projetos, selecione ou crie um projeto do Google Cloud.

    Acessar o seletor de projetos

  3. Verifique se o faturamento está ativado para seu projeto na nuvem. Saiba como confirmar se o faturamento está ativado para o projeto.

  4. Ative a API Firestore.

    Ative a API

  5. No Console do Google Cloud, abra o app no Cloud Shell.

    Acesse o Cloud Shell

    O Cloud Shell oferece acesso por linha de comando aos seus recursos de nuvem diretamente no navegador. Abra o Cloud Shell no navegador e clique em Continuar para fazer o download do código de amostra e carregá-lo no diretório de aplicativos.

  6. No Cloud Shell, configure a ferramenta gcloud para usar seu novo projeto do Google Cloud:
    # Configure gcloud for your project
    gcloud config set project YOUR_PROJECT_ID
    
  7. Atualize o Maven para usar o Java 11 por padrão:
    sudo update-alternatives --config java
    
    Quando solicitado, digite o número para selecionar Java 11. Anote o caminho listado para essa versão.
  8. Exporte o caminho que você copiou na etapa anterior como uma variável de ambiente:
    export JAVA_HOME=java-11-path
    

O app da Web

Esse aplicativo exibe saudações em idiomas diferentes para cada usuário. Usuários recorrentes são sempre recebidos no mesmo idioma.

Várias janelas de aplicativos exibindo uma saudação em idiomas diferentes.

Para que o app possa armazenar as preferências de um usuário, você precisa de uma maneira de armazenar informações sobre o usuário atual em uma sessão. Este aplicativo de exemplo usa um WebFilter para recuperar e atualizar dados da sessão no 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);
  }
}

O diagrama a seguir ilustra como o Firestore lida com sessões para o aplicativo Cloud Run.

Diagrama da arquitetura: usuário, Cloud Run, Firestore.

O HttpServletRequest usa um cookie para armazenar um ID exclusivo para a sessão local, que corresponde a um documento no Firestore com os detalhes da sessão.

Como excluir sessões

O Firestore não exclui sessões antigas ou expiradas. É possível excluir dados da sessão no Console do Google Cloud ou implementar uma estratégia de exclusão automática. Se você usar soluções de armazenamento para sessões como Memcache ou Redis, as sessões expiradas serão excluídas automaticamente.

Como executar no local

  1. Inicie o servidor HTTP:

    mvn jetty:run
    
  2. Veja seu app no navegador da Web:

    Cloud Shell

    Na barra de ferramentas do Cloud Shell, clique em Visualização da Web Visualização da Web e selecione Visualizar na porta 8080.

    Máquina local

    No seu navegador, acesse http://localhost:8080

    Você verá uma das cinco saudações: "Hello World", "Hallo Welt", "Hola mundo", "Salut le Monde" ou "Ciao Mondo." O idioma será alterado se você abrir a página em um navegador diferente ou no modo de navegação anônima. Veja e edite os dados da sessão no Console do Google Cloud.

    Sessões do Firestore no Console do Cloud

  3. Para interromper o servidor HTTP, pressione Control+C na janela do terminal.

Como implantar e executar no Cloud Run

Você pode usar o Cloud Run para criar e implantar um aplicativo que seja executado de forma confiável sob carga pesada e com grandes quantidades de dados.

  1. Na janela do seu terminal, crie e implante uma imagem do seu código no Google Container Registry (GCR) com o plug-in Maven do Jib.

    mvn clean package jib:build

  2. Implante o app no Cloud Run:

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

    Substitua MY_PROJECT pelo ID do projeto Cloud que você criou. Visite o URL retornado por este comando para ver como os dados da sessão persistem entre o carregamento da página.

Como depurar o aplicativo

Se você não conseguir se conectar ao seu aplicativo Cloud Run, verifique o seguinte:

  1. Verifique se os comandos de implantação gcloud foram concluídos com êxito e não geraram erros. Se houver erros (por exemplo, message=Build failed), corrija-os e tente implantar o aplicativo Cloud Run novamente.
  2. No Console do Cloud, acesse a página visualizador de registros.

    Acesse a página do visualizador de registros

    1. Na lista suspensa Recursos selecionados recentemente, clique em Aplicativo Cloud Run e, em seguida, clique em Todos os module_id. Você verá uma lista de solicitações de quando visitou seu aplicativo. Caso contrário, verifique se você selecionou Todos os module_id na lista suspensa. Se você vir mensagens de erro impressas no Console do Cloud, verifique se o código do aplicativo corresponde ao código na seção sobre como gravar o app da Web.

    2. Verifique se a API do Cloud Firestore está ativada.

Limpar

Exclua o projeto

  1. No Console do Cloud, acesse a página Gerenciar recursos:

    Acessar "Gerenciar recursos"

  2. Na lista de projetos, selecione o projeto que você quer excluir e clique em Excluir .
  3. Na caixa de diálogo, digite o ID do projeto e clique em Encerrar para excluí-lo.

Excluir a instância do Cloud Run

Exclua o serviço do Cloud Run.

  • No Cloud Console, vá para a página Serviços do Cloud Run.

    Acessar a página "Serviços"

  • Selecione o serviço que você quer excluir.
  • Clique em Excluir para excluir o serviço.

A seguir