Voltar para Learn
FAACCapítulo 28

Fundamentos e Arquitetura de APIs Corporativas

API Versioning

Versionamento, compatibilidade, coexistência, depreciação e ciclo de vida de APIs corporativas

Edição aprofundada - material de estudo e consulta profissional

Contratos de API evoluindo por versões coexistentes, migração e retirada segura

Evolução controlada: mudar sem surpreender consumidores

Contrato, mudança, coexistência, depreciação e retirada como etapas da evolução de APIs
Figura de abertura - A evolução segura transforma mudanças em um processo observável e governado.

Princípio central

Compatibilidade é percebida pelo consumidor; a versão é apenas um mecanismo de coordenação.

Edição aprofundada - material de estudo e consulta profissional

Apresentação do capítulo

No capítulo anterior, , quotas e foram apresentados como parte do contrato operacional de uma . Reduzir um limite, alterar a unidade de consumo ou modificar o comportamento de uma resposta 429 pode quebrar consumidores mesmo quando nenhum campo mudou. Essa observação conduz ao tema central deste capítulo: uma é compatível quando continua atendendo às expectativas legítimas dos consumidores, e não apenas quando o arquivo ainda pode ser analisado.

Versioning é frequentemente reduzido à escolha entre colocar v1 no caminho, em um ou em um parâmetro. Essa escolha é importante, mas representa apenas a parte visível. O problema real é coordenar evolução em um sistema distribuído: contratos foram publicados, SDKs foram gerados, aplicações incorporaram comportamentos e integrações podem estar fora do controle direto do provedor. Alterar a passa a exigir análise de impacto, comunicação, coexistência e evidências de migração.

O ciclo de vida amplia essa análise. Uma versão precisa nascer com critérios de estabilidade, tornar-se ativa, receber correções, comunicar mudanças, entrar em depreciação e eventualmente ser retirada. Sem governança, versões se acumulam no , vulnerabilidades permanecem em contratos antigos e consumidores descobrem a retirada apenas quando o tráfego falha.

Este capítulo apresenta modelos de compatibilidade, taxonomia de mudanças, estratégias de seleção de versão, evolução de , versionamento em , , e eventos, versões e revisões no Azure Management, depreciação com os e , telemetria, testes de contrato e o padrão .

Como estudar este capítulo

Para cada mudança, responda: quem produz o dado, quem o interpreta, qual comportamento anterior foi prometido, quais consumidores ainda dependem dele e qual evidência demonstra que a mudança é segura. Evite classificar alterações apenas pela aparência do diff.

Objetivos de aprendizagem

  • Explicar por que evolução de é um problema de contrato distribuído e não apenas de código.
  • Distinguir compatibilidade sintática, estrutural, semântica, comportamental e operacional.
  • Classificar mudanças em , , , erros, segurança e limites.
  • Aplicar versionamento semântico com senso crítico em remotas.
  • Comparar versionamento por path, , , media type e data.
  • Planejar coexistência, migração e retirada de versões em .
  • Diferenciar versão pública, revisão, release de implementação e versão da especificação.
  • Utilizar , , changelogs e guias de migração.
  • Aplicar diff semântico, testes de contrato, telemetria e quality gates.
  • Diagnosticar roteamento incorreto, e consumidores presos em versões antigas.

Estrutura do capítulo

  • 28.1 Por que precisam evoluir; 28.2 Contrato público; 28.3 Dimensões de compatibilidade; 28.4 Direção dos dados; 28.5 Taxonomia de mudanças; 28.6 ; 28.7 Dimensões de versão; 28.8 Path; 28.9 Query, e media type; 28.10 Versões por data; 28.11 Critérios de escolha; 28.12 e enums; 28.13 Operações, erros, segurança e limites; 28.14 , , e eventos; 28.15 Dados persistentes; 28.16 Coexistência; 28.17 Azure ; 28.18 Ciclo de vida; 28.19 Depreciação e ; 28.20 Comunicação; 28.21 Telemetria; 28.22 Diff e testes; 28.23 ; 28.24 e ; 28.25 Estudos de caso e laboratórios.

28.1 Por que precisam evoluir

