Este projeto foi eleborado cumprindo os objetivos da FASE 02 Pós Arquitetura e Desenvolvimento Java da FIAP
Que consiste em um conjunto de APIs para o gerenciamento de um sistema de parquímetro escalável. Adotamos o uso da extensão Citus do Postgresql por ser uma versão escalável deste banco de dados.
https://www.citusdata.com/
Para tornar as APIs escaláveis utilizamos o deploy utilizando HPA em OpenShift que é um Kubernetes modificado pela RedHat.
https://www.redhat.com/pt-br/technologies/cloud-computing/openshift
https://docs.openshift.com/container-platform/4.8/nodes/pods/nodes-pods-autoscaling.html
Visando facilitar os testes criamos também um docker compose para a utilização do projeto de forma local.
OBS: Os arquivos referentes deploy se encontram em: https://github.com/matheushajer/fiap-parquimetro/tree/master/deployment
Cluster Openshift funcional, podendo ser o gratuito SandBox.
Openshift SandBox: https://developers.redhat.com/developer-sandbox
OC cli ou kubectl instalado
Acessar a pasta yamls-citus-db-openshift (https://github.com/matheushajer/fiap-parquimetro/tree/master/deployment/yamls-citus-db-openshift)
cd deployment/yamls-citus-db-openshift
Aplicar o secret:
oc apply -f citus-secrets.yaml
Aplicar o kustomization:
oc apply -k .
Acessar a pasta yamls para fazer o deploy do parquimetro-app
cd deployment/parquimetro-app/yamls
Aplicar o kustomization:
oc apply -k .
Após as etapas acima você verá o ambiente pronto para uso e com o HPA ativado conforme abaixo:
Conforme informado anteriormente, através do HPA podemos ter a aplicação parquimetro-app escalável que neste caso ocorre quando ela atinge o pico de CPU ou RAM acima de 80% e 70% respectivamente, teremos a criação de mais uma replica e por assim subsequente até o máximo até então estipulado como 3 réplicas.
Após a aplicação se estabilizar abaixo do alvo, ela voltará a apenas 1 réplica conforme os indicadores dos eventos abaixo:
Docker instalado
Documentação: https://docs.docker.com/
Docker compose instalado
Documentação docker compose: https://docs.docker.com/compose/
Acessar a pasta docker-compose (https://github.com/matheushajer/fiap-parquimetro/tree/master/deployment/docker-compose)
cd deployment/docker-compose
Rodar o docker compose:
docker compose up
Containers em execução:
OBS: Para utilizar o projeto em H2 deve-se alterar as configurações que estão comentadas no pom.xml e no src/main/resources/application.properties
- Spring Boot - Framework principal
- Spring Data JPA - Gerenciamento de dados
- Spring Boot Starter Validation - Validação
- Spring Boot Starter Web - Facilitação de Web apps
- PostgreSQL JDBC Driver - Conexão com PostgreSQL
- Project Lombok - Utilizado annotations para reduzir verbosidade.
- MapStruct - Mapeamento de objetos
- Spring Data REST WebMVC - Exposição RESTful
- Unirest for Java - Cliente HTTP usado no envio de SMS
- SendGrid Java Library - Integração de email
- Maven Compiler Plugin - Compilação Java
- Spring Boot Maven Plugin - Plugin Maven para Spring Boot
✅ Pensamos em utilizar o OpenShift por ser uma aplicação de orquestração de containers baseada em Kubernetes.
Ele é altamente utilizado no mercado e devido a sua facilidade de escalabilidade utilizando o HPA.
Para o banco de dados o desafio foi encontrar uma que fosse escalável e o Citus e bastante utilizado no mercado devido a sua fácil escalabilidade e grande desempenho para grandes volumes de dados.
✅ Foi necessário adaptar o deploy de acordo com a plataforma disponibilizada pela RedHat,
Neste caso criamos "InitContainers" que rodam antes dos containers principais entrarem em execuçao. Com isso, os utilizamos para garantir que após a reinicialização, o pod tenham todas as permissões necessárias.
Exemplo em: deployment/yamls-citus-db-openshift/citus-statefullsets.yaml initContainer fix-permissions-pgdata.
✅ Para as notificações via SMS é utilizado o Unirest-JAVA como cliente HTTP para o envio de SMS devido a sua simplicidade no uso e abstração de requisições via API.
✅ O SendGrid foi escolhido devido à sua confiabilidade, fácil escalabilidade e capacidade de lidar com grandes volumes. Monitoramento detalhado, APIs fáceis de integrar e segurança robusta.
- Cleyton Sales
- Déborah Souza
- Karoline Leite
- Matheus Hajer
- Yuri Sena