Skip to content

samuvf/rota-otimizada-microservice

Repository files navigation

🚚 Microserviços de Otimização de Rotas de Entrega

NestJS TypeScript MongoDB Docker Jest

📋 Índice

🎯 Sobre o Projeto

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.

Principais Funcionalidades

  • 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

🏗️ Arquitetura

                                ┌─────────────────┐
                                │   API Gateway   │
                                │   (Port 3000)   │
                                └─────────────────┘
                                          │ TCP
                ┌─────────────────────────┼───────────────────────────┐
                │                         │                           │
        ┌─────────────────┐   ┌─────────────────┐            ┌─────────────────┐
        │  Auth Service   │   │ Points Service  │    HTTP    │ Routes Service  │
        │  (Port 3001)    │   │  (Port 3002)    │────────────│  (Port 3003)    │
        └─────────────────┘   └─────────────────┘   (3004)   └─────────────────┘
                │                       │                             │
                └───────────────────────┼─────────────────────────────┘
                                        │
                              ┌─────────────────┐
                              │    MongoDB      │
                              │  (Port 27017)   │
                              └─────────────────┘

Microserviços

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

🛠️ Tecnologias

Backend

  • 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

DevOps & Infraestrutura

  • Docker & Docker Compose - Containerização
  • Class Validator - Validação de dados
  • Throttler - Rate limiting

Algoritmos

  • K-Nearest Neighbor - Otimização de rotas

📋 Pré-requisitos

  • Node.js >= 18.x
  • npm >= 8.x ou yarn >= 1.22
  • Docker >= 20.x
  • Docker Compose >= 2.x
  • Git

🚀 Instalação e Execução

Desenvolvimento Local

  1. Clone o repositório
git clone https://github.com/samuvf/rota-otimizada-microservice.git
cd rota-otimizada-microservice
  1. Instale as dependências
npm install
  1. 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
  1. Suba o MongoDB com Docker
docker-compose up mongodb -d
  1. 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

Usando Docker (Recomendado)

# Desenvolvimento
docker-compose up --build

# Produção
docker-compose -f docker-compose.prod.yml up --build -d

🔌 API Endpoints com IP AWS (EC2)

Api-gateway Health

GET   3.20.240.177:3000/health       

Autenticação

POST   3.20.240.177:3000/registrar          # Registrar novo usuário
POST   3.20.240.177:3000/entrar            # Login (retorna JWT token)

Pontos de Entrega

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 pontos

Rotas Otimizadas

GET    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 rota

Parâmetros de Query - Histórico

  • limit - 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

Exemplo de Requisição

# 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"

📖 Documentação

Swagger UI

Cada microserviço possui sua própria documentação Swagger:

Postman Collection

Importe a collection para testes: docs/Teste de Integração.postman_collection.json

🧪 Testes

# Executar todos os testes
npm test

# Testes específicos
npm test -- delivery-routes.service.spec.ts

Health Checks

# Health check do sistema
GET http://localhost:3000/health

# Health checks individuais disponíveis via Swagger

Rate Limiting

  • 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

🌟 Funcionalidades Avançadas

Algoritmo de Otimização

O sistema utiliza uma implementação do algoritmo K-Nearest Neighbor para calcular a rota mais eficiente:

  1. Seleção do ponto inicial (opcional)
  2. Construção da rota otimizada usando vizinho mais próximo
  3. Validação e persistência da rota calculada

Tratamento de Erros

  • Validação robusta de entrada com Class Validator
  • Exceptions padronizadas do NestJS

Segurança

  • 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

🚀 Deploy em Produção

Deploy em AWS EC2

1. Configuração de Grupos de Segurança 🔏

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)

2. Instalação Docker + Docker Compose 🐳

# 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

3 - Configuração SWAP 🃏

# 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

4. Deploy da Aplicação ⚡

# 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

5 Testar o health

# Testar o health
GET http://3.20.240.177:3000/health

📄 Licença

Este projeto está sob a licença MIT. Veja o arquivo LICENSE para mais detalhes.


💻 Colaboradores

  • 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

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Packages

 
 
 

Contributors