evoluem porque o domínio muda. Novas regras regulatórias, produtos, canais, parceiros e requisitos de segurança exigem informações adicionais ou comportamentos diferentes. Também existem motivos técnicos: correção de modelagem, melhoria de desempenho, substituição de dependências, adoção de novos formatos e eliminação de vulnerabilidades. Congelar uma interface para sempre transfere custo ao , que passa a manter adaptações e exceções indefinidamente.

Ao mesmo tempo, uma publicada cria dependência. O consumidor pode compilar um , persistir respostas, validar enums como conjuntos fechados, usar um status para controle de fluxo ou assumir determinada ordenação. Essas suposições nem sempre aparecem no contrato formal. Uma mudança pequena para o provedor pode ser quebradora para aplicações que incorporaram o comportamento anterior.

A evolução segura separa mudança interna de mudança observável. Refatorar classes, trocar banco ou mover o serviço entre não exige nova versão quando o contrato e as características prometidas permanecem. Alterar campo obrigatório, remover valor aceito ou mudar semântica de operação afeta a interface pública, mesmo que a continue igual.

Princípio de arquitetura

Nova implantação não implica automaticamente nova versão pública. Uma nova versão pública é necessária quando o contrato observável muda de forma incompatível ou quando a organização precisa oferecer comportamentos distintos explicitamente.

28.2 O contrato público de uma

O contrato público inclui tudo aquilo que o consumidor pode observar e em que foi autorizado a confiar. Paths, métodos, parâmetros, , status, , media types e requisitos de segurança formam a parte explícita. Latência acordada, limites, ordenação, consistência, idempotência, política de e janela de disponibilidade podem formar uma parte operacional igualmente relevante.

O contrato não se limita ao documento . Ele também existe no , na implementação, no portal, nos SDKs e no comportamento real de produção. Quando essas representações divergem, surge . Comparar a nova proposta apenas com um arquivo desatualizado produz falsa segurança; a deve corresponder à versão realmente publicada e suportada.

O consumidor não precisa conhecer detalhes internos, mas precisa de previsibilidade. O provedor pode alterar a implementação livremente enquanto preserva semântica e garantias. A fronteira entre liberdade interna e compromisso externo é a essência de uma estratégia de versionamento madura.

28.3 Dimensões de compatibilidade

Compatibilidade sintática significa que a mensagem ainda pode ser analisada. Compatibilidade estrutural indica que tipos, propriedades e restrições continuam aceitos. Compatibilidade semântica exige que o significado permaneça. Compatibilidade comportamental observa efeitos, transições e erros. Compatibilidade operacional inclui desempenho, disponibilidade, limites e características necessárias para o consumidor cumprir seus próprios objetivos.

Uma pode permanecer estruturalmente compatível e quebrar semanticamente: o campo continua sendo string, mas o mesmo valor passa a significar outro estado. Pode também manter a semântica e falhar operacionalmente quando a paginação diminui, o rate limit é reduzido ou o cresce além da jornada do consumidor. O diff do contrato é necessário, mas não suficiente.

Tabela 1 - Compatibilidade precisa ser avaliada em várias dimensões.
DimensãoPergunta de verificaçãoExemplo de quebra
SintáticaA mensagem ainda pode ser lida?Media type removido ou payload inválido.
EstruturalTipos e restrições continuam compatíveis?Campo muda de string para inteiro.
SemânticaO significado permaneceu?Mesmo valor passa a representar outro estado.
ComportamentalEfeitos, ordem e erros permanecem?POST antes idempotente passa a duplicar.
OperacionalSLA, limites e volume permanecem viáveis?Página máxima ou quota reduzida.

28.4 Direção dos dados e perspectiva do consumidor

A mesma alteração pode ter impacto oposto conforme a direção do dado. Em um , o consumidor produz e o provedor interpreta. Tornar a validação do provedor mais permissiva geralmente preserva antigos; torná-la mais restritiva pode rejeitá-los. Em uma , o provedor produz e o consumidor interpreta; acrescentar possibilidades pode exigir tolerância que o cliente não possui.

Adicionar valor de enum em costuma ser compatível para consumidores existentes, pois eles podem continuar enviando valores conhecidos. Adicionar valor em pode quebrar clientes que mapearam o conjunto como fechado. Ferramentas de diff precisam conhecer essa direção; regras genéricas como “adição é compatível” produzem falsos negativos.

, e eventos invertem papéis tradicionais. A organização que normalmente atua como servidor passa a produzir mensagens consumidas por terceiros. A revisão precisa registrar claramente quem produz e quem interpreta cada elemento.

