Sou um grande fã de plataformas de aprendizagem on-line, como Udemy. Pelo preço de uma garrafa de vinho, você poderia aprender praticamente qualquer coisa, desde psicologia e culinária tailandesa até linguagens de programação, sistemas operacionais e certificações de TI. Recentemente, decidi fazer um curso com um título longo: "Kubernetes prático - Implante microsserviços na nuvem da AWS". É um ótimo curso e, se você quiser saber mais sobre os detalhes do Kubernetes, microsserviços, implantações de nuvem e muito mais, eu o recomendo muito.

Como um projeto prático de classe para a implantação de microsserviços no Kubernetes, o autor do curso forneceu um pequeno aplicativo chamado Fleetman. O aplicativo permite monitorar uma frota de caminhões (ou lorries, nos termos britânicos) que se deslocam pela grande cidade de Sheffield, no Reino Unido (embora um caminhão esteja no centro de Londres). O aplicativo gera dados de posicionamento geográfico para cada caminhão, armazena-os na memória ou no banco de dados e alimenta os dados de localização em uma conveniente interface de usuário da Web baseada em mapas. Na interface do usuário, podemos ver a posição mais recente de cada caminhão, sua velocidade e a viagem atual. Uma captura de tela do front-end da Web do aplicativo está listada abaixo.

Relatórios de posição de vários caminhões

Embora a parte interna do código do aplicativo não fosse o foco principal do curso da Udemy (era um curso de Kubernetes e não de desenvolvimento de software), achei a arquitetura do aplicativo bastante fascinante, graças ao fato de que o código-fonte é aberto ao público em geral. Como camada de banco de dados de persistência, o aplicativo Fleetman original usa o MongoDB, que é, sem dúvida, uma opção popular para armazenar e consultar dados simples de telemetria provenientes de caminhões no formato JSON.

Mas o que dizer do Couchbase? A plataforma de banco de dados Couchbase oferece muitos recursos e capacidades, como a linguagem N1QL, Analytics, Eventing e Full-Text search. Esses recursos podem tornar mais avançado um simples aplicativo de coleta de telemetria. Mas qual seria a dificuldade de refazer o cabeamento do aplicativo Fleetman para usar o Couchbase em vez do Mongo? Então, passei um bom tempo mergulhando no código-fonte e atualizando minhas habilidades de programação em Java. Vamos começar examinando a arquitetura do Fleetman em mais detalhes.

Arquitetura Fleetman

O aplicativo Fleetman foi projetado como um conjunto de módulos (ou microsserviços) que se comunicam entre si usando vários métodos e protocolos. Três microsserviços: Simulador de posição, Rastreador de posição e API de gateway são escritos usando a estrutura de aplicativos Spring Boot Java. O módulo front-end é escrito em Angular, que é uma estrutura popular de desenvolvimento em Javascript. Há também um sistema de mensagens e uma camada de banco de dados. Como você deve ter adivinhado, cada um desses microsserviços seria executado em um pod separado no caso da implantação do Kubernetes.

Depiction of Fleetman Microservices Architecture

Arquitetura Fleetman

 

  • Simulador de posição - gera telemetria de veículo para cada um dos 40 caminhões da frota lendo arquivos de configuração com coordenadas de posição. Esses relatórios de posição são gravados na fila de mensagens no formato JSON, conforme mostrado abaixo.

 

  • Rastreador de posição - consome as posições dos veículos da fila e as armazena no Couchbase. Ele também calcula a velocidade de cada caminhão, com base nos relatórios de posição novos e anteriores. Esse microsserviço fornece um conjunto de métodos para obter a posição mais recente de um caminhão específico, de todos os caminhões, bem como para obter um histórico de todas as posições de um caminhão. Esses métodos estão disponíveis por meio da interface REST. Obter o histórico pode ser útil se um dos pods do K8s for reiniciado.
  • Gateway de API - é um gateway simples para o front-end Angular. Ele lê as posições mais recentes do veículo no Position Tracker e as alimenta no aplicativo da Web.
  • Aplicativo da Web - é um aplicativo baseado em Angular que permite monitorar as posições dos caminhões no mapa e pular para um local específico do caminhão enquanto mostra o caminho percorrido. No mapa abaixo, é possível ver a jornada do caminhão "London Riverside".

