Questo documento è il terzo di una serie di quattro parti sulla progettazione, la creazione e il deployment di microservizi. Questa serie descrive i vari elementi dell'architettura dei microservizi. La serie include informazioni sui vantaggi e sugli svantaggi del pattern dell'architettura dei microservizi e su come applicarlo.
- Introduzione ai microservizi
- Refactoring di un monolite in microservizi
- Comunicazione tra servizi in una configurazione di microservizi (questo documento)
- Tracciamento distribuito in un'applicazione di microservizi
Questa serie è destinata agli sviluppatori di applicazioni e agli architetti che progettano e implementano la migrazione per il refactoring di un'applicazione monolitica in un'applicazione di microservizi.
Questo documento descrive i compromessi tra la messaggistica asincrona e le API sincrone nei microservizi. Il documento illustra la decostruzione di un'applicazione monolitica e mostra come convertire una richiesta sincrona nell'applicazione originale in un flusso asincrono nella nuova configurazione basata su microservizi. Questa conversione include l'implementazione di transazioni distribuite tra i servizi.
Applicazione di esempio
In questo documento utilizzerai un'applicazione di e-commerce predefinita denominata Boutique online. L'applicazione implementa flussi e-commerce di base, come la navigazione degli articoli, l'aggiunta di prodotti a un carrello e il pagamento. L'applicazione offre anche consigli e annunci in base alla selezione degli utenti.
Separazione logica dei servizi
In questo documento, il servizio di pagamento viene isolato dal resto dell'applicazione. Tutti i flussi nell'applicazione originale Online Boutique sono sincroni. Nell'applicazione sottoposta a refactoring, il processo di pagamento viene convertito in un flusso asincrono. Pertanto, quando ricevi una richiesta di acquisto, anziché elaborarla immediatamente, fornisci all'utente una conferma di "richiesta ricevuta". In background, viene attivata una richiesta asincrona al servizio di pagamento per l'elaborazione del pagamento.
Prima di spostare i dati di pagamento e la logica in un nuovo servizio, devi isolare i dati e la logica di pagamento dal monolite. Isolando i dati e la logica di pagamento nel monolite, è più facile eseguire il refactoring del codice nello stesso codebase se i confini dei servizi di pagamento sono errati (logica di business o dati).
I componenti dell'applicazione monolitica in questo documento sono già modularizzati, quindi sono isolati l'uno dall'altro. Se la tua applicazione ha interdipendenze più strette, devi isolare la logica di business e creare classi e moduli separati. Devi inoltre disaccoppiare le dipendenze del database nelle proprie tabelle e creare classi di repository separate. Quando disaccoppi le dipendenze del database, possono esistere relazioni di chiave esterna tra le tabelle divise. Tuttavia, una volta disaccoppiato completamente il servizio dal monolite, queste dipendenze cessano di esistere e il servizio interagisce esclusivamente tramite i contratti API o RPC predefiniti.
Transazioni distribuite ed errori parziali
Dopo aver isolato il servizio e averlo suddiviso dal monolite, una transazione locale nel sistema monolitico originale viene distribuita tra più servizi. Nell'implementazione del monolite, la procedura di pagamento ha seguito la sequenza mostrata nel diagramma seguente.
Figura 1. Sequenza di una procedura di pagamento in un'implementazione monolitica.
Nella Figura 1, quando l'applicazione riceve un ordine di acquisto, il controller di pagamento chiama il servizio di pagamento e il servizio degli ordini per elaborare il pagamento e salvare l'ordine, rispettivamente. Se uno o più passaggi hanno esito negativo, è possibile eseguire il rollback della transazione del database. Considera uno scenario di esempio in cui la richiesta di ordine viene archiviata correttamente nella tabella degli ordini, ma il pagamento non va a buon fine. In questo scenario, viene eseguito il rollback dell'intera transazione e la voce viene rimossa dalla tabella degli ordini.
Dopo aver disaccoppiato il pagamento nel servizio dedicato, il flusso di pagamento modificato è simile al seguente diagramma:
Figura 2. Una sequenza della procedura di pagamento dopo che il pagamento è stato disaccoppiato nel proprio servizio.
Nella Figura 2, la transazione interessa più servizi e i relativi database, quindi è una transazione distribuita. Alla ricezione di una richiesta di ordine, il titolare del trattamento dei dati salva i dettagli dell'ordine nel proprio database locale e chiama altri servizi per completare l'ordine. Questi servizi, come il servizio di pagamento, possono utilizzare il proprio database locale per archiviare i dettagli dell'ordine.
Nell'applicazione monolitica, il sistema di database garantisce che le transazioni locali siano atomiche. Tuttavia, per impostazione predefinita, il sistema basato su microservizi con un database separato per ogni servizio non dispone di un coordinatore globale delle transazioni che copre i vari database. Poiché le transazioni non sono coordinate a livello centrale, un errore nell'elaborazione di un pagamento non esegue il rollback delle modifiche apportate al servizio degli ordini. Pertanto, il sistema è in uno stato incoerente.
I seguenti pattern vengono comunemente utilizzati per gestire le transazioni distribuite:
- Protocollo di commit a due fasi (2PC): parte di una famiglia di protocolli di consenso, 2PC coordina il commit di una transazione distribuita e mantiene le garanzie di atomicità, coerenza, isolamento, durabilità (ACID). Il protocollo è suddiviso nelle fasi di prepare e prepare. Una transazione viene confermata solo se tutti i partecipanti hanno votato a favore. Se i partecipanti non raggiungono un accordo, viene eseguito il rollback dell'intera transazione.
- Saga: il pattern Saga consiste nell'esecuzione di transazioni locali all'interno di ogni microservizio che costituisce la transazione distribuita. Un evento viene attivato al termine di ogni operazione riuscita o non riuscita. Tutti i microservizi coinvolti nella transazione distribuita sono abbonati a questi eventi. Se i seguenti microservizi ricevono un evento di successo, eseguono la loro operazione. In caso di errore, i microservizi precedenti completano le azioni di compensazione per annullare le modifiche. Saga fornisce una visione coerente del sistema garantendo che, al completamento di tutti i passaggi, tutte le operazioni abbiano esito positivo o che compensi le azioni annullino tutto il lavoro.
Consigliamo Saga per le transazioni di lunga durata. In un'applicazione basata su microservizi, prevedi chiamate e comunicazioni tra servizi con sistemi di terze parti. Pertanto, è meglio progettare per la coerenza finale: riprova per errori recuperabili ed espone eventi compensatori che alla fine modificano gli errori non recuperabili.
Esistono vari modi per implementare Saga, ad esempio puoi utilizzare motori di flusso di lavoro e attività come Apache Airflow, Apache Camel o Conductor. Puoi anche scrivere gestori di eventi personalizzati utilizzando sistemi basati su Kafka, RabbitMQ o ActiveMQ.
L'applicazione Online Boutique utilizza il servizio di pagamento per orchestrare i servizi di pagamento, spedizione e notifica via email. Il servizio di pagamento gestisce anche il flusso di lavoro dell'attività e degli ordini. In alternativa alla creazione di un motore di flusso di lavoro personalizzato, puoi utilizzare componenti di terze parti come Zeebe. Zeebe fornisce un creatore di modelli basato sull'interfaccia utente. Ti consigliamo di valutare attentamente le scelte per l'orchestratore di microservizi in base ai requisiti della tua applicazione. Questa scelta è una parte fondamentale dell'esecuzione e della scalabilità dei microservizi.
Applicazione sottoposta a refactoring
Per abilitare le transazioni distribuite nell'applicazione di cui è stato eseguito il refactoring, il servizio di pagamento gestisce la comunicazione tra il servizio di pagamento, spedizione ed email. Il flusso di lavoro BPMN (Business Process Model and Notation) generico utilizza il seguente flusso:
Figura 3. Un flusso di lavoro degli ordini che aiuta a garantire transazioni distribuite in microservizi tipici.
Il diagramma precedente mostra il seguente flusso di lavoro:
- Il servizio di frontend riceve una richiesta di ordine e poi effettua le seguenti operazioni:
- Invia gli articoli dell'ordine al servizio carrello. Il servizio del carrello salva quindi i dettagli dell'ordine (Redis).
- Reindirizza alla pagina di pagamento. Il servizio di pagamento recupera gli ordini dal servizio carrello, imposta lo stato dell'ordine su
Pending
e chiede al cliente il pagamento. - Conferma che l'utente ha pagato. Una volta confermato, il servizio di pagamento comunica al servizio email di generare un'email di conferma e inviarla al cliente.
- Il servizio di pagamento elabora successivamente la richiesta.
- Se la richiesta di pagamento va a buon fine, il servizio di pagamento aggiorna lo stato dell'ordine impostandolo su
Complete
. - Se la richiesta di pagamento non va a buon fine, il servizio di pagamento avvia una transazione compensativa.
- La richiesta di pagamento è stata annullata.
- Il servizio di pagamento modifica lo stato dell'ordine in
Failed
.
- Se il servizio di pagamento non è disponibile, la richiesta scade dopo N secondi e il servizio di pagamento avvia una transazione compensativa.
- Il servizio di pagamento modifica lo stato dell'ordine in
Failed
.
- Se la richiesta di pagamento va a buon fine, il servizio di pagamento aggiorna lo stato dell'ordine impostandolo su
Obiettivi
- Esegui il deployment dell'applicazione monolitica Online Boutique su Google Kubernetes Engine (GKE).
- Convalida il flusso di pagamento monolitico.
- Esegui il deployment della versione con microservizi dell'applicazione monolitica sottoposta a refactoring
- Verifica che il nuovo flusso di pagamento funzioni.
- Verifica che le transazioni distribuite e le azioni di compensazione funzionino in caso di errore.
Costi
In questo documento, utilizzi i seguenti componenti fatturabili di Google Cloud:
Per generare una stima dei costi in base all'utilizzo previsto, utilizza il Calcolatore prezzi.
Una volta completato questo documento, puoi evitare di continuare la fatturazione eliminando le risorse che hai creato. Per ulteriori informazioni, consulta la sezione Pulizia.
Prima di iniziare
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.
-
Nella console Google Cloud, attiva Cloud Shell.
Nella parte inferiore della console Google Cloud viene avviata una sessione di Cloud Shell che mostra un prompt della riga di comando. Cloud Shell è un ambiente shell con Google Cloud CLI già installato e con valori già impostati per il progetto attuale. L'inizializzazione della sessione può richiedere alcuni secondi.
Abilita le API per Compute Engine, Google Kubernetes Engine, Cloud SQL, Artifact Analysis e Container Registry:
gcloud services enable \ compute.googleapis.com \ sql-component.googleapis.com \ servicenetworking.googleapis.com\ container.googleapis.com \ containeranalysis.googleapis.com \ containerregistry.googleapis.com \ sqladmin.googleapis.com
Esporta le seguenti variabili di ambiente:
export PROJECT=$(gcloud config get-value project) export CLUSTER=$PROJECT-gke export REGION="us-central1"
Deployment del monolite di e-commerce
In questa sezione eseguirai il deployment dell'applicazione monolitica Online Boutique in un cluster GKE. L'applicazione utilizza Cloud SQL come database relazionale. Il seguente diagramma illustra l'architettura delle applicazioni monolitiche:
Figura 4. Un client si connette all'applicazione in un cluster GKE e l'applicazione si connette a un database Cloud SQL.
Per eseguire il deployment dell'applicazione, completa questi passaggi:
Clona il repository GitHub:
git clone https://github.com/GoogleCloudPlatform/monolith-to-microservices-example
Sostituisci il segnaposto
PROJECT_ID
nel file manifest delle variabili Terraform:cd monolith-to-microservices-example/setup && \ sed -i -e "s/\[PROJECT_ID\]/$PROJECT/g" terraform.tfvars
Esegui gli script Terraform per completare la configurazione dell'infrastruttura ed eseguire il deployment dell'infrastruttura. Per saperne di più su Terraform, consulta Introduzione a Terraform su Google Cloud:
terraform init && terraform apply -auto-approve
Lo script Terraform crea quanto segue:
- Una rete VPC denominata
PROJECT_ID-vpc
- Cluster GKE denominato
PROJECT_ID-gke
- Un'istanza Cloud SQL denominata
PROJECT_ID-mysql
- Un database denominato
ecommerce
utilizzato dall'applicazione - Un utente
root
con password impostata supassword
- Un database denominato
Puoi modificare lo script Terraform per generare automaticamente una password. Questa configurazione utilizza un esempio semplificato che non dovresti utilizzare in produzione.
Il provisioning dell'infrastruttura può richiedere fino a 10 minuti. Una volta eseguito correttamente lo script, l'output sarà simile al seguente:
... Apply complete! Resources: 8 added, 0 changed, 0 destroyed. Outputs: kubernetes_cluster_name = PROJECT_ID-gke sql_database_name = PROJECT_ID-mysql vpc_name = PROJECT_ID-vpc
- Una rete VPC denominata
Connettiti al cluster e crea uno spazio dei nomi denominato
monolith
. Esegui il deployment dell'applicazione nel proprio spazio dei nomi nel cluster GKE:gcloud container clusters get-credentials $CLUSTER \ --region $REGION \ --project $PROJECT && \ kubectl create ns monolith
L'applicazione in esecuzione su GKE utilizza i secret di Kubernetes per accedere al database Cloud SQL. Crea un secret che utilizza le credenziali utente per il database:
kubectl create secret generic dbsecret \ --from-literal=username=root \ --from-literal=password=password -n monolith
Crea l'immagine del monolite e caricala in Container Registry:
cd ~/monolith gcloud builds submit --tag gcr.io/$PROJECT_ID/ecomm
Aggiorna il riferimento nel file
deploy.yaml
all'immagine Docker appena creata:cd ~/monolith sed -i -e "s/\[PROJECT_ID\]/$PROJECT/g" deploy.yaml
Sostituisci i segnaposto nei file manifest di deployment ed esegui il deployment dell'applicazione:
cd .. && \ DB_IP=$(gcloud sql instances describe $PROJECT-mysql | grep "ipAddress:" | tail -1 | awk -F ":" '{print $NF}') sed -i -e "s/\[DB_IP\]/$DB_IP/g" monolith/deploy.yaml kubectl apply -f monolith/deploy.yaml
Controlla lo stato del deployment:
kubectl rollout status deployment/ecomm -n monolith
L'output è simile al seguente.
Waiting for deployment "ecomm" rollout to finish: 0 of 1 updated replicas are available... deployment "ecomm" successfully rolled out
Recupera l'indirizzo IP dell'applicazione di cui è stato eseguito il deployment:
kubectl get svc ecomm -n monolith \ -o jsonpath="{.status.loadBalancer.ingress[*].ip}" -w
Attendi che l'indirizzo IP del bilanciatore del carico venga pubblicato. Per uscire dal comando, premi
Ctrl+C
. Prendi nota dell'indirizzo IP del bilanciatore del carico, quindi accedi all'applicazione all'URLhttp://IP_ADDRESS
. Potrebbe essere necessario un po' di tempo prima che il bilanciatore del carico sia in stato integro e inizi a trasmettere il traffico.
Convalida il flusso di pagamento del monolite
In questa sezione creerai un ordine di prova per convalidare il flusso di pagamento.
- Vai all'URL che hai annotato nella sezione precedente,
http://IP_ADDRESS
. - Nella home page dell'applicazione visualizzata, seleziona un prodotto qualsiasi, quindi fai clic su Aggiungi al carrello.
- Per creare un acquisto di prova, fai clic su Effettua l'ordine:
- Se il pagamento va a buon fine, viene visualizzata la finestra di conferma dell'ordine, con l'ID di conferma dell'ordine.
Per visualizzare i dettagli dell'ordine, collegati al database:
gcloud sql connect $PROJECT-mysql --user=root
Puoi anche utilizzare qualsiasi altro metodo supportato per connetterti al database. Quando richiesto, inserisci la password come
password
.Per visualizzare i dettagli dell'ordine salvato, esegui questo comando:
select cart_id from ecommerce.cart;
L'output sarà simile al seguente:
+--------------------------------------+ | cart_id | +--------------------------------------+ | 7cb9ab11-d268-477f-bf4d-4913d64c5b27 | +--------------------------------------+
Deployment dell'applicazione di e-commerce basata su microservizi
In questa sezione eseguirai il deployment dell'applicazione di cui è stato eseguito il refactoring. Questo documento si concentra solo sul disaccoppiamento dei servizi di frontend e pagamento. Il prossimo documento di questa serie, Tracciamento distribuito in un'applicazione di microservizi, descrive altri servizi, come i servizi per suggerimenti e annunci, che puoi disaccoppiare dal monolite. Il servizio di pagamento gestisce le transazioni distribuite tra il frontend e i servizi di pagamento e viene eseguito come servizio Kubernetes nel cluster GKE, come mostrato nel diagramma seguente:
Figura 5. Il servizio di pagamento orchestra le transazioni tra il carrello, il pagamento e l'email.
Esegui il deployment dei microservizi
In questa sezione utilizzerai l'infrastruttura di cui hai eseguito il provisioning in precedenza per eseguire il deployment di microservizi nel loro spazio dei nomi microservice
:
Assicurati di soddisfare i seguenti requisiti:
- Progetto Google Cloud
- Ambiente Shell con
gcloud
,git
ekubectl
In Cloud Shell, clona il repository di microservizi:
git clone https://github.com/GoogleCloudPlatform/microservices-demo cd microservices-demo/
Imposta il progetto e la regione Google Cloud e assicurati che l'API GKE sia abilitata:
export PROJECT_ID=PROJECT_ID export REGION=us-central1 gcloud services enable container.googleapis.com \ --project=${PROJECT_ID}
Sostituisci
con l'ID del tuo progetto Google Cloud. Crea un cluster GKE e recupera le credenziali:
gcloud container clusters create-auto online-boutique \ --project=${PROJECT_ID} --region=${REGION}
La creazione del cluster potrebbe richiedere alcuni minuti.
Esegui il deployment dei microservizi nel cluster:
kubectl apply -f ./release/kubernetes-manifests.yaml
Attendi che i pod siano pronti:
kubectl get pods
Dopo qualche minuto, vedi i pod nello stato
Running
.Accedi al frontend web in un browser utilizzando l'indirizzo IP esterno del frontend:
kubectl get service frontend-external | awk '{print $4}'
Visita
http://EXTERNAL_IP
in un browser web per accedere alla tua istanza di Boutique online.
Convalidare il nuovo flusso di pagamento
- Per verificare il flusso della procedura di pagamento, seleziona un prodotto ed effettua un ordine, come descritto nella sezione precedente Convalidare il flusso di pagamento del monolite.
- Quando completi il pagamento dell'ordine, la finestra di conferma non mostra un ID di conferma. ma la finestra di conferma ti invita a controllare l'email per i dettagli della conferma.
Per verificare che l'ordine sia stato ricevuto, che il servizio di pagamento abbia elaborato il pagamento e che i dettagli dell'ordine siano stati aggiornati, esegui questo comando:
kubectl logs -f deploy/checkoutservice --tail=100
L'output sarà simile al seguente:
[...] {"message":"[PlaceOrder] user_id=\"98828e7a-b2b3-47ce-a663-c2b1019774a3\" user_currency=\"CAD\"","severity":"info","timestamp":"2023-08-10T04:19:20.498893921Z"} {"message":"payment went through (transaction_id: f0b4a592-026f-4b4a-9892-ce86d2711aed)","severity":"info","timestamp":"2023-08-10T04:19:20.528338189Z"} {"message":"order confirmation email sent to \"someone@example.com\"","severity":"info","timestamp":"2023-08-10T04:19:20.540275988Z"}
Per uscire dai log, premi
Ctrl+C
.Verifica che il pagamento sia andato a buon fine:
kubectl logs -f deploy/paymentservice -n --tail=100
L'output sarà simile al seguente:
[...] {"severity":"info","time":1691641282208,"pid":1,"hostname":"paymentservice-65cc7795f6-r5m8r","name":"paymentservice-charge","message":"Transaction processed: visa ending 0454 Amount: CAD119.30128260"} {"severity":"info","time":1691641300051,"pid":1,"hostname":"paymentservice-65cc7795f6-r5m8r","name":"paymentservice-server","message":"PaymentService#Charge invoked with request {\"amount\":{\"currency_code\":\"USD\",\"units\":\"137\",\"nanos\":850000000},\"credit_card\":{\"credit_card_number\":\"4432-8015-6152-0454\",\"credit_card_cvv\":672,\"credit_card_expiration_year\":2039,\"credit_card_expiration_month\":1}}"}
Per uscire dai log, premi
Ctrl+C
.Verifica che l'email di conferma dell'ordine sia stata inviata:
kubectl logs -f deploy/emailservice -n --tail=100
L'output sarà simile al seguente:
[...] {"timestamp": 1691642217.5026057, "severity": "INFO", "name": "emailservice-server", "message": "A request to send order confirmation email to kalani@examplepetstore.com has been received."}
I messaggi di log per ciascun microservizio indicano che la transazione distribuita nei servizi di pagamento, email e pagamento è stata completata correttamente.
Convalida l'azione di risarcimento in una transazione distribuita
Questa sezione simula uno scenario in cui un cliente sta effettuando un ordine e il servizio di pagamento non è disponibile.
Per simulare l'indisponibilità del servizio, elimina il deployment e il servizio dei pagamenti:
kubectl delete deploy paymentservice && \ kubectl delete svc paymentservice
Accedi di nuovo all'applicazione e completa il flusso di pagamento. In questo esempio, se il servizio di pagamento non risponde, la richiesta scade e viene attivata un'azione di compensazione.
Nel frontend dell'interfaccia utente, fai clic sul pulsante Effettua ordine. L'output è simile al seguente:
HTTP Status: 500 Internal Server Error rpc error: code = Internal desc = failed to charge card: could not charge the card: rpc error: code = Unavailable desc = connection error: desc = "transport: Error while dialing: dial tcp: lookup paymentservice on 34.118.224.10:53: no such host" failed to complete the order main.(*frontendServer).placeOrderHandler /src/handlers.go:360
Esamina i log del servizio frontend:
kubectl logs -f deploy/frontend --tail=100
L'output è simile al seguente:
[...] {"error":"failed to complete the order: rpc error: code = Internal desc = failed to charge card: could not charge the card: rpc error: code = Unavailable desc = connection error: desc = \"transport: Error while dialing: dial tcp: lookup paymentservice on 34.118.224.10:53: no such host\"","http.req.id":"0a4cb058-ee9b-470a-9bb1-3a965636022e","http.req.method":"POST","http.req.path":"/cart/checkout","message":"request error","session":"96c94881-a435-4490-9801-c788dc400cc1","severity":"error","timestamp":"2023-08-11T18:25:47.127294259Z"}
Esamina i log del servizio di pagamento:
kubectl logs -f deploy/frontend --tail=100
L'output è simile al seguente:
[...] {"message":"[PlaceOrder] user_id=\"96c94881-a435-4490-9801-c788dc400cc1\" user_currency=\"USD\"","severity":"info","timestamp":"2023-08-11T18:25:46.947901041Z"} {"message":"[PlaceOrder] user_id=\"96c94881-a435-4490-9801-c788dc400cc1\" user_currency=\"USD\"","severity":"info","timestamp":"2023-08-11T19:54:21.796343643Z"}
Tieni presente che non è prevista alcuna chiamata al servizio email per l'invio della notifica. Non esiste un log delle transazioni, come
payment went through (transaction_id: 06f0083f-fa47-4d91-8258-6d61edfab1ca)
Esamina i log del servizio email:
kubectl logs -f deploy/emailservice --tail=100
Tieni presente che non sono state create voci di log per la transazione non riuscita sul servizio email.
Come agente di orchestrazione, se una chiamata di servizio non va a buon fine, il servizio di pagamento restituisce uno stato di errore e chiude la procedura di pagamento.
Esegui la pulizia
Per evitare che al tuo Account Google Cloud vengano addebitati costi relativi alle risorse utilizzate in questo tutorial, elimina il progetto che contiene le risorse oppure mantieni il progetto ed elimina le singole risorse.
Se prevedi di completare i passaggi nel prossimo documento di questa serie, Tracciamento distribuito in un'applicazione di microservizi, puoi riutilizzare il progetto e le risorse anziché eliminarli.
Elimina il progetto
- Nella console Google Cloud, vai alla pagina Gestisci risorse.
- Nell'elenco dei progetti, seleziona il progetto che vuoi eliminare, quindi fai clic su Elimina.
- Nella finestra di dialogo, digita l'ID del progetto e fai clic su Chiudi per eliminare il progetto.
Elimina le risorse
Se vuoi conservare il progetto Google Cloud che hai utilizzato in questo documento, elimina le singole risorse.
In Cloud Shell, esegui questo comando:
cd setup && terraform destroy -auto-approve
Per eliminare il cluster di microservizi utilizzando Google Cloud CLI, esegui questo comando:
gcloud container clusters delete online-boutique \ --location $REGION
Passaggi successivi
- Scopri di più sull'architettura dei microservizi.
- Leggi il primo documento di questa serie per scoprire di più su microservizi, relativi vantaggi, sfide e casi d'uso.
- Leggi il secondo documento di questa serie per saperne di più sulle strategie di refactoring delle applicazioni per scomporre i microservizi.
- Leggi il documento finale di questa serie per scoprire di più sul tracciamento distribuito delle richieste tra microservizi.