API Gateway para serviços Swift: como unir microsserviços em um sistema único

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

API Gateway para serviços Swift: construindo uma ponte entre microsserviços

\n\n

Imagine que seu backend é um enorme shopping center. Dentro, dezenas de lojas (microsserviços): autenticação, catálogo de produtos, carrinho, pagamentos, notificações. O cliente (aplicativo iOS) precisa entrar em cada loja separadamente — isso é caos, demorado e inseguro. API Gateway é a entrada principal, segurança e navegador em um só lugar. Ele recebe requisições, verifica passes, redireciona para o departamento certo e retorna o resultado.

\n\n

No mundo Swift, onde Vapor e Hummingbird ganham força, criar seu próprio API Gateway não é luxo, mas necessidade para projetos escaláveis. Hoje vamos analisar como escrever um gateway leve em Swift que unirá seus serviços em um único ecossistema.

\n\n

Por que um API Gateway na arquitetura Swift?

\n\n

Quando você tem 2-3 microsserviços, o cliente pode se comunicar diretamente com cada um. Mas quando são 10+ (cenário típico para fintech, e-commerce ou SaaS), surgem problemas:

\n\n
    \n
  • Código cliente inchado — cada serviço tem seu próprio endpoint, formato de erro, protocolo de autenticação
  • \n
  • Vulnerabilidades — cada serviço precisa lidar sozinho com CORS, rate limiting, verificação de JWT
  • \n
  • Complexidade de refatoração — renomeou um serviço? Altere o código em todos os clientes
  • \n
  • Tráfego desnecessário — o cliente faz 5 requisições em vez de uma para montar uma página
  • \n
\n\n

O API Gateway resolve esses problemas, tornando-se um ponto único de entrada. Ele pode agregar dados de vários microsserviços em uma única resposta, aplicar políticas de segurança e registrar todas as requisições. Para desenvolvedores Swift, é também uma oportunidade de usar a tipagem forte da linguagem no nível do gateway.

\n\n

Escolha da ferramenta: Vapor + Hummingbird

\n\n

Para criar um API Gateway em Swift, o Vapor é ideal — o framework web mais maduro do ecossistema. Ele oferece middleware, roteamento, requisições de cliente (via Client) e suporte a async/await. Alternativa é o Hummingbird (leve, rápido, da Apple), mas para o exemplo usaremos o Vapor por ser mais documentado.

\n\n

Nosso gateway executará três funções:

\n
    \n
  • Proxy de requisições para o microsserviço correto
  • \n
  • Autenticação via JWT
  • \n
  • Agregação de dados de dois serviços em uma única resposta
  • \n
\n\n

Passo 1. Estrutura básica do projeto

\n\n

Criamos um novo projeto Vapor:

\n
vapor new APIGateway --template=api\ncd APIGateway
\n\n

Adicionamos em Package.swift a dependência para JWT:

\n
.package(url: "https://github.com/vapor/jwt.git", from: "4.0.0")
\n\n

E conectamos no target:

\n
.target(name: "App", dependencies: [\n    .product(name: "Vapor", package: "vapor"),\n    .product(name: "JWT", package: "jwt")\n])
\n\n

Passo 2. Middleware para autenticação

\n\n

Criamos um middleware que verifica o token JWT e passa as informações do usuário adiante. Este é um padrão clássico para API Gateway em Swift:

\n\n
import Vapor\nimport JWT\n\nstruct JWTAuthenticator: AsyncMiddleware {\n    func respond(to request: Request, chainingTo next: AsyncResponder) async throws -> Response {\n        guard let token = request.headers.bearerAuthorization?.token else {\n            throw Abort(.unauthorized, reason: "Missing Bearer token")\n        }\n        \n        // Verificamos a assinatura e a validade\n        let payload = try await request.jwt.verify(token, as: UserPayload.self)\n        \n        // Salvamos o usuário no armazenamento da requisição\n        request.storage.set(UserPayloadKey.self, to: payload)\n        \n        return try await next.respond(to: request)\n    }\n}\n\nstruct UserPayload: JWTPayload {\n    var userID: UUID\n    var role: String\n    var exp: ExpirationClaim\n    \n    func verify(using signer: JWTSigner) throws {\n                

Blogs

Book Recommendations