Viagem de caminhão "London Riverside"

Migração para o Couchbase

Graças à abordagem modular da arquitetura de microsserviços, a maior parte dos meus esforços de migração foi gasta com o módulo Position Tracker, que lida com a camada de banco de dados. O código original do Fleetman foi escrito há alguns anos, portanto, meu primeiro objetivo foi recompilar todos os microsserviços Java com a versão mais recente das bibliotecas do Spring Boot. A estrutura Spring oferece aos desenvolvedores uma maneira rápida e fácil de configurar e desenvolver aplicativos regulares e da Web. O Spring Boot é uma extensão da estrutura Spring que vem com um servidor HTTP incorporado (Tomcat) e não requer configuração via XML. É importante observar que o Couchbase é um cidadão de primeira classe no que diz respeito à integração com o Spring. Em junho deste ano, a versão 4.x mais recente das bibliotecas Spring do Couchbase foi lançada e a documentação completa está disponível aqui.

Como parte da migração, uma das primeiras coisas que tive de implementar foi adicionar a geração de chaves ao código para salvar documentos no banco de dados. Todo documento no Couchbase deve ter uma chave. O Spring Boot gera a chave usando a anotação @GeneratedValue com a combinação dos atributos do documento ou com o gerador aleatório de UUID. Eu usei o último. O mapeamento de entidades para a posição do veículo está listado abaixo.

Também foi necessário adicionar uma classe de configuração do Couchbase com um nome de host, nome de usuário, senha e alguns conversores para lidar com o armazenamento de valores BigDecimal para coordenadas. Por padrão, o Couchbase armazena coordenadas como um objeto com escala e precisão. Isso causou alguns problemas com o aplicativo.

Usando conversores, consegui armazenar os dados das posições dos caminhões no seguinte formato:

 

A classe de configuração do Couchbase está listada abaixo.

 

Para configurar o Couchbase, criei um bucket de teste, adicionei um usuário RBAC com o mesmo nome do bucket e concedi permissões de acesso ao aplicativo a esse usuário. Também adicionei índices no nome e no registro de data e hora, pois esses dois atributos são usados como padrões de acesso pelos métodos do repositório. A interface PositionRepository tem três métodos para pesquisar caminhões por nome, registro de data e hora e uma combinação de ambos.

Resumo

De modo geral, a migração para o Couchbase foi bastante tranquila. Testei todo o código localmente, mas ele pode ser contentorizado e implantado no K8s na nuvem usando o Couchbase Autonomous Operator for Kubernetes. Esse exemplo é apresentado aqui. Do ponto de vista empresarial, usando outros recursos do Couchbase, poderíamos ampliar os recursos do aplicativo Fleetman. Por exemplo, usando N1QL ou Analytics, os desenvolvedores poderiam criar uma consulta que encontraria os 5 principais caminhões com base na distância máxima percorrida em um determinado período de tempo. O recurso Eventing poderia ser usado para enviar alertas se um determinado caminhão exceder um limite de velocidade. Outra oportunidade de aprimoramento seria usar as consultas geoespaciais do Couchbase. O código-fonte da minha versão do aplicativo Fleetman está localizado no GitHub, à direita aqui.

Autor

Postado por Pavel Novokshonov, engenheiro sênior de soluções, Couchbase

Pavel é engenheiro de soluções sênior da Couchbase. Anteriormente, ele trabalhou na Teradata Corporation, Harrahs Entertainment e NCR em diferentes funções, incluindo gerenciamento de banco de dados, consultoria, engenharia de desempenho e pré-vendas técnicas.

Deixar uma resposta