Compatibilidade analisada conforme a direção dos dados entre consumidor e provedor
Figura 1 - A direção dos dados muda a classificação de compatibilidade.

28.5 Taxonomia de mudanças

Mudanças aditivas acrescentam elementos sem remover existentes: operação nova, campo opcional ou media type adicional. Costumam ser compatíveis, mas não são automaticamente seguras. Campo adicional em pode quebrar desserializadores estritos; valor novo de enum pode atingir um switch sem caso default; rota nova pode colidir com rota genérica no .

Mudanças restritivas reduzem o conjunto de mensagens aceitas. Tornar campo obrigatório, diminuir maxLength, eliminar enum ou aceitar menos formatos tende a quebrar antes válidos. Mudanças substitutivas trocam um elemento por outro, como renomear propriedade, path ou escopo . Mudanças comportamentais preservam estrutura, mas alteram regra, side effect, consistência, ordenação ou política de erro.

A classificação deve registrar direção, alcance e mitigação. Uma mudança pode ser compatível para e incompatível para ; segura para clientes tolerantes e arriscada para SDKs gerados; aceitável em preview e inadequada em produção.

Tabela 2 - Taxonomia prática para revisão de mudanças.
CategoriaExemploRisco principal
AditivaNova propriedade opcional em response.Cliente rejeita campos desconhecidos.
RestritivaCampo antes opcional torna-se required.Requests existentes passam a falhar.
SubstitutivaRenomear clienteId para id.Código e SDK precisam mudar.
ComportamentalMudar ordenação padrão.Paginação e resultados deixam de ser estáveis.
OperacionalReduzir timeout, quota ou rate limit.Consumidor não cumpre sua jornada.

28.6 Versionamento semântico e seus limites

Semantic Versioning utiliza MAJOR.MINOR. . A major aumenta quando há mudança incompatível na pública; minor quando há funcionalidade compatível; quando há correção compatível. O modelo é valioso porque obriga a declarar uma interface pública e atribui significado à mudança de número.

Em remotas, precisa de senso crítico. O consumidor não escolhe necessariamente uma versão exata do servidor como escolhe uma biblioteca. O provedor pode implantar continuamente sob o mesmo , e características operacionais também fazem parte da experiência. Publicar 1.4.3 em info.version não determina como o selecionará a versão.

Muitas organizações expõem apenas a major, como v1, e tratam minor e como releases compatíveis sob a mesma interface. Essa abordagem reduz proliferação de , mas exige disciplina rigorosa na classificação de compatibilidade. não substitui política de depreciação, suporte ou migração.

Tabela 3 - SemVer comunica intenção, mas depende de regras claras de compatibilidade.
NúmeroIntençãoUso possível em APIs
MAJORMudança incompatível.Nova interface selecionável: v1 para v2.
MINORFuncionalidade compatível.Release compatível sob a mesma major.
PATCHCorreção compatível.Correção de implementação sem novo contrato público.

28.7 Versão pública, contrato, implementação e especificação

Uma arquitetura madura distingue diferentes números. A versão pública identifica uma interface selecionável pelo consumidor. A versão do contrato identifica uma revisão do documento ou do . A versão da implementação identifica build ou release do . A versão da especificação, como 3.1, informa qual dialeto descreve o documento.

Esses números mudam por razões diferentes. O pode receber várias implantações sem alterar a versão pública. O contrato pode corrigir uma descrição sem mudar o runtime. Migrar a descrição de 3.0 para 3.1 não exige criar v2. Confundir dimensões produz instáveis e dificulta auditoria.

e métricas devem registrar versão pública solicitada, revisão do , build do e checksum do contrato. Essa correlação permite investigar quando respostas aparentemente da mesma vieram de implementações diferentes.

Tabela 4 - Não trate todos os números como uma única versão.
DimensãoExemploUso
Versão públicav2Consumidor, portal e roteamento.
Contrato2.3.0Diff, testes, catálogo e governança.
Implementaçãobuild 2026.07.16.4Deploy, rollback e observabilidade.
Especificaçãoopenapi: 3.1.1Parser, editor e geradores.

28.8 Versionamento no caminho da

O versionamento por path coloca o identificador em uma parte visível da , como /v1/clientes. É simples de compreender, aparece em sem inspeção de e costuma ser facilmente roteado por . Também permite documentação e políticas separadas por base path.

