Architettura dei microservizi su Google App Engine

Con microservizi si fa riferimento a uno stile architetturale per lo sviluppo di applicazioni. I microservizi consentono di scomporre le applicazioni di grandi dimensioni in parti indipendenti, ognuna delle quali avrà il proprio ambito di responsabilità. Per gestire una singola richiesta utente o API, un'applicazione basata su microservizi può chiamare molti microservizi interni per scrivere la sua risposta.

Un'applicazione basata su microservizi implementata in modo corretto può raggiungere i seguenti obiettivi:

  • Stabilire contratti solidi tra i vari microservizi.
  • Consentire cicli di deployment indipendenti, incluso il rollback.
  • Agevolare i test di release A/B in contemporanea nei sottosistemi.
  • Riduci al minimo l'overhead di automazione dei test e garanzia di qualità.
  • Aumentare la chiarezza del logging e del monitoraggio.
  • Fornire una contabilizzazione dei costi dettagliata.
  • Aumentare la scalabilità e l'affidabilità complessive dell'applicazione.

Google App Engine offre una serie di funzionalità adatte a un'applicazione basata su microservizi. Questa pagina illustra le best practice da utilizzare durante il deployment della tua applicazione come applicazione basata su microservizi in Google App Engine.

Servizi App Engine come microservizi

In un progetto App Engine, puoi eseguire il deployment di più microservizi come servizi separati, precedentemente noti come moduli in App Engine. Questi servizi hanno l'isolamento completo del codice. L'unico modo per eseguire il codice in questi servizi è tramite una chiamata HTTP, come una richiesta dell'utente o una chiamata API RESTful. Il codice in un servizio non può chiamare direttamente il codice in un altro. È possibile eseguire il deployment del codice nei servizi in modo indipendente e servizi diversi possono essere scritti in linguaggi diversi, come Python, Java, Go e PHP. Tutti i tipi di scalabilità automatica, bilanciamento del carico e istanze macchina sono gestiti in modo indipendente per i servizi.

Un progetto App Engine ottiene la separazione utilizzando i servizi.

Versioni all'interno dei servizi

Inoltre, in ogni servizio è possibile eseguire il deployment di più versions contemporaneamente. Per ogni servizio, una di queste è la versione di servizio predefinita, sebbene sia possibile accedere direttamente a qualsiasi versione di cui è stato eseguito il deployment di un servizio, poiché ogni versione di ciascun servizio ha un proprio indirizzo. Questa struttura offre una miriade di possibilità, tra cui il test del fumo di una nuova versione, i test A/B tra diverse versioni e operazioni semplificate di rollback e rollback. Il framework di App Engine fornisce meccanismi per supportare la maggior parte di questi elementi. Tratteremo questi meccanismi in maggiore dettaglio nelle prossime sezioni.

Un progetto App Engine può avere servizi e versioni.

Isolamento dei servizi

Sebbene per lo più isolati, i servizi condividono alcune risorse di App Engine. Ad esempio, Cloud Datastore, Memcache e le code di attività sono tutte risorse condivise tra i servizi in un progetto App Engine. Sebbene questa condivisione abbia alcuni vantaggi, è importante che un'applicazione basata su microservizi mantenga l'isolamento di codice e dati tra i microservizi. Alcuni modelli di architettura aiutano a mitigare la condivisione indesiderata. Descriveremo questi modelli più avanti in questo articolo.

I progetti App Engine condividono i servizi.

Isolamento dei progetti

Se non vuoi fare affidamento su questi pattern per raggiungere l'isolamento e vuoi un'applicazione più formale della separazione, puoi utilizzare più progetti App Engine. L'uso di progetti anziché servizi presenta pro e contro ed è necessario bilanciare i compromessi a seconda della situazione. A meno che tu non abbia un'esigenza specifica per uno dei vantaggi offerti dall'utilizzo di più progetti, ti consigliamo di iniziare con l'utilizzo di più servizi all'interno di un singolo progetto perché le prestazioni saranno migliori e l'overhead amministrativo sarà ridotto al minimo. Naturalmente, puoi anche scegliere un approccio ibrido dei due approcci.

Confronto tra isolamento di servizi e isolamento di progetti

La tabella seguente mette a confronto l'uso di più servizi e di più progetti in un'architettura di microservizi:

Più servizi Più progetti
Isolamento del codice Il codice di cui è stato eseguito il deployment è completamente indipendente tra servizi e versioni. Il codice di cui è stato eseguito il deployment è completamente indipendente tra i progetti e tra i servizi e le versioni di ogni progetto.
Isolamento dati Cloud Datastore e Memcache sono condivisi tra servizi e versioni, tuttavia è possibile utilizzare gli spazi dei nomi come pattern per sviluppatori per isolare i dati. Per l'isolamento delle code di attività, è possibile utilizzare una convenzione di sviluppo dei nomi di coda, ad esempio user-service-queue-1. Cloud Datastore, Memcache e le code di attività sono completamente indipendenti tra i progetti.
Isolamento dei log Ogni servizio (e versione) ha log indipendenti, anche se possono essere visualizzati insieme. Ogni progetto (insieme al servizio e alla versione di ogni progetto) dispone di log indipendenti, anche se tutti i log di un determinato progetto possono essere visualizzati insieme. I log di più progetti non possono essere visualizzati insieme.
Overhead delle prestazioni Il deployment dei servizi dello stesso progetto viene eseguito nello stesso data center, perciò la latenza quando si chiama un servizio da un altro tramite HTTP è molto bassa. Il deployment dei progetti potrebbe avvenire in data center diversi, quindi le latenze HTTP potrebbero essere superiori, anche se ancora piuttosto basse, perché la rete di Google è di altissimo livello.
Contabilità dei costi I costi per le ore istanza (la CPU e la memoria per l'esecuzione del codice) non sono separati per i servizi; tutte le ore istanza per un intero progetto sono raggruppate insieme. I costi di progetti diversi sono suddivisi in modo che sia molto facile vedere il costo dei vari microservizi.
Autorizzazioni operatore Un operatore ha la possibilità di eseguire il deployment del codice, eseguire il rollback e il rollback delle versioni e visualizzare i log per tutti i servizi di un progetto. Non è possibile limitare l'accesso a servizi specifici. L'accesso dell'operatore può essere controllato separatamente in progetti separati.
Tracciamento delle richieste Con Google Cloud Trace puoi visualizzare una richiesta e le richieste di microservizi risultanti per i servizi nello stesso progetto come un'unica traccia composta. Questa funzionalità può aiutare a semplificare l'ottimizzazione delle prestazioni. Le chiamate Cloud Trace possono essere visualizzate nei progetti Google Cloud se si trovano all'interno della stessa organizzazione.

Passaggi successivi