Estamos projetando um sistema baseado em microsserviços independentes (conectados via um barramento RabbitMq). O código (pelo menos para os primeiros componentes) será escrito em python (python2 e python3). Já temos um aplicativo monolítico implementando parte da lógica de negócios, que queremos refatorar como microsserviços e estender. Uma pergunta que me preocupa é:
Qual é a melhor maneira de compartilhar código entre os diferentes microsserviços. Temos funções auxiliares comuns (processamento de dados, log, análise de configuração, etc.), que devem ser usadas por vários microsserviços.
Os próprios microsserviços serão desenvolvidos como projetos separados (repositórios git). As bibliotecas comuns também podem ser desenvolvidas como um projeto independente. Como compartilho essas bibliotecas entre os microsserviços?
Eu vejo várias abordagens:
- copie a versão da biblioteca necessária para cada microsserviço e atualize conforme necessário
- libere as bibliotecas comuns para um PyPi interno e liste essas bibliotecas como dependências nos requisitos do microsserviço
- incluir o repositório da biblioteca como um submódulo git
Gostaria de ler um pouco mais sobre abordagens sugeridas, melhores práticas, experiências passadas antes de decidir como proceder. Você tem alguma sugestão ou link?
fonte
fib(n)
(implementação da série fibonacci). Você não deseja repetir essa implementação em cada microsserviço. Pertence a umautils
biblioteca (com versão, para recursos e correções). Esse não é um monólito distribuído, é apenas uma camada de funcionalidade comum. Minha pergunta é como lidar com essa camada no nível de implementação?Respostas:
Sua segunda opção é definitivamente o caminho a percorrer. Divida as bibliotecas comuns e instale-as no servidor PyPi local.
A opção 1 é horrível, porque será difícil propagar melhorias nas bibliotecas para outras pessoas que possam usá-la.
A opção 3 é semelhante à opção 1.
O padrão comum é configurar o Jenkins para que, quando você passar para o mestre de um repositório de biblioteca, ele crie uma compilação python e faça o upload automaticamente para o repositório PyPi. Depois de escrever esse script de construção, você nunca precisará se preocupar com as bibliotecas de empacotamento e com o upload manual delas no PyPi. E com esta opção, todas as atualizações da biblioteca estarão instantaneamente disponíveis para serem possivelmente atualizadas em outros microsserviços.
A configuração do seu próprio servidor PyPi é muito fácil. Eu gosto deste guia
fonte
Não é um cara Python, mas o servidor PyPi parece a melhor opção. Uma rápida pesquisa no Google parece que é análogo a um repositório Nexus para os jars Java da equipe.
Desde que esteja sendo implantado em algum tipo de repositório central (para o escritório / equipe) com o qual sua ferramenta de gerenciamento de dependência pode trabalhar (ler e implantar), é uma boa opção.
A opção 1 é realmente a pior, você nunca deve ter que lidar manualmente com dependências. É uma dor. Na faculdade, antes que eu soubesse sobre Maven, e quando pensei que o Git era muito complicado, fizemos tudo manualmente, desde a fusão do código de todos até a criação de caminhos de classe, passando pelas dependências. Foi uma dor, eu seriamente não gostaria que ninguém passasse por uma fração desse problema, especialmente em um ambiente de trabalho onde a eficiência é importante.
A opção 3 provavelmente funcionaria bem, mas não possui benefícios reais em relação a um PyPi local (além de talvez ser mais fácil de configurar, mas os benefícios de um sistema de gerenciamento de dependências real são muito melhores).
fonte
Antes de tudo, dividir um monólito em microsserviços sempre será difícil. Consulte Gerenciamento de dados descentralizado - encapsulando bancos de dados em microsserviços para ter uma idéia do porquê.
Dito isto, existem várias receitas de como fazê-lo de forma relativamente saudável. Um deles é http://12factor.net/ . Quem diria que você deve manter cada biblioteca e aplicativo independentemente e depois gerenciar explicitamente as dependências. Se você seguir esse caminho, recomendo vivamente que você tenha um comando simples que atualize todas as dependências para o que estiver atual e execute-o regularmente para cada microsserviço. É importante ter um processo de versão sensato em que você bloqueia versões de bibliotecas em produção. No entanto, você realmente, realmente , realmente não quer estar em uma posição em que as dependências ficam obsoletas e você não sabe o que está por aí.
Também se concentre em tornar suas bibliotecas de apoio o mais restritas e focadas possível. Sempre haverá uma atração natural para começar a adicionar itens às bibliotecas principais para facilitar o compartilhamento. Faça isso e você rapidamente puxará toda a bola de espaguete existente para as bibliotecas compartilhadas e voltará efetivamente à bagunça que você tem agora. Portanto, é melhor corrigir em sentido contrário.
fonte
Você deve poder ficar sem servidor apontando diretamente de um arquivo de dependência de pacote Python para os repositórios particulares do GitHub que contêm as bibliotecas. Pipenv e Poeta apoiam isso, acredito.
fonte