A principal desvantagem é transformar a versão em parte da identidade do recurso. /v1/clientes/10 e /v2/clientes/10 são diferentes, mesmo representando a mesma entidade. Links, e integrações precisam ser atualizados. O padrão funciona melhor quando apenas mudanças major incompatíveis geram novo caminho.

O deve impedir ambiguidades, como /v1beta colidir com /v1, e precisa definir o comportamento de paths sem versão. Redirecionar silenciosamente para a versão mais nova pode ser perigoso; rejeição explícita ou versão default documentada são escolhas mais previsíveis.

Exemplo de versão no caminho

GET /v2/clientes/123 HTTP/1.1
Host: api.empresa.example
Accept: application/json

28.9 , e media type

A expressa a versão como parâmetro, por exemplo ? -version=2026-07-01. Preserva o caminho e é comum em serviços que versionam por data. e precisam incluir o parâmetro na chave e impedir que valores desconhecidos sejam ignorados silenciosamente.

Um dedicado, como -Version: 2, mantém a estável e torna a negociação explícita. A desvantagem é menor visibilidade em ferramentas simples e que não registram . , , e observabilidade precisam preservar o campo corretamente.

Versionamento por media type utiliza Accept, como application/vnd.empresa.cliente-v2+ . Ele combina formato e versão de representação e se alinha à negociação de conteúdo. Entretanto, aumenta complexidade de tooling e exige Vary: Accept quando a resposta muda conforme o .

Estratégias para selecionar versões por path, query, header e media type
Figura 2 - Estratégias de seleção possuem trade-offs em visibilidade, e operação.
Tabela 5 - A escolha deve funcionar em toda a cadeia técnica.
MecanismoVantagemCuidado
PathVisível e simples de rotear.Muda a URI e tende a proliferar.
QueryBoa para versões por data.Cache e links devem preservar o parâmetro.
HeaderMantém o caminho estável.Menor visibilidade e maior dependência de tooling.
Media typeNegocia versão e representação.Complexidade de clientes e caches.

Versões por data, como 2026-07-01, comunicam uma temporal em vez de uma sequência major. São úteis em plataformas com muitas mudanças coordenadas ou quando o consumidor precisa fixar o comportamento conhecido em determinada data. A data não significa necessariamente data de ; ela representa um contrato publicado e precisa ser imutável depois de disponibilizado.

Outra abordagem combina versão major com níveis de estabilidade: alpha, beta e stable. Alpha admite mudanças frequentes e suporte limitado; beta sinaliza maior maturidade, mas ainda pode evoluir; stable oferece compromissos de compatibilidade e suporte. Esses rótulos só têm valor quando existem critérios claros de promoção e retirada.

Versões por data e rótulos de estabilidade não eliminam a necessidade de compatibilidade. Eles apenas expressam melhor o modelo de ciclo de vida escolhido pela organização.

28.11 Critérios para escolher uma estratégia

Não existe mecanismo universalmente melhor. A decisão precisa considerar consumidores, , observabilidade, portais, SDKs, infraestrutura, políticas corporativas e capacidade de operação. Path costuma favorecer simplicidade; e media type favorecem estável; query funciona bem para baselines por data. Consistência organizacional é mais importante que preferência individual.

A estratégia também precisa definir versões ausentes, desconhecidas e retiradas. O deve responder de forma previsível, com mensagem de erro padronizada e link para documentação. Fallback silencioso para a versão mais próxima pode mascarar falhas e produzir comportamento incorreto.

Quando diferentes equipes adotam mecanismos incompatíveis, o custo aparece no portal, nos clientes e na observabilidade. Um padrão corporativo deve permitir exceções justificadas, mas precisa manter critérios comuns de compatibilidade, ciclo de vida e depreciação.

28.12 Evolução de , campos, enums e nullability

Adicionar campo opcional em normalmente é compatível porque clientes antigos simplesmente não o enviam. Torná-lo obrigatório quebra mensagens existentes. Em , adicionar campo pode quebrar clientes estritos. Remover campo, alterar tipo, diminuir limites ou mudar nullability tende a ser incompatível.

Enums exigem atenção especial. Em , adicionar valor aceito pelo servidor não obriga clientes antigos a usá-lo. Em , o novo valor pode quebrar SDKs que geraram enum fechado. Uma política de evolução deve definir se consumidores precisam ignorar valores desconhecidos ou mapear um estado UNKNOWN.

