- Rust 100%
| .woodpecker | ||
| src | ||
| tests | ||
| .gitignore | ||
| Cargo.lock | ||
| Cargo.toml | ||
| LICENSE | ||
| README.md | ||
Lição 50: 🏆 Projeto Final — Servidor Web Multithread
1. Narrativa
Tudo que o piloto aprendeu converge neste momento. A Academia Æther convoca o piloto para construir o sistema central do mecha: um servidor web que coordena sensores, processa requisições, gerencia estado e serve dados em tempo real. Este projeto combina ownership, traits, smart pointers, módulos e tudo mais aprendido nas 49 lições anteriores. O resultado final é um servidor funcional construído do zero.
Nota sobre concorrência: o
ThreadPooldesta lição é uma simulação — uma estrutura de dados com workers, sem threads reais. A concorrência real comstd::threade channels é exercitada nas lições 41 e 42. Aqui o foco é a modelagem do estado compartilhado comArc<Mutex<T>>e o roteamento de requisições.
2. Conceito
Um servidor web multithread combina os principais conceitos de Rust:
- ThreadPool (simulado): Estrutura de dados com workers que representa o pool de processamento (concorrência real nas lições 41/42)
- Arc<Mutex>: Estado compartilhado entre workers
- Funções como handlers:
roteardespacha cada requisição para a função de processamento correta (processar_get,processar_post) via pattern matching - Enums + Pattern Matching: Roteamento de endpoints
- Result/Option: Tratamento de erros em toda a pipeline
- Smart Pointers:
Arc<Mutex<EstadoServidor>>para compartilhar estado entre threads com segurança
3. Requisitos
- Criar ThreadPool com workers
- Implementar tipo HttpRequest/HttpResponse
- Gerenciar estado do servidor com Arc
- Criar sistema de rotas com pattern matching
- Implementar despacho de requisições para as funções de processamento corretas (GET/POST)
4. Design de Dados
graph TD
A[Listener] --> B[ThreadPool]
B --> C[Worker 1]
B --> D[Worker 2]
B --> E[Worker N]
C --> F[rotear]
D --> F
E --> F
F --> G[Estado Compartilhado Arc Mutex]
F --> H[Response]
5. Diagrama de Fluxo
flowchart TD
A[Receber Request] --> B[Parse HTTP]
B --> C{Rota existe?}
C -->|Sim| D[Executar processar_get/processar_post]
C -->|Não| E[404 Not Found]
D --> F{Processamento ok?}
F -->|Sim| G[Retornar Response]
F -->|Não| H[500 Internal Error]
E --> I[Enviar resposta]
G --> I
H --> I
6. Funções
| Função | Descrição |
|---|---|
criar_resposta |
Cria HttpResponse com status e corpo |
parsear_requisicao |
Faz parse de string HTTP em HttpRequest |
rotear |
Direciona requisição para handler correto |
estado_inicial |
Cria estado inicial do servidor |
incrementar_contador |
Incrementa contador no estado compartilhado |
processar_get |
Processa requisição GET |
processar_post |
Processa requisição POST |
criar_pool |
Cria ThreadPool simulado |
7. Exemplo
let estado = estado_inicial();
incrementar_contador(&estado, "visitas");
let req = parsear_requisicao("GET /status HTTP/1.1");
let resp = rotear(&req, &estado);
assert_eq!(resp.status, 200);
8. Missão
- Implementar
criar_respostaconstruindo HttpResponse - Implementar
parsear_requisicaoextraindo método, rota e versão - Implementar
rotearcom pattern matching em rotas - Implementar
estado_inicialcriando estado com Arc - Implementar
incrementar_contadormodificando estado compartilhado - Implementar
processar_getretornando dados do estado - Implementar
processar_postatualizando estado via POST - Implementar
criar_poolcriando estrutura de ThreadPool
9. Como Executar
cargo build
cargo test
cargo clippy -- -D warnings
cargo fmt --check
10. Dicas
- Use
Arc<Mutex<T>>para todo estado compartilhado - HttpRequest pode ser um enum com variants para cada método
- O ThreadPool é uma simulação: crie a estrutura com
workersetamanhosem threads reais - Em um ThreadPool real, cada worker seria uma thread recebendo jobs de um canal (lições 41/42)
- Response deve ter status code, headers e body
- Este projeto é a culminação de todas as 49 lições anteriores