Featured image of post Quando preciso criar um SDK interno para minha organização?

Quando preciso criar um SDK interno para minha organização?

Uma reflexão sobre quando e como criar um SDK interno para organizações com microserviços

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.

Criado com Hugo
Tema Stack desenvolvido por Jimmy