Cosa sono i microservizi?
Il cloud è alla base dello sviluppo delle applicazioni e della gestione dei sistemi IT odierni. Le applicazioni cloud moderne devono essere veloci, agili, altamente scalabili e affidabili.
L'uso dei contenitori consente di distribuire applicazioni che soddisfano tutti questi requisiti. Ma inserire un'applicazione in un contenitore senza seguire uno schema progettuale strategico è come salire su un veicolo e sperare di trovare la strada per raggiungere un'altra città senza usare una mappa o il GPS. Raggiungeresti comunque la destinazione, ma probabilmente non sarà il percorso più breve e veloce.
In questo scenario è utile un'architettura di microservizi. I microservizi offrono un approccio allo sviluppo e alla distribuzione del software perfettamente adatto ai requisiti di agilità, scalabilità e affidabilità delle applicazioni cloud moderne.
Che cos'è un'architettura di microservizi?
In un'architettura di microservizi, un'applicazione di grandi dimensioni viene suddivisa in un set di servizi più piccoli. Ogni servizio viene eseguito in un proprio processo e comunica con altri processi usando protocolli come HTTP/HTTPS, WebSocket o Advanced Message Queuing Protocol (AMQP). Ogni microservizio implementa un dominio o una funzionalità aziendale specifica, end-to-end, all'interno di un determinato limite di contesto. Ogni microservizio deve essere sviluppato autonomamente e deve essere distribuibile in modo indipendente. Infine, ogni microservizio deve possedere il proprio modello di dati di dominio e la logica di dominio. I microservizi possono essere basati su diverse tecnologie di archiviazione dei dati (SQL, NoSQL) e su diversi linguaggi di programmazione.
Ecco alcune caratteristiche chiave dei microservizi:
- Sono piccoli, indipendenti e ad accoppiamento libero.
- Ogni microservizio ha una codebase separata che un piccolo team di sviluppo può gestire.
- Vengono distribuiti in modo indipendente. Un team può aggiornare un microservizio esistente senza ricompilare e ridistribuire l'intera applicazione.
- Mantengono i loro dati o lo stato esterno nei rispettivi database. A differenza di un'architettura monolitica, i microservizi non condividono i database.
- Comunicano tra loro usando API ben definite. I dettagli di implementazione interna di ogni servizio sono nascosti da altri servizi.
- Supportano la programmazionepoliglotta. Ad esempio, i microservizi che costituiscono un'applicazione Web non devono necessariamente condividere lo stesso stack di tecnologie, librerie o framework.
Perché sviluppare utilizzando un'architettura di microservizi?
I microservizi incapsulano in genere le funzionalità più semplici dei requisiti dei clienti, che è possibile aumentare o ridurre. È possibile testarli, distribuirli e gestirli in modo indipendente. Un vantaggio importante dell'approccio basato su microservizi consiste nel fatto che i team sono influenzati più dagli scenari del cliente che dall'utilizzo di una tecnologia specifica. Ogni piccolo team di sviluppo sviluppa un microservizio basato su uno scenario del cliente. Il team sceglie le tecnologie da usare.
I microservizi offrono flessibilità a lungo termine. I microservizi supportano la gestibilità in sistemi complessi, grandi e altamente scalabili, consentendo di creare applicazioni basate su molti servizi distribuibili in modo indipendente, ciascuno con cicli di vita granulari e autonomi.
Un'altro vantaggio dei microservizi, è la possibilità di aumentarne le prestazioni in modo indipendente. Invece di avere una singola applicazione monolitica da aumentare come unità, è possibile aumentare microservizi specifici. È possibile ridimensionare solo l'area funzionale che necessita di maggiore potenza di elaborazione o larghezza di banda di rete per supportare la domanda, anziché scalare altre aree dell'applicazione che non richiedono di essere ridimensionate. Ne consegue quindi una riduzione dei componenti hardware necessari e, pertanto, un considerevole risparmio economico.
L'approccio basato su microservizi consente modifiche agili e un'iterazione rapida di ogni microservizio, poiché è possibile modificare piccole aree specifiche di applicazioni complesse, di grandi dimensioni e scalabili.
La progettazione di applicazioni basate su microservizi con granularità fine consente processi di integrazione continua e recapito continuo. Accelera inoltre la distribuzione di nuove funzioni nell'applicazione. È possibile eseguire e testare i microservizi in isolamento e svilupparli in modo autonomo, mantenendo chiari i contratti tra i servizi. A condizione che non vengano apportate modifiche alle interfacce o ai contratti, è possibile modificare l'implementazione interna di qualsiasi microservizio o aggiungere nuove funzionalità senza interrompere gli altri microservizi.
Quale ruolo svolgono i contenitori?
La containerizzazione è un approccio allo sviluppo del software in cui un'applicazione o un servizio, le relative dipendenze e la corrispondente configurazione (astratti come file manifesto della distribuzione) sono inclusi in uno stesso pacchetto sotto forma di immagine del contenitore. È possibile testare l'applicazione in contenitori come unità e implementarla come istanza dell'immagine del contenitore al sistema operativo host.
I contenitori software fungono da unità standard di distribuzione software che possono contenere codice e dipendenze diversi. Ciò è simile al modo in cui i container trasportano merci di ogni tipo su navi, treni o camion. Gli sviluppatori e i professionisti IT possono usare il software in contenitori per distribuire il codice e le dipendenze in ambienti con poche o nessuna modifica.
Se sembra che l'uso di contenitori di un'applicazione possa essere un ottimo modo per implementare il modello di architettura di microservizi. I vantaggi dell'uso dei contenitori si allineano quasi esattamente con quelli dell'uso di un'architettura di microservizi.
Nota
L'uso di contenitori in un'applicazione non è l'unico modo per distribuire i microservizi. È possibile distribuire i microservizi come singoli servizi in Servizio app di Azure su macchine virtuali o in qualsiasi altro modo. I contenitori sono lo strumento di distribuzione che verrà usato per i microservizi nel resto del modulo.
Un altro vantaggio della containerizzazione consiste nella scalabilità. È possibile aumentare rapidamente creando nuovi contenitori da usare per attività a breve termine. Dal punto di vista dell'applicazione, la creazione di un'istanza di un'immagine (corrispondente alla creazione di un contenitore) è analoga alla creazione di un'istanza di un processo, come un servizio o un'app Web.
In breve, i contenitori offrono vantaggi in termini di isolamento, portabilità, flessibilità, scalabilità e controllo nel flusso di lavoro dell'intero ciclo di vita dell'applicazione.
I microservizi creati in questo modulo verranno eseguiti in un contenitore Docker, pubblicandoli con l'interfaccia della riga di comando .NET.
Pubblicazione del contenitore .NET SDK
In .NET 7, l'SDK di .NET ha ottenuto la capacità di creare immagini di contenitori tramite il comando dotnet publish
. Gli strumenti eseguono una serie di inferenze in base alle proprietà del progetto e ai relativi output. .NET crea quindi la stessa immagine creata da un Dockerfile. Possono essere necessari anche solo due comandi per creare una nuova applicazione e pubblicarla come immagine:
dotnet new webapi
dotnet publish --os linux --arch x64 /t:PublishContainer -c Release
I comandi dell'interfaccia della riga di comando .NET precedenti creano una nuova API Web e pubblicano l'app come contenitore:
- Puntare su Linux come sistema operativo (--os linux).
- Specificare un'architettura x64 (--arch x64).
- Uso della configurazione della versione (-c Release).
È possibile controllare molti aspetti del contenitore generato tramite le proprietà di MSBuild. In generale, se è possibile usare un comando in un Dockerfile per impostare una configurazione, è possibile eseguire la stessa operazione tramite MSBuild.
Perché creare microservizi in .NET?
A partire da .NET Core e fino alle attuali iterazioni, .NET è stato creato per essere prima di tutto nativo del cloud. Poiché è multipiattaforma, anche se l'immagine Docker è basata su una versione di Linux, il codice .NET continuerà a essere eseguito. Microsoft ha già creato immagini .NET per Docker. .NET è anche estremamente veloce. Il server Web ASP.NET Kestrel supera regolarmente gli altri server Web.
Docker
Docker è una piattaforma open source che può essere usata per automatizzare la distribuzione di applicazioni come contenitori portatili e autosufficienti che possono essere eseguiti nel cloud o in locale. Docker è anche l'azienda che promuove e fa evolvere questa tecnologia. L'organizzazione Docker lavora in collaborazione con fornitori di cloud, Linux e Windows, tra cui Microsoft.
I contenitori Docker possono essere eseguiti ovunque: in locale nel data center del cliente, in un provider di servizi esterno o nel cloud. I contenitori di immagini Docker possono essere eseguiti in modo nativo in Linux e Windows.
Che cos'è un'immagine?
Quando gli sviluppatori usano Docker, creano un'app o un servizio. Crea quindi il pacchetto dell'app o del servizio e delle relative dipendenze in un'immagine del contenitore. Un'immagine è una rappresentazione statica dell'app o del servizio, della relativa configurazione e delle dipendenze.
L'immagine, quando viene eseguita, diventa il contenitore. Il contenitore è l'istanza in memoria di un'immagine.
Un'immagine di contenitore non è modificabile. Dopo aver creato un'immagine, questa non può essere modificata. Poiché non è possibile modificare un'immagine, se è necessario apportare modifiche all'app o al servizio e alle relative dipendenze, creare una nuova immagine. Questa funzionalità garantisce che l'immagine usata nell'ambiente di produzione sia la stessa di quella usata per le attività di sviluppo e test.
Che cos'è un Dockerfile?
Un Dockerfile è un file di testo che contiene le istruzioni per creare un'immagine Docker. I Dockerfile vengono scritti in un linguaggio di scripting minimale, progettato per la creazione e la configurazione delle immagini. I Dockerfile documentano anche le operazioni necessarie per creare un'immagine, a partire da un'immagine di base.
Per creare un'immagine Docker che contenga l'applicazione, in genere si inizia identificando un'immagine di base. Si aggiungono quindi altri file e configurazioni all'immagine di base. Il processo di identificazione di un'immagine di base adatta inizia in genere con una ricerca in Docker Hub. Si cerca un'immagine che contenga già un framework applicazione e tutti gli strumenti e le utilità di una distribuzione Linux, come Ubuntu o Alpine. Ad esempio, se si dispone di un'applicazione ASP.NET da inserire in un pacchetto in un contenitore, Microsoft pubblica un'immagine denominata mcr.microsoft.com/dotnet/aspnet che contiene già il runtime di ASP.NET.
È possibile personalizzare un'immagine avviando un contenitore con un'immagine di base e quindi apportarvi modifiche. Le modifiche in genere comportano attività come la copia di file nel contenitore dal file system locale e l'esecuzione di vari strumenti e utilità per la compilazione di codice.
Un Dockerfile è un set di istruzioni che creano un'immagine Docker con l'esatto software necessario per l'esecuzione dell'applicazione, inclusa l'applicazione stessa.