Como Criar um Microsserviço de Validação de CPF em Go

Aprenda a criar um microsserviço de validação de CPF em Go, com endpoints REST, validação algorítmica, consulta via API e containerização.

Redação CPFHub.io
Redação CPFHub.io
··7 min de leitura
Como Criar um Microsserviço de Validação de CPF em Go

Para criar um microsserviço de validação de CPF em Go, estruture o projeto com separação de responsabilidades — handler HTTP, serviço de negócio, cliente da API externa e validador algorítmico — containerize com Docker em imagem multi-stage e exponha um endpoint REST que valida o CPF localmente antes de consultar a CPFHub.io para confirmar os dados do titular. A linguagem Go garante baixo consumo de memória e alta performance em I/O, tornando esse microsserviço capaz de atender milhares de requisições por segundo com recursos mínimos.

Introdução

Go é uma linguagem ideal para microsserviços: compilação estática, baixo consumo de memória, excelente performance em I/O e concorrência nativa com goroutines. Um microsserviço de validação de CPF em Go pode atender milhares de requisições por segundo com recursos mínimos, servindo como ponto centralizado de validação para todas as aplicações da organização.

Estrutura do projeto

A estrutura segue o padrão de projetos Go com separação clara de responsabilidades.

// Estrutura de diretórios
// cpf-service/
// cmd/
// server/
// main.go
// internal/
// handler/
// cpf_handler.go
// service/
// cpf_service.go
// client/
// cpfhub_client.go
// validator/
// cpf_validator.go
// model/
// cpf.go
// go.mod
// go.sum
// Dockerfile
DiretórioResponsabilidade
cmd/serverPonto de entrada da aplicação
internal/handlerHandlers HTTP (controllers)
internal/serviceLógica de negócio
internal/clientCliente HTTP para a API externa
internal/validatorValidação algorítmica de CPF
internal/modelModelos de dados

Modelos e validador de CPF

Defina os modelos de dados e a validação algorítmica do CPF.

// internal/model/cpf.go
package model

type ConsultaCPFRequest struct {
    CPF string `json:"cpf"`
}

type ConsultaCPFResponse struct {
    Sucesso bool `json:"sucesso"`
    Fonte string `json:"fonte"`
    Dados *DadosCPF `json:"dados,omitempty"`
    Erro string `json:"erro,omitempty"`
}

type DadosCPF struct {
    CPF string `json:"cpf"`
    Nome string `json:"name"`
    NomeUpper string `json:"nameUpper"`
    Genero string `json:"gender"`
    DataNascimento string `json:"birthDate"`
    Dia int `json:"day"`
    Mes int `json:"month"`
    Ano int `json:"year"`
}

type APIResponse struct {
    Success bool `json:"success"`
    Data *DadosCPF `json:"data,omitempty"`
}

// internal/validator/cpf_validator.go
package validator

import (
    "regexp"
    "strconv"
)

var apenasDigitos = regexp.MustCompile(`\D`)

func LimparCPF(cpf string) string {
    return apenasDigitos.ReplaceAllString(cpf, "")
}

func ValidarCPF(cpf string) bool {
    cpfLimpo := LimparCPF(cpf)

    if len(cpfLimpo) != 11 {
    return false
    }

    // Verificar se todos os dígitos são iguais
    todosIguais := true
    for i := 1; i < 11; i++ {
    if cpfLimpo[i] != cpfLimpo[0] {
    todosIguais = false
    break
    }
    }
    if todosIguais {
    return false
    }

    // Validar primeiro dígito verificador
    soma := 0
    for i := 0; i < 9; i++ {
    d, _ := strconv.Atoi(string(cpfLimpo[i]))
    soma += d * (10 - i)
    }
    resto := (soma * 10) % 11
    if resto == 10 {
    resto = 0
    }
    d9, _ := strconv.Atoi(string(cpfLimpo[9]))
    if resto != d9 {
    return false
    }

    // Validar segundo dígito verificador
    soma = 0
    for i := 0; i < 10; i++ {
    d, _ := strconv.Atoi(string(cpfLimpo[i]))
    soma += d * (11 - i)
    }
    resto = (soma * 10) % 11
    if resto == 10 {
    resto = 0
    }
    d10, _ := strconv.Atoi(string(cpfLimpo[10]))
    return resto == d10
}