, e geradores de podem interpretar ausência, null e valor vazio de formas diferentes. Alterar campo de nullable para não nullable, mudar default ou passar a omitir propriedades pode afetar lógica mesmo quando o tipo nominal permanece igual.

Tabela 6 - A direção da mensagem altera a análise de compatibilidade.
MudançaRequestResponse
Adicionar campo opcionalGeralmente compatível.Condicional: cliente deve tolerar desconhecidos.
Tornar campo requiredQuebradora.Pode quebrar parsing e expectativas.
Adicionar enumGeralmente compatível.Arriscada para clientes com enum fechado.
Mudar tipoQuebradora.Quebradora.
Alterar nullabilityNormalmente quebradora.Pode quebrar validação e lógica.

Adicionar operação costuma ser compatível, mas pode colidir com rotas genéricas. Remover ou renomear path ou método é quebrador. Tornar parâmetro obrigatório, mudar localização de query para , alterar encoding ou eliminar media type exige migração coordenada.

Status e modelos de erro fazem parte do contrato. Trocar 404 por 200 com corpo vazio, alterar 409 para 422 ou substituir estrutura de erro pode quebrar , observabilidade e controle de fluxo. O provedor deve manter códigos estáveis ou fornecer uma nova versão com guia claro de migração.

Mudanças em segurança são frequentemente incompatíveis: exigir novo escopo , trocar audience, remover , exigir ou alterar assinatura de . O mesmo vale para rate limits, quotas, e paginação. A versão pública deve refletir mudanças que inviabilizam consumidores existentes, ainda que o permaneça idêntico.

28.14 Versionamento em , , e eventos

Em , versões aparecem frequentemente no path, query, ou media type. Em , a evolução costuma ocorrer no próprio por adição e depreciação de campos; criar /v2 para qualquer mudança elimina parte da flexibilidade do modelo. Campos incompatíveis podem coexistir temporariamente, com @deprecated e telemetria por operação.

Em e Protocol , compatibilidade depende de números de campo. Campos removidos devem ser marcados como reserved e números antigos não podem ser reutilizados. Pacotes e serviços podem incluir major na nomenclatura quando há quebra. A compatibilidade binária precisa ser testada contra clientes gerados em versões anteriores.

Eventos e mensageria exigem atenção especial porque mensagens podem permanecer armazenadas. O consumidor pode processar eventos antigos depois de uma nova versão ser publicada. Estratégias incluem registry, compatibilidade backward/forward, versionamento no envelope e consumidores tolerantes. Atualizar produtor e consumidor simultaneamente raramente é seguro em ambientes distribuídos.

28.15 Dados persistentes e migrações

Mudanças de frequentemente dependem de mudanças no banco. Adicionar campo obrigatório em v2 pode exigir backfill de registros históricos. Alterar identificador ou normalizar uma entidade pode afetar links, eventos e . A migração precisa considerar dados antigos, e coexistência entre versões da aplicação.

O padrão expand-and-contract também se aplica ao banco: primeiro adicione nova coluna ou estrutura sem remover a antiga; depois escreva nos dois formatos ou faça backfill; em seguida migre leitores; por fim remova a estrutura antiga quando não houver dependentes. Trocas instantâneas aumentam risco porque código e dados raramente mudam de forma atômica em toda a plataforma.

Quando v1 e v2 precisam ler e escrever o mesmo domínio, a organização deve definir fonte de verdade, transformação e consistência. Adaptadores no resolvem diferenças superficiais; mudanças profundas de semântica pertencem ao domínio ou a serviços de compatibilidade dedicados.

28.16 Coexistência de versões e adapters

Coexistência permite que consumidores migrem em ritmos diferentes. O pode rotear v1 e v2 para separados, para a mesma implementação com branches internas ou para uma façade que adapta contratos. Cada opção possui custo. separados aumentam isolamento, mas duplicam operação; implementação compartilhada reduz infraestrutura, mas acumula condicionais; adapters funcionam bem para diferenças de representação, mas não para regras de negócio incompatíveis.

Uma versão antiga não deve permanecer indefinidamente apenas porque ainda recebe tráfego. O provedor precisa medir consumidores, classificar criticidade, definir prazo e oferecer suporte de migração. Sem , versões se tornam produtos permanentes e ampliam superfície de ataque.

