- Sobre o Projeto
- Arquitetura
- Tecnologias
- Pré-requisitos
- Instalação e Execução
- API Endpoints
- Documentação
- Deploy em Produção
- Contribuição
Sistema de microserviços desenvolvido para otimização de rotas de entrega usando algoritmo K-Nearest Neighbor. O sistema é composto por 4 microserviços independentes que se comunicam via TCP, com um API Gateway centralizando as requisições HTTP.
- ✅ Otimização de Rotas: Cálculo de rotas otimizadas usando algoritmo KNN
- ✅ Gerenciamento de Pontos: CRUD completo para pontos de entrega
- ✅ Autenticação JWT: Sistema seguro de autenticação e autorização
- ✅ Histórico de Rotas: Consulta paginada do histórico com filtros
- ✅ Rate Limiting: Proteção contra spam e ataques DDoS
- ✅ Health Checks: Monitoramento de saúde dos serviços
- ✅ Documentação Swagger: API totalmente documentada
┌─────────────────┐
│ API Gateway │
│ (Port 3000) │
└─────────────────┘
│ TCP
┌─────────────────────────┼───────────────────────────┐
│ │ │
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ Auth Service │ │ Points Service │ HTTP │ Routes Service │
│ (Port 3001) │ │ (Port 3002) │────────────│ (Port 3003) │
└─────────────────┘ └─────────────────┘ (3004) └─────────────────┘
│ │ │
└───────────────────────┼─────────────────────────────┘
│
┌─────────────────┐
│ MongoDB │
│ (Port 27017) │
└─────────────────┘
| Serviço | Porta HTTP | Porta TCP | Responsabilidade |
|---|---|---|---|
| API Gateway | 3000 | - | Roteamento, Autenticação, Rate Limiting |
| Auth Service | 5001* | 3001 | Autenticação JWT, Gerenciamento de usuários |
| Points Service | 3004* | 3002 | CRUD de pontos de entrega |
| Routes Service | 3005* | 3003 | Otimização de rotas, Histórico |
| MongoDB | 27017 | - | Persistência de dados |
*Portas HTTP apenas para documentação Swagger
- NestJS 11.x - Framework Node.js
- TypeScript - Linguagem de programação
- MongoDB + Mongoose - Banco de dados NoSQL
- JWT - Autenticação e autorização
- Passport - Middleware de autenticação
- Swagger/OpenAPI - Documentação da API
- Jest - Framework de testes
- Docker & Docker Compose - Containerização
- Class Validator - Validação de dados
- Throttler - Rate limiting
- K-Nearest Neighbor - Otimização de rotas
- Node.js >= 18.x
- npm >= 8.x ou yarn >= 1.22
- Docker >= 20.x
- Docker Compose >= 2.x
- Git
- Clone o repositório
git clone https://github.com/samuvf/rota-otimizada-microservice.git
cd rota-otimizada-microservice- Instale as dependências
npm install- Configure as variáveis de ambiente
# Copie os arquivos de exemplo
# *Para facilitar o .env não foi posto no .gitignore
cp .env.example .env
cp apps/api-gateway/.env.example apps/api-gateway/.env- Suba o MongoDB com Docker
docker-compose up mongodb -d- Execute os serviços em modo desenvolvimento
# Todos os serviços simultaneamente
npm run start:dev
# Ou individualmente
npm run start:dev:gateway # API Gateway
npm run start:dev:auth # Auth Service
npm run start:dev:points # Points Service
npm run start:dev:routes # Routes Service# Desenvolvimento
docker-compose up --build
# Produção
docker-compose -f docker-compose.prod.yml up --build -dGET 3.20.240.177:3000/health POST 3.20.240.177:3000/registrar # Registrar novo usuário
POST 3.20.240.177:3000/entrar # Login (retorna JWT token)POST 3.20.240.177:3000/pontos # Criar conjunto de pontos
GET 3.20.240.177:3000/pontos/:id # Buscar pontos por ID
PATCH 3.20.240.177:3000/pontos/:id # Atualizar pontosGET 3.20.240.177:3000/rota/:id # Criar/calcular rota otimizada
GET 3.20.240.177:3000/rota/historico # Listar histórico com paginação
DELETE 3.20.240.177:3000/rota/:id # Deletar rotalimit- Número de registros por página (padrão: 10)offset- Número de registros para pular (padrão: 0)pointsId- Filtrar por ID do conjunto de pontos
# 1. Registrar usuário
POST http://localhost:3000/registrar
body:
'{
"username": "userTest",
"password": "senha123"
}'# 2. Fazer login
POST http://localhost:3000/entrar
body:
'{
"username": "userTest",,
"password": "senha123"
}'# 3. Criar pontos (usando token do login)
POST http://localhost:3000/pontos
"Authorization: Bearer token criado no login"
body:
'{
"pontos": [
{"id": "A", "x": 0, "y": 0},
{"id": "B", "x": 3, "y": 4},
{"id": "C", "x": 6, "y": 8}
]
}'# 4. Buscar pontos (usando token do login)
GET http://localhost:3000/pontos/{{POINTS_ID}}
"Authorization: Bearer token criado no login"# 5. Update pontos (usando token do login)
PATCH http://localhost:3000/pontos/{{POINTS_ID}}
"Authorization: Bearer token criado no login"
body:
`[
{
"id": "A", # Atualizar um ponto
"x": 3,
"y": 3
}
{
"id": "X", # Adicionar um novo ponto
"x": 15,
"y": 20
}
]`# 6. Calcular rota otimizada
GET "http://localhost:3000/rota/{{POINTS_ID}}"
"Authorization: Bearer token criado no login"
# Parametros adicionais:
?StartPointId=A -> define um ponto de partida#7. Histórico de rotas
GET "http://localhost:3000/rota/historico"
"Authorization: Bearer token criado no login"
# parâmetros adicionais:
?limit=X -> define limite por pagina
?offset=Y -> pula um numero especifico
?pointsId={{PONTOS_ID}} -> mostra apenas rotas criadas com o ID do ponto
?limit=X&offset=Y -> combinação de parâmetros# 6. Deletar rota
DELETE "http://localhost:3000/rota/{{ROUTE_ID}}"
"Authorization: Bearer token criado no login"Cada microserviço possui sua própria documentação Swagger:
- API Gateway: http://localhost:3000/api-docs
- Auth Service: http://localhost:5001/api/docs
- Points Service: http://localhost:3004/api
- Routes Service: http://localhost:3005/api/docs
Importe a collection para testes: docs/Teste de Integração.postman_collection.json
# Executar todos os testes
npm test
# Testes específicos
npm test -- delivery-routes.service.spec.ts# Health check do sistema
GET http://localhost:3000/health
# Health checks individuais disponíveis via Swagger- Geral: 100 req/min por IP
- Autenticação: 5 req/min por IP
- Criação de rotas: 10 req/min por IP
- Consultas: 30 req/min por IP
O sistema utiliza uma implementação do algoritmo K-Nearest Neighbor para calcular a rota mais eficiente:
- Seleção do ponto inicial (opcional)
- Construção da rota otimizada usando vizinho mais próximo
- Validação e persistência da rota calculada
- Validação robusta de entrada com Class Validator
- Exceptions padronizadas do NestJS
- Autenticação JWT obrigatória (exceto endpoints públicos)
- Validação de tokens em todas as rotas protegidas
- Rate limiting para prevenção de ataques
| Type | Port | Source | Description |
|---|---|---|---|
| SSH | 22 | Seu IP/0.0.0.0/0 | SSH Access |
| HTTP | 80 | 0.0.0.0/0 | HTTP Redirect |
| HTTPS | 443 | 0.0.0.0/0 | HTTPS Access |
| Custom TCP | 3000 | 0.0.0.0/0 | API Gateway |
| Custom TCP | 27017 | VPC only | MongoDB (Interno) |
# Atualizar sistema
sudo yum update -y
# Instalar Git
sudo yum install Git -y
# Instalar Docker
sudo yum install docker -y
sudo systemctl start docker
sudo systemctl enable docker
sudo usermod -a -G docker ec2-user
# Instalar Docker Compose
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
# Verificar instalação
docker --version
docker-compose --version
# Sair e entrar de novo
exit
# Verificar se credenciais foram aceitas
docker ps# Criar arquivo de swap de 2GB
sudo dd if=/dev/zero of=/swapfile bs=1M count=2048
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
# Tornar permanente
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
echo 'vm.swappiness=30' | sudo tee -a /etc/sysctl.conf
sudo sysctl vm.swappiness=30
# Verificar
free -h# Configurar chave SSH para GitHub
ssh-keygen -t ed25519 -C "ec2-deploy"
cat ~/.ssh/id_ed25519.pub # Adicionar no GitHub
# Clonar repositório
git clone git@github.com:samuvf/rota-otimizada-microservice.git
cd rota-otimizada-microservice
# Build e deploy
docker-compose -f docker-compose.prod.yml build --no-cache
docker-compose -f docker-compose.prod.yml up -d
# Testar o health
GET http://3.20.240.177:3000/health
Este projeto está sob a licença MIT. Veja o arquivo LICENSE para mais detalhes.
- LINDA VITORIA OLIVEIRA NOWACZYK: GitHub
- MATHEUS LIMA COUTINHO: GitHub
- RENAN GROH: GitHub
- SAMUEL VIEIRA FONSECA: GitHub
- VICTOR CONCEIÇAO DE BRITO: GitHub
Desenvolvido com ❤️ usando NestJS e TypeScript