Node: levantar vários serviços em local
O Node torna fáceis os dois primeiros serviços: npm start duas vezes e estás a
trabalhar. A confusão chega com o quarto terminal, com o segundo serviço que também quer a
porta 3000 e com o pacote em que estás a mexer ao mesmo tempo que o serviço que o consome.
O que se parte primeiro
- Os terminais. Um por serviço, cada um com o seu ambiente, e sem memória de que combinação funcionava ontem.
- As portas. Tudo traz 3000 por omissão. Acabas com um
.envpor programador que nunca é comitado e nunca é documentado. - Os URLs entre serviços. Cada
fetcha outro serviço lê uma variável, e apontar três ao ambiente partilhado significa editar ficheiros que não deves comitar. - O pacote local. O
npm linkfunciona até deixar de o fazer: dependências duplicadas, uma cópia hoisted que ganha e uma resolução que se comporta de forma diferente da publicada. - Ninguém espera por ninguém. O teu serviço arranca, chama o que ainda não acabou de levantar, e o erro parece uma falha do teu código.
O que o Aseptic faz
O Aseptic deteta um serviço Node —ou um front de Angular— pelo seu package.json,
arranca-o como processo nativo com o teu próprio script e passa-lhe a configuração como
variáveis de ambiente ao arrancar. Os URLs entre serviços são reescritos aí, por isso nenhum
.env do teu repositório tem de mudar e não há nada de que esquecer-se de
reverter.
Um cenário é o conjunto de serviços de um fluxo, arrancados por ordem de dependência e esperando pela saúde, não pelo processo. As portas que colidem são remapeadas e o valor remapeado é o que recebem os que chamam. Se o fluxo precisar de Kafka, Redis ou PostgreSQL, o Aseptic levanta-os em Docker e gere-os — os teus serviços ficam fora do Docker, salvo se os quiseres em contentor.
Cada dependência resolve-se onde tu escolheres: um serviço local que tenhas aberto, o ambiente partilhado da nuvem ou um mock. Por dependência, e pode mudar-se a meio da tarde.
Pacotes locais, sem as surpresas do npm link
Se estás a mexer ao mesmo tempo num pacote teu e no serviço que o consome, o Aseptic constrói
o pacote e liga-o no node_modules do consumidor, que é onde o Node o resolve a
sério, e pode reconstruí-lo e voltar a ligá-lo à medida que guardas. Não edita o
package.json do consumidor, e desligar desfaz só o que pôs. O mesmo mecanismo
cobre Maven, Gradle e Python para as equipas cujos sistemas não são todos JavaScript.
O que não faz
Não substitui os teus scripts, nem o teu bundler, nem o teu runner de testes: chama-os. Não executa um cluster de Kubernetes, por isso tudo o que precises de verificar a esse nível é de outra ferramenta. Precisa de Docker instalado para a infraestrutura comum.
Está em beta pública, publica-se para Windows, macOS e Linux, e é grátis para uso pessoal.
Ao lado das alternativas
Se os teus serviços já são imagens e os implantas com manifestos que manténs, o Tilt ou o Skaffold mantêm o ciclo local com a forma de produção, ao preço de uma build a cada mudança. A página de alternativas ao Docker Compose cobre o campo inteiro.
Há equivalentes desta página para Spring Boot e para Quarkus.
Perguntas frequentes
Porque deixam de servir os scripts do npm com vários serviços?
Porque não escalam ao quarto: há que abrir um terminal por serviço, lembrar-se da ordem de arranque, e os URLs entre eles acabam em variáveis de ambiente copiadas à mão em cada máquina.
Preciso de imagens Docker dos meus serviços Node?
Não. O Aseptic arranca-os como processos com o seu próprio comando; o Docker usa-se para a infraestrutura comum.
Como ligo um pacote local sem o publicar no npm?
O Aseptic constrói-o e liga-o no node_modules de quem o consome, e pode reconstruir e voltar a ligar ao vivo quando muda. É reversível: desligar desfaz só o que pôs.