La crescita del cloud computing, le pratiche di distribuzione continua, l’approccio alla gestione della complessità del software basato su DDD (Domain-Driven Design), l’organizzazione di aziende in team di sviluppo agili e autonomi sono il contesto in cui il modello di architettura dei microservizi è emerso fortemente.
I microservizi sono un approccio architetturale alla creazione di applicazioni. Ciò che distingue l’architettura basata su microservizi dagli approcci monolitici tradizionali è la divisione dell’applicazione nelle sue funzioni di base. Ogni funzione, chiamata servizio, può essere compilata e implementata in modo indipendente. Pertanto, i singoli servizi possono funzionare, o meno, senza compromettere gli altri.
Un microservizio è quindi una funzione di base di un’applicazione, che viene eseguita in modo indipendente dagli altri servizi.
In parole in breve, i microservizi sono servizi “piccoli” e autonomi che interagiscono tra loro e che hanno l’obiettivo di fare qualcosa e farlo bene; sono sistemi realmente distribuiti.
Ogni microservizio è un’entità separata che viene in genere pubblicata su una piattaforma PaaS o eseguita da un processo di sistema dedicato.
La comunicazione tra i servizi viene eseguita attraverso la rete al fine di garantire l’indipendenza tra i servizi ed evitare qualsiasi forma di sovrapposizione.
Ogni microservizio viene proposto all’esterno come una scatola nera, infatti espone solo un’API (Application Programming Interface), astraendo i dettagli di come vengono implementate le funzionalità e il linguaggio o la tecnologia specifica utilizzata.
I microservizi possono comunicare tra loro, in genere in modalità state-less, consentendo la creazione di applicazioni con una maggiore tolleranza di errore e meno dipendenti da un singolo ESB (Enterprise Service Bus). Inoltre, comunicano tramite API (Application Programming Interface) indipendenti dal linguaggio e ciò consente ai team di sviluppo di scegliere i propri strumenti.
Oggi, i contenitori Linux consentono di eseguire più parti di un’applicazione in modo indipendente, sullo stesso hardware, con un controllo molto maggiore sui singoli componenti e sui cicli di vita. In combinazione con le API, i microservizi containerizzati sono alla base delle applicazioni native cloud.
Grazie alle API indipendenti dal linguaggio, gli sviluppatori sono liberi di scegliere il linguaggio e la tecnologia ottimali per la funzione da creare.
Spesso, la principale barriera all’adozione di nuove tecnologie sta nel rischio associato all’utilizzo di qualcosa di nuovo e con il quale si ha poca esperienza. Confinando questo rischio a una piccola parte di un sistema software, che può essere riscritto in un tempo relativamente breve, il rischio è molto limitato e quindi è una sfida che deve essere accettata.
L’utilizzo di linguaggi e tecnologie diversi e dedicati consente di utilizzare gli stack con le migliori prestazioni per implementare funzioni specifiche.
Poiché un’applicazione di grandi dimensioni è suddivisa in moduli più piccoli, è molto più semplice per gli sviluppatori comprendere, aggiornare e migliorare questi componenti e ciò consente cicli di sviluppo più rapidi, soprattutto in combinazione con i metodi di sviluppo Agile.
In quanto consente di abbreviare i cicli di sviluppo, un’architettura basata su microservizi supporta distribuzioni e aggiornamenti più agili.
In generale, nell’architettura dei microservizi, ogni singolo servizio di prodotto è indipendente dagli altri, di conseguenza può raggiungere l’ambiente di produzione/test indipendentemente dagli altri che attualmente lavorano nello stesso ambiente, senza che questa attività abbia effetti dirompenti sul resto del sistema. Avere un processo di distribuzione snello e veloce consente di aggiungere o modificare le caratteristiche di un sistema software in modo efficace ed efficiente, rispondendo alle esigenze dinamiche del mercato e agli utenti che sono sempre più attenti alle loro esigenze.
Ogni servizio, se compilato correttamente, è indipendente e non influisce sugli altri servizi nell’infrastruttura. Di conseguenza, qualsiasi errore del componente non comporta il blocco dell’intera app, come nel caso del modello monolitico standard.
In molti casi è possibile isolare il problema e lavorare su di esso mentre il resto del sistema continua a funzionare, generando così un disagio minimo verso gli utenti finali.
I microservizi possono essere distribuiti su più server e infrastrutture, in base alle mutevoli esigenze aziendali.
Il modello di microservizio consente il provisioning delle parti che costituiscono l’applicazione in modo dinamico e intelligente.
Utilizzando l’approccio microservizi ogni singolo servizio può raggiungere l’ambiente di produzione in modo indipendente, quindi in caso di problema è facilmente isolato e le azioni di rollback o risoluzione più veloci possono essere eseguite.
Attraverso l’architettura dei microservizi è possibile riutilizzare le funzionalità già sviluppate e testate in precedenza.
È possibile che lo stesso servizio venga utilizzato in modi diversi e per scopi diversi. Si consideri, ad esempio, un sistema software che deve essere in grado di dialogare non solo con il mondo web, ma anche con applicazioni mobili, dispositivi indossabili e così via.
Quando un sistema software è organizzato in microservizi, il costo della sostituzione di un servizio con un altro più efficiente non è più un problema, così come il costo della rimozione di un servizio inutile viene ridotto.