← Ver a árvore completa

ROTA · 6 CLASSES · 1 GRUPOS

Middleware de Verdade

Componha logs, recuperação, limites e autenticação em uma aplicação Go.

Pré-requisitos orientam, mas nunca bloqueiam. Cinco classes fundamentais e o bônus Go 1.27 são grátis com conta.

O ARCO DA ROTA

01Web

ORDEM RECOMENDADA

6 classes, do primeiro passo ao fechamento.

Cada classe leva cerca de 15–25 minutos no novo formato de slides. Você pode sair da ordem quando outro nó fizer mais sentido.

  1. 01
    Middleware de VerdadeO padrão middleware: componha o caminho da requisição

    Entenda http.Handler, escreva middlewares que envolvem handlers e monte chains cuja ordem continua previsível em produção.

  2. 02
    Middleware de VerdadeLogging estruturado com slog em cada requisição

    Registre método, caminho e status com slog, capture a resposta e mantenha logs úteis sem acoplar handlers.

  3. 03
    Middleware de VerdadeRecovery de panics sem esconder o defeito

    Converta panics inesperados em 500, registre a causa e preserve o processo sem tratar falhas comuns como panic.

  4. 04
    Middleware de VerdadeRate limiting com orçamento testável

    Modele orçamento por cliente, responda 429 e separe relógio da decisão para ter um rate limiter determinístico.

  5. 05
    Middleware de VerdadeAutenticação por token na borda HTTP

    Valide Authorization Bearer, compare segredos com cuidado e transporte identidade pelo context sem vazar credenciais.

  6. 06
    Middleware de VerdadeCapstone: uma stack HTTP completa e demonstrável

    Monte recovery, slog, autenticação e rate limit numa API testável com endpoint público e recurso protegido.

PRÉVIA DA PRIMEIRA CLASSE

O padrão middleware: componha o caminho da requisição

type Middleware func(http.Handler) http.Handler

func Chain(final http.Handler, middlewares ...Middleware) http.Handler {
	// Envolve de trás para frente; o primeiro fica por fora.
	for i := len(middlewares) - 1; i >= 0; i-- {
		final = middlewares[i](final)
	}
	return final
}

Uma requisição chega a uma API como uma encomenda numa portaria. Antes de alcançar a pessoa destinatária, alguém registra a entrada, confere a autorização e aplica regras do prédio. Na saída, o caminho se repete ao contrário: a entrega termina, o tempo é registrado e o resultado volta ao visitante. Se cada apartamento repetir essas etapas, uma mudança de regra exige editar todos eles. Se a portaria concentra as regras comuns, cada apartamento cuida só do seu trabalho.

Em net/http, o contrato que permite construir essa portaria é http.Handler. Qualquer valor com ServeHTTP(http.ResponseWriter, *http.Request) é um handler. O endpoint final implementa o contrato; um middleware recebe esse handler e devolve outro handler com comportamento adicional. A assinatura conceitual é func(http.Handler) http.Handler. Não há protocolo secreto nem framework: há funções compondo valores que satisfazem uma interface pequena.

A palavra envolver descreve melhor que “executar antes”. Um middleware pode agir antes de next.ServeHTTP, depois dele ou nos dois momentos. Autenticação costuma decidir antes e interromper o fluxo quando a credencial falha. Logging anota dados antes, delega e registra o resultado depois. Recovery instala um defer antes, mas só trabalha depois de um panic. Pensar em camadas explica todos esses comportamentos sem exceções artificiais.

A ordem importa. Em Chain(handler, auth, logging), a leitura desejável é da esquerda para a direita: a requisição passa por auth, depois logging, depois handler. A resposta retorna por logging e por auth. Para produzir essa estrutura, a montagem acontece de trás para frente. Primeiro logging(handler); depois auth(resultado). Percorrer para frente inverteria a promessa da API e criaria bugs difíceis de notar, especialmente quando um logger deveria registrar também as rejeições de autenticação.

O risco principal é quebrar a delegação. Um middleware que esquece next.ServeHTTP encerra a requisição naquele ponto. Isso pode ser correto para uma guarda que escreveu 401, mas é defeito numa camada de header ou log. Chamar next duas vezes executa efeitos duplicados. Escrever o status antes de delegar também fecha uma decisão que talvez pertencesse ao endpoint. Cada camada deve declarar com precisão quando interrompe, quando delega e qual parte da resposta observa.

O benefício aparece no trabalho seguinte: você testa uma camada em memória com httptest, combina funções pequenas e aplica a mesma política a um ServeMux inteiro. As próximas aulas acrescentam logging, recovery, limite e autenticação sem alterar os handlers de negócio. A chain deixa visível a política de entrada da aplicação.

A introdução termina aqui

Entre para continuar nos slides, rodar o código e enfrentar os desafios.

Começar pela rota →

ESTA ROTA E TODAS AS OUTRAS

Qualquer plano abre os 192 nós.

Mensal R$19,90 · anual R$149 · lifetime R$499. Todos têm garantia de 7 dias.

Comparar os 3 planos →Começar pelas classes grátis