Cliente HTTP para a API do CPFHub

O cliente encapsula as chamadas à API externa com timeout e tratamento de erros.

// internal/client/cpfhub_client.go
package client

import (
    "encoding/json"
    "fmt"
    "net/http"
    "time"

    "cpf-service/internal/model"
)

type CPFHubClient struct {
    httpClient *http.Client
    baseURL string
    apiKey string
}

func NewCPFHubClient(apiKey string) *CPFHubClient {
    return &CPFHubClient{
    httpClient: &http.Client{
    Timeout: 10 * time.Second,
    },
    baseURL: "https://api.cpfhub.io",
    apiKey: apiKey,
    }
}

func (c *CPFHubClient) ConsultarCPF(cpf string) (*model.APIResponse, error) {
    url := fmt.Sprintf("%s/cpf/%s", c.baseURL, cpf)

    req, err := http.NewRequest("GET", url, nil)
    if err != nil {
    return nil, fmt.Errorf("erro ao criar requisicao: %w", err)
    }

    req.Header.Set("x-api-key", c.apiKey)
    req.Header.Set("Content-Type", "application/json")

    resp, err := c.httpClient.Do(req)
    if err != nil {
    return nil, fmt.Errorf("erro na requisicao: %w", err)
    }
    defer resp.Body.Close()

    if resp.StatusCode != http.StatusOK {
    return nil, fmt.Errorf("API retornou status %d", resp.StatusCode)
    }

    var resultado model.APIResponse
    if err := json.NewDecoder(resp.Body).Decode(&resultado); err != nil {
    return nil, fmt.Errorf("erro ao decodificar resposta: %w", err)
    }

    return &resultado, nil
}

Handler HTTP e server

O handler processa as requisições HTTP e o server inicializa a aplicação.

// internal/handler/cpf_handler.go
package handler

import (
    "encoding/json"
    "net/http"

    "cpf-service/internal/client"
    "cpf-service/internal/model"
    "cpf-service/internal/validator"
)

type CPFHandler struct {
    apiClient *client.CPFHubClient
}

func NewCPFHandler(apiClient *client.CPFHubClient) *CPFHandler {
    return &CPFHandler{apiClient: apiClient}
}

func (h *CPFHandler) Consultar(w http.ResponseWriter, r *http.Request) {
    cpf := r.PathValue("cpf")
    cpfLimpo := validator.LimparCPF(cpf)

    w.Header().Set("Content-Type", "application/json")

    if !validator.ValidarCPF(cpfLimpo) {
    w.WriteHeader(http.StatusBadRequest)
    json.NewEncoder(w).Encode(model.ConsultaCPFResponse{
    Sucesso: false,
    Erro: "CPF invalido",
    })
    return
    }

    resultado, err := h.apiClient.ConsultarCPF(cpfLimpo)
    if err != nil {
    w.WriteHeader(http.StatusBadGateway)
    json.NewEncoder(w).Encode(model.ConsultaCPFResponse{
    Sucesso: false,
    Erro: "Erro ao consultar API externa",
    })
    return
    }

    if !resultado.Success {
    w.WriteHeader(http.StatusNotFound)
    json.NewEncoder(w).Encode(model.ConsultaCPFResponse{
    Sucesso: false,
    Fonte: "api",
    Erro: "CPF nao encontrado",
    })
    return
    }

    json.NewEncoder(w).Encode(model.ConsultaCPFResponse{
    Sucesso: true,
    Fonte: "api",
    Dados: resultado.Data,
    })
}

// cmd/server/main.go
package main