Políticas, , autenticação, observabilidade e podem divergir por versão. O precisa registrar versão recomendada, estado, owner, documentação e relação de substituição.

28.17 Versions e revisions no Azure Management

No Azure Management, versions agrupam relacionadas e permitem expor interfaces incompatíveis por path, query ou . São apropriadas quando consumidores precisam selecionar explicitamente contratos diferentes. Cada versão pode possuir operações, policies, produtos e documentação próprios.

Revisions atendem outro problema: alterar e testar uma sem criar nova versão pública. Uma revisão pode receber mudanças não quebradoras, ser testada separadamente e depois tornar-se current. O pode ser publicado para consumidores. Revisão não é substituta de versionamento quando o contrato é incompatível.

A regra prática é simples: mudança não quebradora pode ser preparada como revisão e promovida à versão atual; mudança quebradora exige nova versão e plano de migração. O precisa evitar que uma revisão experimental se torne current sem testes e aprovação.

Tabela 7 - Version, revision e release resolvem problemas diferentes.
ConceitoQuando usarEfeito para o consumidor
VersionContrato incompatível ou comportamento distinto.Seleciona versão por mecanismo explícito.
RevisionMudança controlada sob a mesma versão pública.Normalmente continua chamando a mesma versão.
Release/buildMudança de implementação interna.Nenhuma seleção pública necessária.

28.18 Estados do ciclo de vida e governança

Uma versão precisa de estados claros. Design indica contrato em revisão; preview permite pilotos e admite mudanças; active oferece suporte e ; deprecated informa que a versão não é mais recomendada; marca data de retirada; retired indica que o tráfego não é mais atendido.

Cada transição precisa de critérios de entrada e saída. Para tornar active, por exemplo, o contrato deve estar publicado, políticas testadas, capacidade validada e owner definido. Para entrar em deprecated, deve existir substituta funcional, guia de migração e prazo. Para retirar, telemetria precisa demonstrar ausência ou aceitação formal dos consumidores restantes.

A governança deve impedir versões órfãs: sem owner, sem documentação, sem observabilidade ou com certificado e dependências sem manutenção.

Ciclo de vida governado de uma versão de API
Figura 3 - Ciclo de vida transforma versão em objeto governado e auditável.

Depreciação não significa desligamento imediato. Ela comunica que o recurso ou versão não é mais recomendado e pode ser retirado no futuro. O consumidor precisa de substituta, prazo, justificativa e documentação de migração. A data de representa o momento a partir do qual o recurso tende a deixar de responder.

O permite sinalizar que o recurso será ou já foi depreciado. O link relation pode apontar para documentação adicional. O informa quando a provavelmente se tornará indisponível. Esses sinais complementam portal, e-mail e ; não substituem gestão ativa dos consumidores.

A data de não deve ser anterior à data de depreciação. O pode inserir esses por versão, mas a configuração precisa ser consistente com catálogo e plano real de retirada.

Exemplo de sinalização de depreciação

HTTP/1.1 200 OK
Deprecation: @1782863999
Sunset: Wed, 30 Jun 2027 23:59:59 GMT
Link: <https://developer.example/migrations/v2>; rel="deprecation"

28.20 Comunicação, e guia de migração

Uma comunicação eficaz responde o que mudou, por que mudou, quem é afetado, quando a versão será retirada e como migrar. O deve ser orientado ao consumidor, não uma lista de commits. O guia precisa mostrar mapeamento de campos, diferenças de status, novos requisitos de segurança e exemplos antes/depois.

Consumidores críticos podem exigir contato direto, janela de homologação e acompanhamento. Notificações genéricas no portal são insuficientes quando a versão participa de pagamentos, Open Finance ou jornadas reguladas. A organização deve registrar confirmação, riscos e exceções.

O portal deve indicar versão recomendada, estado das demais, documentação, SDKs, e datas. Links quebrados ou documentação divergente reduzem confiança e prolongam migrações.

28.21 Inventário e telemetria de consumidores

Não é possível retirar com segurança aquilo que não é medido. O inventário deve identificar aplicação, owner, tenant, ambiente, versão usada, criticidade e volume. isolado é insuficiente em ambientes com , e pools compartilhados. client_id, subscription key, certificado ou identidade de workload são chaves melhores.

