Node: avviare più servizi in locale
Node rende facili i primi due servizi: npm start due volte e stai lavorando. Il
guaio arriva con il quarto terminale, con il secondo servizio che vuole anche lui la porta 3000
e con il pacchetto che stai modificando insieme al servizio che lo usa.
Cosa si rompe per primo
- I terminali. Uno per servizio, ciascuno con il suo ambiente, e senza memoria di quale combinazione funzionava ieri.
- Le porte. Tutto porta 3000 di default. Finisci con un
.envper sviluppatore che non viene mai committato e mai documentato. - Gli URL fra i servizi. Ogni
fetchverso un altro servizio legge una variabile, e puntarne tre all'ambiente condiviso significa modificare file che non devi committare. - Il pacchetto locale.
npm linkfunziona finché smette di funzionare: dipendenze duplicate, una copia hoisted che vince e una risoluzione che si comporta diversamente da quella pubblicata. - Nessuno aspetta nessuno. Il tuo servizio parte, chiama quello che non ha ancora finito di alzarsi, e l'errore sembra un bug del tuo codice.
Cosa fa Aseptic
Aseptic rileva un servizio Node —o un front Angular— dal suo package.json, lo avvia
come processo nativo con il tuo script e gli passa la configurazione come variabili d'ambiente
all'avvio. Gli URL fra i servizi vengono riscritti lì, quindi nessun .env del tuo
repository deve cambiare e non c'è nulla da ricordarsi di annullare.
Uno scenario è l'insieme dei servizi di un flusso, avviati in ordine di dipendenza e aspettando la salute, non il processo. Le porte che collidono vengono rimappate e il valore rimappato è quello che ricevono i chiamanti. Se il flusso ha bisogno di Kafka, Redis o PostgreSQL, Aseptic li avvia in Docker e li gestisce — i tuoi servizi restano fuori da Docker, a meno che tu non li voglia in container.
Ogni dipendenza si risolve dove scegli tu: un servizio locale che hai aperto, l'ambiente condiviso nel cloud o un mock. Per dipendenza, e modificabile a metà pomeriggio.
Pacchetti locali, senza le sorprese di npm link
Se stai modificando insieme un tuo pacchetto e il servizio che lo usa, Aseptic costruisce il
pacchetto e lo collega nel node_modules del consumatore, che è dove Node lo risolve
davvero, e può ricostruirlo e ricollegarlo mentre salvi. Non modifica il
package.json del consumatore, e scollegare disfa solo ciò che ha messo. Lo stesso
meccanismo copre Maven, Gradle e Python per i team i cui sistemi non sono tutti JavaScript.
Cosa non fa
Non sostituisce i tuoi script, né il tuo bundler, né il tuo runner di test: li chiama. Non esegue un cluster Kubernetes, quindi tutto ciò che devi verificare a quel livello è di competenza di un altro strumento. Ha bisogno di Docker per l'infrastruttura comune.
È in beta pubblica, esce per Windows, macOS e Linux, ed è gratis per uso personale.
Accanto alle alternative
Se i tuoi servizi sono già immagini e li distribuisci con manifest che mantieni, Tilt o Skaffold tengono il ciclo locale nella forma della produzione, al prezzo di una build a ogni modifica. La pagina delle alternative a Docker Compose copre l'intero campo.
Ci sono equivalenti di questa pagina per Spring Boot e per Quarkus.
Domande frequenti
Perché gli script npm smettono di bastare con più servizi?
Perché non reggono al quarto: un terminale per servizio, l'ordine di avvio da ricordare, e gli URL fra loro finiscono in variabili d'ambiente copiate a mano su ogni macchina.
Mi servono immagini Docker dei miei servizi Node?
No. Aseptic li avvia come processi con il loro comando; Docker si usa per l'infrastruttura comune.
Come collego un pacchetto locale senza pubblicarlo su npm?
Aseptic lo costruisce e lo collega nel node_modules di chi lo usa, e può ricostruirlo e ricollegarlo al volo quando cambia. È reversibile: scollegare disfa solo ciò che aveva messo.