Introdução: por que seu projeto Go precisa de um maestro
\n\nImagine uma orquestra sinfônica. Você tem violinos (serviço de usuários), sopros (serviço de pedidos) e percussão (serviço de pagamentos). Cada instrumento é lindo por si só, mas sem um maestro, eles tocam cada um por si. No mundo dos microsserviços em Go, o API Gateway é exatamente esse maestro.
\n\nQuando você programa em Go, está acostumado com desempenho, simplicidade e elegância. Mas, assim que o número de serviços passa de 3 ou 4, o caos se instala: os clientes não sabem onde bater, a autenticação é duplicada em cada serviço e o monitoramento vira uma dor de cabeça. O API Gateway para serviços Go resolve todos esses problemas de uma só vez.
\n\nNeste artigo, não vamos apenas falar de teoria. Vamos usar Go, a biblioteca padrão e alguns pacotes populares para montar nosso próprio gateway. Pronto para reger? Vamos nessa!
\n\nO que é um API Gateway e por que você precisa de um em Go?
\n\nO API Gateway é um ponto de entrada único para todas as requisições dos clientes aos seus serviços de backend. Imagine que você tem:
\n\n- \n
user-service:8081— registro e perfis \norder-service:8082— carrinho e pedidos \npayment-service:8083— transações \n
Sem um gateway, o cliente precisa saber os endereços de todos os três serviços. Com um API Gateway em Go, ele bate apenas em api.exemplo.com, e o gateway decide para onde encaminhar a requisição.
Funções principais do gateway
\n\n- \n
- Roteamento — redirecionar requisições para o serviço correto \n
- Autenticação e autorização — verificar tokens JWT em um único lugar \n
- Rate Limiting — proteção contra DDoS e sobrecargas \n
- Agregação de dados — combinar respostas de vários serviços em uma só \n
- Balanceamento de carga — distribuir requisições entre instâncias \n
Go é ideal para esse papel: é leve, rápido e permite processar milhares de requisições por segundo em um único núcleo.
\n\nCriando um API Gateway simples em Go: da ideia ao código
\n\nVamos construir um API Gateway Go mínimo, mas funcional. Usaremos apenas a biblioteca padrão net/http e o pacote httputil.ReverseProxy para fazer o proxy.
Passo 1: Roteamento básico
\n\nVamos começar de forma simples: direcionar requisições para diferentes serviços com base no caminho.
\n\npackage main\n\nimport (\n "log"\n "net/http"\n "net/http/httputil"\n "net/url"\n)\n\nfunc main() {\n // Serviço de usuários\n userServiceURL, _ := url.Parse("http://localhost:8081")\n userProxy := httputil.NewSingleHostReverseProxy(userServiceURL)\n\n // Serviço de pedidos\n orderServiceURL, _ := url.Parse("http://localhost:8082")\n orderProxy := httputil.NewSingleHostReverseProxy(orderServiceURL)\n\n http.HandleFunc("/api/users/", func(w http.ResponseWriter, r *http.Request) {\n log.Printf("Redirecionando requisição para user-service: %s", r.URL.Path)\n userProxy.ServeHTTP(w, r)\n })\n\n http.HandleFunc("/api/orders/", func(w http.ResponseWriter, r *http.Request) {\n log.Printf("Redirecionando requisição para order-service: %s", r.URL.Path)\n orderProxy.ServeHTTP(w, r)\n })\n\n log.Println("API Gateway rodando na porta :8080")\n log.Fatal(http.ListenAndServe(":8080", nil))\n}\n\n\nEsse código já faz 80% do trabalho: qualquer requisição para /api/users/ vai para o user-service, e para /api/orders/ vai para o order-service. Mas cadê a autenticação?
Passo 2: Adicionando middleware para JWT
\n\nA verdadeira mágica do API Gateway em Go acontece no middleware. Vamos adicionar a verificação do token JWT antes do proxy.
\n\npackage main\n\nimport (\n "context"\n "log"\n "net/http"\n "net/http/htt