Telemetria precisa cobrir tráfego periódico e jornadas sazonais. Uma versão pode parecer inativa durante dias e ser usada apenas no fechamento mensal. Métricas úteis incluem chamadas por versão, consumidores únicos, erros, operações utilizadas, última atividade e percentual de migração.

devem preservar versão solicitada e versão efetivamente roteada. Quando o aplica default ou rewrite, a diferença precisa estar visível para evitar diagnósticos incorretos.

28.22 Diff semântico, testes de contrato e quality gates

Diff textual identifica linhas alteradas, mas não entende impacto. Diff semântico interpreta operações, , direção dos dados, required, enums e restrições. Ainda assim, ferramentas não capturam toda mudança comportamental. A revisão humana precisa analisar semântica, segurança e operação.

O deve validar sintaxe, linting, regras corporativas, diff contra a publicada, testes de contrato, testes de consumidores e aprovação de exceções. A não pode ser apenas a branch principal; deve representar o artefato realmente em produção.

Consumer-driven contract testing ajuda a revelar dependências concretas, mas não substitui contrato do provedor. Uma boa estratégia combina ou oficial, testes de compatibilidade e telemetria real.

Tabela 8 - Automação reduz risco, mas precisa de contexto e revisão.
Quality gateObjetivoFalha detectada
Parser e linterGarantir contrato válido e consistente.Erro estrutural ou violação de padrão.
Diff semânticoClassificar impacto da mudança.Remoção, restrição ou enum incompatível.
Contract testsVerificar implementação contra contrato.Runtime diverge da especificação.
Consumer testsValidar expectativas reais.Cliente quebra apesar de diff aparentemente seguro.
TelemetriaConfirmar adoção e uso.Consumidor ainda preso na versão antiga.

O padrão evita troca instantânea. Na fase de expansão, o provedor aceita antigo e novo: adiciona campo, ou formato sem remover o existente. Na migração, consumidores são movidos gradualmente, com telemetria e suporte. Na contração, o elemento antigo é removido apenas quando não há dependentes relevantes.

Para renomear um campo obrigatório, por exemplo, o servidor pode aceitar os dois nomes, responder temporariamente com ambos e registrar qual forma cada consumidor utiliza. Depois que todos migram, o nome antigo é depreciado e removido em nova major ou na janela de compatibilidade definida.

O padrão aumenta temporariamente a complexidade, mas reduz risco, facilita e elimina necessidade de sincronizar de todos os consumidores.

Expandir, migrar e contrair

Evolução segura pelas fases expandir, migrar e contrair
Figura 4 - Evolução segura utiliza coexistência temporária e evidência de migração.

28.24 , roteamento e

O é ponto natural de seleção de versão, mas não deve esconder semântica incompatível. Policies podem extrair versão de path, query ou , validar valores, rotear para , inserir de depreciação e registrar telemetria. A ordem de policies precisa ser previsível: identificar versão antes de , autenticação específica e roteamento.

Falhas comuns incluem versão default inesperada, rewrite incorreto, compartilhado entre versões, policy herdada apenas em parte, v2 recebendo tráfego v1 e documentação apontando para outra base . devem registrar versão recebida, versão resolvida, escolhido, revisão e contract checksum.

No , reproduza a requisição com todos os elementos de seleção e compare , portal, e . Um 404 pode significar operação inexistente na versão, rota não publicada ou mal configurado. Um 200 com antigo pode indicar ou roteamento incorreto.

28.25 Estudos de caso e laboratórios

Estudo de caso 1: uma de clientes precisa substituir idCliente por customerId. A equipe usa expansão temporária, aceita ambos em , responde com os dois durante a migração, mede uso e publica v2 apenas quando outras mudanças incompatíveis justificam uma nova major.

Estudo de caso 2: uma de pagamentos passa a exigir e novo audience. Como a mudança afeta credenciais e infraestrutura do consumidor, a equipe cria v2, mantém v1 por prazo definido, distribui certificados em homologação e usa e em produção.

Estudo de caso 3: no Azure , uma correção de descrição e novo campo opcional são preparados como da v2. Depois de testes, a revisão torna-se current sem criar v3. Meses depois, uma mudança incompatível de contrato gera v3 no mesmo .

Laboratórios sugeridos

