Documento de Arquitetura de Software RotaEscolarApp
1. Introdução
Este documento descreve a arquitetura proposta para uma aplicação móvel de rastreamento de passageiros em uma van escolar. A solução é composta por dois módulos distintos: um para o condutor/monitor da van e outro para os pais dos passageiros.
2. Visão Geral
Esta arquitetura cliente-servidor é híbrida de mobile e computação em núvem.
Os dois aplicativos são construídos em Flutter e são disponibilizados nas lojas de aplicativos das principais plataformas de dispositivos móveis.
A plataforma de computação em núvem escolhida é o Google Cloud Platform que oferece uma variedade de produtos tecnológicos, como o Maps API que é utilizado para as funcionalidades de geolocalização.
As funcionalidades principais são desenvolvidas em Java dentro de um servidor web com Spring Boot e disponibilizadas para a internet por meio do Cloud Run utilizando arquitetura de microserviço.
Para que cada microserviço funcione de forma independente, mas seja acessado de forma centralizada é utilizado um Api Gateway. Sua url é pública, ou seja, disponível para a internet e os microserviços acessados por ela são privados, apenas acessíveis pelo gateway.
Já que gateway está disponível na internet, é protegido pelo Keycloak, por meio do padrão Oauth. Além de fornecer o cadastro básico de usuários, o keycloak oferece mais camadas de segurança como 2FA (Autenticação em 2 fatores) e auxilia no controle do reconhecimento facial.
Os dados dos usuários são guardados no banco de dados PostgreSql e gerenciados pelo Cloud Sql.
No lado do cliente a interface construída em Flutter, no lado do servidor as funcionalidades construídas em Java com Spring Boot, o banco de dados PostgreSQL, disponibilizados pela plataforma google cloud.
3. Decisões Arquiteturais
Sobre a disponibilização
- O formato de aplicativo, instalável por meio de uma loja de aplicativos, foi escolhido no lugar uma aplicação web acessível pelo browser pois:
- É necessário ter um controle refinado sobre os componentes do dispositivo;
- Algumas funcionalidades necessitam estar disponíveis em segundo plano;
- Algumas funcionalidades oferecem experiência offline (sem internet);
Sobre o Flutter
- É uma plataforma de desenvolvimento madura e robusta com uma vasta gama libs (dependências) para resolver problemas comuns.
- A principal motivação para utilização do flutter nesta arquitetura e a oferta de multiplataforma.
Com uma unica base de código, é possível gerar código nativo para cada plataforma. - A linguagem de programação utilizada pelo flutter é o Dart, que é muito parecido com o Java, a linguagem de programação de domínio dos desenvolvedores envolvidos.
- Ambos, flutter e dart, são mantidos pela google e contam com o seu suporte e de uma grande comunidade.
Sobre o Google Cloud Platform
A principal oferta de valor, o rastreamento, é possível graças a tecnologia de geolocalização Gps. Utilizando esta tecnologia varios empresas no mercado fornecem apis de rastreamento prontas para serem integradas. Dentre as empresas concorrentes a Google oferece a api mais robusta e popular, por meio do google cloud patform.
Uma vez dentro da plataforma google, uma série de outros produtos da nuvem está disponível. Estes produtos, assim como a api, são robustos e acessíveis.
Este conjunto de protudos oferece uma sinergia de tecnologias atrativa ao desenvolvimento e manutenção da solução.
Sobre o Keycloak
O gerenciamento de usuários e seus acessos é fundamental para a solução, e uma plataforma centralizada para esta finalidade é ideal por questões de segurança.
O Keycloak é uma plataforma de código aberto para gerenciamento de identidade e acesso (IAM) que oferece uma variedade de recursos e funcionalidades para autenticação, autorização, gerenciamento de usuários, integração de sistemas e segurança de aplicativos.
As vantagens de utilizar o Keycloak são:
- Permite centralizar o processo de autenticação de usuários em seus aplicativos. Isso significa que você pode integrar seus aplicativos com o Keycloak para lidar com o login de usuários, evitando a necessidade de implementar a autenticação em cada aplicativo individualmente.
- Oferece recursos avançados de autorização que permitem controlar finamente o acesso dos usuários aos recursos e funcionalidades de seus aplicativos. Isso inclui políticas de acesso baseadas em funções, grupos, atributos de usuário e outras condições.
- Fornece ferramentas para gerenciar usuários, grupos, papéis e permissões de forma centralizada. Isso facilita a administração de identidades de usuário em seus aplicativos e permite que você defina políticas de segurança consistentes em toda a sua infraestrutura.
- Oferece suporte a uma variedade de padrões de autenticação e protocolos de segurança, como OAuth 2.0, OpenID Connect, SAML e LDAP. Isso permite integrá-lo facilmente com seus sistemas e aplicativos existentes, independentemente da tecnologia ou plataforma utilizada.
- Oferece recursos avançados de segurança, como criptografia de dados, autenticação multifatorial, registro de auditoria e controle de acesso granular.
- É altamente escalável e pode ser implantado em ambientes distribuídos para suportar cargas de trabalho de qualquer tamanho. Ele oferece recursos de clustering e balanceamento de carga para garantir alta disponibilidade e desempenho confiável.
Sobre o Api Gateway
Utilizar um API Gateway na frente de microserviços traz várias vantagens que contribuem para a gestão eficiente e segura das APIs, como por exemplo:
- Gerenciamento Centralizado de APIs:
- Roteamento: O API Gateway roteia as requisições para o microserviço apropriado, abstraindo a complexidade do cliente.
- Load Balancing: Distribui as requisições de forma balanceada entre múltiplas instâncias de microserviços.
- Segurança:
- Autenticação e Autorização: Centraliza a gestão de autenticação e autorização, integrando com OAuth, JWT, etc.
- Rate Limiting: Controla a taxa de requisições para evitar sobrecarga dos microserviços.
- CORS Handling: Gerencia Cross-Origin Resource Sharing (CORS) de maneira eficiente.
- Monitoramento e Logging:
- Observabilidade: Oferece monitoramento centralizado, coleta de métricas e logging de requisições e respostas.
- Tracing: Facilita o tracing distribuído para depuração e monitoramento de performance.
- Transformação de Requisições e Respostas:
- Modificação de Payload: Permite transformar payloads de requisições e respostas, o que pode ser útil para compatibilidade entre diferentes versões de APIs.
- Redução da Complexidade no Cliente:
- Acesso Simplificado: Fornece um ponto único de entrada para múltiplos microserviços, simplificando a lógica no cliente.
- Caching:
- Armazenamento em Cache: Reduz a carga nos microserviços e melhora a performance ao armazenar em cache respostas de requisições frequentes.
Como solução para os multiplos microserviços e a comunicação com o aplicativo flutter, utilizamos o Google API Gateway que oferece valor com:
- Escalabilidade e Performance:
- Auto-escalabilidade: Garante alta disponibilidade e escalabilidade automática para lidar com picos de tráfego.
-
Baixa Latência: Infraestrutura otimizada para baixa latência e alta performance.
-
Economia de Custos:
- Pricing Flexível: Modelo de preços baseado em uso, o que pode ser mais econômico para startups e empresas em crescimento.
Sobre o Cloud Run
As funcionalidades de crud dos aplicativos não são acionadas o tempo todo, na maior parte do tempo estas apis estarão ociosas. Para não gerar custos desnecessários neste tipo de serviço, o cloud run oferece de forma nativa o comportamento de disponibilidade sob demanda. Por fim, em situações de alta demanda o cloud run tem a capacidade de escalar com baixa latencia.
Sobre o Java com Spring Boot
- A equipe tem domínio sobre a linguagem de programação java e a plataforma spring boot para construção de APIs REST.
- É possível construir imagens Docker leves com as versões mais atuais do spring boot.
- É possível instalar em vários os produtos de disponibilização de serviços para a internet do GCP.
- É amigável para o desenvolvimento de microseriços.
Sobre o PostgreSql
As vantagens para a utilização do PostgreSQL são:
- Ampla gama de funcionalidades avançadas que o tornam uma escolha poderosa para casos de uso complexos e exigentes. Ele suporta recursos como tipos de dados personalizados, gatilhos (triggers), funções armazenadas, janelas de tempo (window functions), índices parciais, entre outros. Essas funcionalidades podem ser úteis para aplicações que requerem manipulação de dados complexa e avançada.
- Suporte completo a integridade referencial e a chaves estrangeiras, permitindo garantir a consistência e a integridade dos seus dados através de relacionamentos entre tabelas. Isso é importante para aplicações que exigem relacionamentos complexos entre os dados e que dependem da integridade dos dados para funcionar corretamente.
- Suporte nativo a JSON (e JSONB), permitindo armazenar e consultar dados semi-estruturados de forma eficiente. Isso é útil para aplicações que lidam com dados flexíveis e não-estruturados, como aplicações web modernas e aplicações que utilizam arquiteturas orientadas a microsserviços.
- Tem um desempenho melhor em cargas de trabalho mais complexas e em cenários de concorrência mais pesados. Isso pode ser uma consideração importante para aplicações que esperam um grande volume de tráfego ou que exigem consultas complexas e intensivas em recursos.
4. Componentes Principais
- Frontend Flutter:
- Desenvolvimento dos aplicativos móveis para condutores/cuidadores e pais.
- Interface de usuário responsiva e intuitiva.
- Keycloak:
- Gerenciamento da base de usuários e suas autorizações;
- Controle de acesso as apis;
- Controle de acesso ao aplicativo;
- Api Gateway:
- Centralização do acesso aos microserviços;
- APIs Backend (Java com Spring Boot):
- Desenvolvimento das APIs Rest para processar solicitações dos aplicativos móveis.
- Gerenciamento de passageiros, localização da van e comunicação com os pais.
- Banco de Dados PostgreSQL:
- Armazenamento dos dados relacionais, incluindo informações dos passageiros, rotas e localizações.
5. //TODO Requisitos Não Funcionais
- Segurança: O sistema deve garantir a segurança dos dados e das comunicações, utilizando autenticação e autorização robustas.
- Desempenho: O aplicativo deve ser responsivo e fornecer atualizações em tempo real da localização da van e dos passageiros.
- Escalabilidade: A arquitetura deve ser projetada para escalabilidade horizontal, permitindo lidar com um grande número de usuários e atualizações simultâneas.
- Usabilidade: A interface do usuário deve ser intuitiva e fácil de usar, atendendo às necessidades tanto do condutor/cuidador quanto dos pais.
- Conexão: A aplicação deve se comportar de forma transparente quando não houver rede disponível.
6. //TODO Integração de Sistemas Externos
- Integração com a API do Google Maps para fornecer recursos de mapas e localização em tempo real.
7. //TODO Segurança
- Utilização do Keycloak para autenticação e autorização das APIs backend.
- Implementação de medidas de segurança em todas as camadas da aplicação.
8. //TODO Considerações de Implantação
- Ambiente de desenvolvimento utilizando Google Compute Engine (GCE) para o desenvolvimento e teste.
- Ambiente de produção utilizando Google Cloud Run para hospedar as APIs e Cloud SQL para o banco de dados.
9. //TODO Plano de Testes
- Estratégia de teste incluindo testes de unidade, integração e aceitação.
- Utilização de ferramentas de teste automatizado para garantir a qualidade do código e a estabilidade da aplicação.
10. //TODO Considerações de Manutenção e Evolução
- Estratégias para lidar com mudanças nos requisitos, atualizações tecnológicas e correções de bugs.
- Documentação adequada para facilitar a manutenção e a evolução do sistema ao longo do tempo.