import (
    "fmt"
    "log"
    "net/http"
    "os"

    "cpf-service/internal/client"
    "cpf-service/internal/handler"
)

func main() {
    apiKey := os.Getenv("CPFHUB_API_KEY")
    if apiKey == "" {
    log.Fatal("CPFHUB_API_KEY nao definida")
    }

    apiClient := client.NewCPFHubClient(apiKey)
    cpfHandler := handler.NewCPFHandler(apiClient)

    mux := http.NewServeMux()
    mux.HandleFunc("GET /api/cpf/{cpf}", cpfHandler.Consultar)
    mux.HandleFunc("GET /health", func(w http.ResponseWriter, r *http.Request) {
    w.WriteHeader(http.StatusOK)
    fmt.Fprint(w, `{"status":"ok"}`)
    })

    port := os.Getenv("PORT")
    if port == "" {
    port = "8080"
    }

    log.Printf("Servidor iniciado na porta %s", port)
    log.Fatal(http.ListenAndServe(":"+port, mux))
}

Dockerfile para containerização

A imagem multi-stage mantém o container final leve e seguro.

FROM golang:1.22-alpine AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -o /cpf-service ./cmd/server

FROM alpine:3.19
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=builder /cpf-service .
EXPOSE 8080
CMD ["./cpf-service"]
EstágioImagem BaseTamanhoPropósito
Buildergolang:1.22-alpine~300MBCompilação do binário
Runtimealpine:3.19~15MBExecução do serviço

Perguntas frequentes

O que é necessário para implementar validação de CPF neste contexto?

A validação de CPF exige uma chamada à API com o número do documento e a chave de autenticação. A CPFHub.io retorna o status do CPF, nome do titular e data de nascimento em menos de 200ms, permitindo a verificação em tempo real durante o cadastro ou transação.

A API CPFHub.io funciona para todos os volumes de consulta?

Sim. O plano gratuito oferece 50 consultas por mês sem cartão de crédito — ideal para testes e projetos pequenos. Para volumes maiores, o plano Pro inclui 1.000 consultas mensais por R$149. Se o limite for ultrapassado, a API não bloqueia: cobra R$0,15 por consulta adicional.

Como garantir conformidade com a LGPD ao usar uma API de CPF?

Use o CPF apenas para a finalidade declarada ao titular, armazene apenas o necessário (não guarde o CPF cru se um token bastar), implemente controle de acesso aos logs de consulta e documente a base legal para o tratamento. A ANPD orienta que dados de identificação devem ser tratados com o princípio da necessidade.

Quanto tempo leva para integrar a API CPFHub.io?

A integração básica leva menos de 30 minutos: crie uma conta em cpfhub.io, gere a API key no painel e faça uma chamada GET para https://api.cpfhub.io/cpf/{CPF} com o header x-api-key. A documentação inclui exemplos em Python, Node.js, PHP, Java e outras linguagens.


Conclusão

Um microsserviço de validação de CPF em Go combina a performance excepcional da linguagem com uma arquitetura limpa e containerizável. Com validação algorítmica local, consulta via API externa e endpoints REST, o serviço pode atender milhares de requisições por segundo com consumo mínimo de recursos. A containerização com Docker facilita o deploy em qualquer ambiente de orquestração.

Cadastre-se em cpfhub.io — 50 consultas mensais gratuitas, sem cartão de crédito — e comece a construir seu microsserviço de validação de CPF com dados reais hoje mesmo.

CPFHub.io

Pronto para integrar a API?

50 consultas gratuitas para testar agora. Sem cartão de crédito. Acesso imediato à documentação.

Redação CPFHub.io

Sobre a redação

Redação CPFHub.io

Time editorial especializado em APIs de CPF, identidade digital e compliance no mercado brasileiro. Produzimos guias técnicos, análises regulatórias e tutoriais sobre LGPD e KYC para desenvolvedores e líderes de produto.

WhatsAppFale conosco via WhatsApp