1) Compare dois documentos e classifique as mudanças. 2) Configure versionamento por path e em um de laboratório. 3) Simule e . 4) Crie telemetria por versão e consumidor. 5) Execute uma migração com campo renomeado.

Resumo do capítulo

Versioning é um mecanismo de coordenação para mudanças observáveis. O objetivo não é gerar números, mas permitir evolução com risco controlado. Compatibilidade precisa ser analisada nas dimensões sintática, estrutural, semântica, comportamental e operacional.

A direção dos dados altera a classificação de mudanças. Estratégias por path, query, , media type ou data possuem trade-offs e precisam funcionar em toda a cadeia. Versão pública, revisão, release e versão da especificação são dimensões diferentes.

O ciclo de vida transforma depreciação e retirada em processos auditáveis. e melhoram comunicação em runtime, mas inventário, telemetria, guias de migração e confirmação de adoção determinam segurança. Diff semântico, testes e reduzem risco sem impedir evolução.

Próximo passo do curso

Com versões e ciclo de vida governados, o próximo capítulo aprofunda Service Mesh, incluindo Istio, Linkerd e Envoy, e mostra como políticas, identidade e observabilidade são aplicadas à comunicação entre serviços.

Checklist de Versioning

  • A corresponde ao contrato realmente publicado e suportado.
  • A mudança foi analisada nas dimensões sintática, estrutural, semântica, comportamental e operacional.
  • A direção dos dados e o comportamento de SDKs foram considerados.
  • Nova versão é criada apenas quando existe incompatibilidade ou necessidade explícita de coexistência.
  • O mecanismo de seleção funciona em cliente, , , , portal e observabilidade.
  • Versão pública, revisão, build e versão da especificação estão separadas.
  • A depreciação oferece substituta, guia, prazo, owner e canal de suporte.
  • , , portal e catálogo estão consistentes.
  • O inventário identifica consumidores por aplicação ou identidade, não apenas por .
  • O executa parser, linter, diff, testes e aprovação de exceções.
  • A retirada possui evidência, comunicação e plano de recuperação.

Exercícios

  • Explique por que adicionar campo em pode ser quebrador.
  • Diferencie compatibilidade estrutural, semântica e operacional.
  • Classifique a adição de enum em e em .
  • Diferencie versão pública, contrato, revisão, build e versão da Specification.
  • Compare path, query, , media type e versão por data.
  • Explique quando uma é preferível a uma nova version no Azure .
  • Escreva resposta com , e Link para guia de migração.
  • Descreva um plano para renomear campo obrigatório.
  • Proponha métricas para decidir se v1 pode ser retirada.
  • Descreva como investigar quando v2 retorna comportamento de v1.

Glossário

Tabela 9 - Vocabulário essencial do capítulo.
TermoDefinição
Backward compatibilityCapacidade de consumidores existentes continuarem funcionando após uma mudança.
BaselineContrato ou comportamento de referência usado na comparação.
Breaking changeMudança incompatível com expectativas suportadas.
ChangelogRegistro orientado ao consumidor sobre mudanças publicadas.
Compatibility windowPeríodo de coexistência e migração entre contratos.
Contract driftDivergência entre descrição, gateway e runtime.
DeprecationSinalização de que uma interface não é recomendada e poderá ser retirada.
Expand-migrate-contractEstratégia de introduzir compatibilidade, migrar e remover o antigo.
RevisionAlteração controlada sob a mesma versão pública.
Semantic diffComparação que interpreta impacto do contrato.
SemVerVersionamento semântico MAJOR.MINOR.PATCH.
SunsetMomento a partir do qual um recurso tende a deixar de responder.
Version setGrupo de versões relacionadas de uma API.

Referências técnicas

  • . 9110 - Semantics.
  • . 8594 - The Field.
  • . 9745 - The Field.
  • Microsoft Learn. Versions in Azure Management.
  • Microsoft Learn. Revisions in Azure Management.
  • Google Cloud Design Guide. AIP-185: Versioning.
  • Semantic Versioning Specification 2.0.0.
  • Initiative. Specification 3.1.
  • Protocol Documentation. Updating a Message Type.
  • Specification e práticas de depreciação de .

Nota de atualização

Padrões, serviços gerenciados e ferramentas evoluem. Antes de automatizar version sets, revisions, depreciação ou diff semântico, valide a documentação oficial da versão implantada e teste o comportamento em ambiente autorizado.