Tenho lido sobre estratégias de controle de versão para APIs ReST, e algo que nenhum deles parece abordar é como você gerencia a base de código subjacente.
Digamos que estejamos fazendo várias alterações significativas em uma API - por exemplo, alterando nosso recurso Customer para que ele retorne campos forename
e separados surname
em vez de um único name
campo. (Para este exemplo, usarei a solução de controle de versão de URL, pois é fácil entender os conceitos envolvidos, mas a questão é igualmente aplicável à negociação de conteúdo ou cabeçalhos HTTP personalizados)
Agora temos um endpoint em http://api.mycompany.com/v1/customers/{id}
e outro endpoint incompatível em http://api.mycompany.com/v2/customers/{id}
. Ainda estamos lançando correções de bugs e atualizações de segurança para a API v1, mas o desenvolvimento de novos recursos agora está focado na v2. Como escrevemos, testamos e implementamos mudanças em nosso servidor API? Posso ver pelo menos duas soluções:
Use um branch / tag de controle de origem para a base de código v1. v1 e v2 são desenvolvidos e implantados de forma independente, com mesclagens de controle de revisão usadas conforme necessário para aplicar a mesma correção de bug a ambas as versões - semelhante a como você gerencia bases de código para aplicativos nativos ao desenvolver uma nova versão principal, embora ainda suporte a versão anterior.
Torne a própria base de código ciente das versões da API, para que você termine com uma única base de código que inclui a representação do cliente v1 e a representação do cliente v2. Trate o controle de versão como parte da arquitetura da sua solução, em vez de um problema de implantação - provavelmente usando alguma combinação de namespaces e roteamento para garantir que as solicitações sejam tratadas pela versão correta.
A vantagem óbvia do modelo de branch é que é trivial excluir versões antigas da API - apenas pare de implantar o branch / tag apropriado - mas se você estiver executando várias versões, pode acabar com uma estrutura de branch e pipeline de implantação realmente complicada. O modelo de "base de código unificada" evita esse problema, mas (eu acho?) Tornaria muito mais difícil remover recursos obsoletos e pontos de extremidade da base de código quando eles não fossem mais necessários. Sei que isso é provavelmente subjetivo, pois é improvável que haja uma resposta correta simples, mas estou curioso para entender como as organizações que mantêm APIs complexas em várias versões estão resolvendo esse problema.