Hoje estou atuando em um projeto onde trabalhamos fortemente na padronização e construção de serviços. Durante uma discussão em um refinamento técnico, um colega levantou uma questão simples, mas importante: “Por que não temos uma biblioteca própria?”.
Em algum momento da evolução da nossa arquitetura, essa pergunta passou a fazer ainda mais sentido: será que precisamos de um SDK interno?
Mas afinal, o que é um SDK? Um Software Development Kit (SDK) é um conjunto de ferramentas, bibliotecas e padrões que aceleram o desenvolvimento de software, simplificando a implementação de funcionalidades recorrentes e garantindo consistência entre os serviços. Ele funciona como uma fundação compartilhada: em vez de cada time reescrever do zero instrumentação de logs, autenticação, autorização ou integrações, tudo isso fica centralizado e pronto para uso.
Esse questionamento não surgiu por acaso. Vieram sinais claros no dia a dia que nos levaram a refletir: código duplicado entre serviços, necessidade recorrente de instrumentação de logs, autenticação e autorização implementadas de formas diferentes, e muita manutenção espalhada em diversos repositórios. Esses pontos nos guiaram até a decisão de criar um SDK centralizado para a organização.
Neste post, vou compartilhar as motivações e os sinais que nos levaram a tomar essa decisão, mostrando como centralizar implementações comuns pode acelerar a entrega, reduzir complexidade e elevar a consistência da nossa malha de serviços.
O cenário que motivou a criação
Nossa malha de microserviços começou a crescer rapidamente, e com isso alguns problemas se tornaram recorrentes:
Problemas identificados
Código duplicado em massa: Em praticamente todos os serviços tínhamos as mesmas implementações — logs, autenticação, autorização e outros pontos comuns.
Copy & paste descontrolado: Ao iniciar um novo serviço, havia muito código reaproveitado manualmente de outros projetos.
Manutenção complexa e custosa: Sempre que precisávamos alterar algo comum, tínhamos que atualizar diversos serviços em paralelo.
Impactos negativos
Esses pontos começaram a gerar:
- Baixa produtividade dos times
- Alto risco de inconsistências entre serviços
- Dificuldade em manter padrões de qualidade
- Retrabalho constante
A decisão e os benefícios do SDK
A solução encontrada foi construir um SDK interno, centralizando implementações comuns em um único repositório versionado.
Principais benefícios alcançados
Centralização da manutenção: Uma única alteração no SDK impacta automaticamente todos os serviços que o utilizam.
Ganhos significativos de produtividade: Novos serviços já nascem com um kit de desenvolvimento completo e testado.
Padronização organizacional: Práticas de observabilidade, logs e autenticação seguem o mesmo modelo em toda a malha de serviços.
Evolução contínua: Cada nova versão pode entregar funcionalidades inovadoras para toda a organização de forma transparente.
Distribuição e versionamento
Para garantir que todos os times tenham acesso às versões mais recentes do SDK e que a instalação seja simples, utilizamos o Azure Artifacts como repositório privado de pacotes.
Estratégia de distribuição
Gerenciamento de versões: Cada release do SDK é publicada no Azure Artifacts.
Instalação via NPM: Os serviços internos conseguem instalar a biblioteca diretamente via
npm install
, apontando para o feed privado do Artifacts.Controle de dependências: Temos rastreabilidade completa de quais serviços estão usando cada versão, permitindo planejar atualizações gradativas.
Fluxo automatizado de CI/CD: O pipeline de build publica automaticamente novas versões, reduzindo esforço manual e garantindo consistência.
Exemplo de instalação no package.json
de um serviço:
{
"dependencies": {
"@org/opentrips-sdk": "^1.3.0"
}
}
Desafios encontrados
Nem tudo são flores — criar e manter um SDK interno também trouxe desafios significativos:
Principais obstáculos
Generalização das implementações: Atender diferentes cenários e necessidades de serviços sem criar uma solução engessada ou muito específica.
Manutenção de dependências: Manter as versões das bibliotecas sempre atualizadas e compatíveis, evitando conflitos de dependências.
Múltiplas stacks tecnológicas: Nossa organização usa principalmente Node.js e Java, mas o SDK está disponível apenas para Node.js, exigindo estratégia para expandir ou padronizar as tecnologias.
Exemplo prático de uso
Um dos primeiros módulos desenvolvidos no SDK foi o cliente de Logs, que centraliza toda a lógica de envio e formatação de logs da aplicação:
import { createLogsClient } from 'opentrips-sdk/logs';
// Criar cliente de logs
const logs = createLogsClient({
host: 'http://localhost:8080',
// apiKey: process.env.LOGS_API_KEY // Opcional
});
// Enviar log
const result = await logs.createLog({
provider: 'clickbus',
type: 'response',
payload: '<?xml version="1.0" encoding="UTF-8"?><empresa>...</empresa>',
correlationId: '038473a4-db4a-405a-b759-e52d035b3a0d',
operation: 'reserva',
resource: 'rodoviario',
extra: { teste: 'teste' }
});
if (result.ok) {
console.log('Log enviado com sucesso');
} else {
console.error('Erro ao enviar log:', result.error);
}
Arquitetura e estrutura do projeto
O SDK foi arquitetado em módulos independentes, cada um com sua documentação completa, exemplos práticos e suíte de testes:
src/
├── index.ts # Ponto de entrada principal
├── logs/ # 🗂️ Módulo de Logs
│ ├── README.md
│ ├── example.ts
│ ├── index.ts
│ ├── client.ts
│ ├── http.ts
│ ├── types.ts
│ ├── utils.ts
│ └── __tests__/
├── observability/ # 📊 Módulo de Observabilidade
│ ├── README.md
│ ├── index.ts
│ ├── client.ts
│ ├── middleware.ts
│ ├── metrics-endpoint.ts
│ └── types.ts
└── [novos-módulos]/ # Futuros módulos...
Conclusão
Criar um SDK interno não é apenas uma questão técnica, mas também uma decisão estratégica que impacta toda a organização.
Principais vantagens
- Reduz significativamente os custos de manutenção de código duplicado
- Eleva a produtividade dos times de desenvolvimento
- Cria consistência e padronização em toda a malha de serviços
- Acelera o onboarding de novos desenvolvedores e projetos
Pontos de atenção
É fundamental ter clareza sobre os desafios que surgem:
- Generalização adequada das implementações
- Manutenção contínua e versionamento
- Expansão para múltiplas stacks tecnológicas
O investimento em um SDK interno se justifica quando os benefícios superam os custos de desenvolvimento e manutenção, especialmente em organizações com múltiplos serviços.