Il gcloud CLI fornisce un emulatore locale in memoria per sviluppare e testare le applicazioni. Poiché l'emulatore archivia i dati solo in memoria, perde tutto lo stato, inclusi dati, schema e configurazioni, al riavvio. L'emulatore offre le stesse API del servizio di produzione Spanner e serve per lo sviluppo e i test locali, non per i deployment di produzione.
L'emulatore supporta sia il dialetto GoogleSQL sia quello PostgreSQL. Supporta tutti i linguaggi delle librerie client. Puoi anche utilizzare l'emulatore con il Google Cloud CLI e le API REST.
L'emulatore è disponibile anche come progetto open source su GitHub.
Limitazioni e differenze
L'emulatore non supporta quanto segue:
- TLS/HTTPS, autenticazione, Identity and Access Management (IAM), autorizzazioni o ruoli.
- Nelle modalità di query
PLANoPROFILE, il piano di query restituito è vuoto. - L'
ANALYZEistruzione. L'emulatore la accetta, ma la ignora. - Uno qualsiasi degli strumenti di logging e monitoraggio di controllo.
- Protezione dall'eliminazione del database. L'emulatore accetta il campo
enable_drop_protection, ma consente l'eliminazione dei database anche se questa proprietà è abilitata.
L'emulatore differisce dal servizio di produzione Spanner anche nei seguenti modi:
- I messaggi di errore potrebbero essere diversi tra l'emulatore e il servizio di produzione.
- Le prestazioni e la scalabilità dell'emulatore non sono paragonabili a quelle del servizio di produzione.
- Le transazioni di lettura/scrittura e le modifiche allo schema bloccano l'intero database per l'accesso esclusivo fino al completamento.
- L'emulatore supporta DML partizionato e
partitionQuery, ma non verifica che le istruzioni siano partizionabili. Ciò significa che un'istruzione DML partizionata opartitionQuerypotrebbe essere eseguita nell'emulatore, ma non nel servizio di produzione con l'errore di istruzione non partizionabile.
Per un elenco completo delle API e delle funzionalità supportate, non supportate e parzialmente supportate, consulta il README file su GitHub.
Opzioni per l'esecuzione dell'emulatore
Esistono due modi comuni per eseguire l'emulatore:
Scegli il modo più adatto al flusso di lavoro di sviluppo e test dell'applicazione.
Eseguire l'emulatore utilizzando gcloud CLI
Per eseguire l'emulatore utilizzando Google Cloud CLI:
Installa il componente
cloud-spanner-emulator:gcloud components install cloud-spanner-emulatorSe gcloud CLI è già installato, esegui il seguente comando per assicurarti che tutti i suoi componenti siano aggiornati:
gcloud components updateAvvia l'emulatore:
gcloud emulators spanner startL'emulatore utilizza due endpoint locali:
localhost:9010per le richieste gRPClocalhost:9020per le richieste REST
Eseguire l'emulatore utilizzando Docker
Per eseguire l'emulatore utilizzando Docker:
Installa Docker sul tuo sistema e rendilo disponibile nel percorso di sistema.
Scarica l'immagine dell'emulatore più recente:
docker pull gcr.io/cloud-spanner-emulator/emulatorEsegui l'emulatore in Docker:
docker run -p 9010:9010 -p 9020:9020 gcr.io/cloud-spanner-emulator/emulatorQuesto comando esegue l'emulatore e mappa le porte nel container alle stesse porte dell'host locale. L'emulatore utilizza due endpoint locali:
localhost:9010per le richieste gRPC elocalhost:9020per le richieste REST.
Configurare gcloud CLI per utilizzare l'emulatore
Per utilizzare l'emulatore con gcloud CLI, disattiva l'autenticazione ed esegui l'override dell'endpoint. Crea una configurazione gcloud CLI separata per passare rapidamente dall'emulatore al servizio di produzione.
Crea e attiva una configurazione dell'emulatore:
gcloud config configurations create emulator gcloud config set auth/disable_credentials true gcloud config set project your-project-id gcloud config set api_endpoint_overrides/spanner http://localhost:9020/Una volta configurato, gcloud CLI invia i comandi all'emulatore anziché al servizio di produzione. Verifica questa operazione creando un'istanza con la configurazione dell'istanza dell'emulatore:
gcloud spanner instances create test-instance \ --config=emulator-config --description="Test Instance" --nodes=1
Cambiare configurazioni
Per passare dall'emulatore alla configurazione predefinita, esegui:
# To switch to default (production) configuration:
gcloud config configurations activate default
# To switch back to emulator configuration:
gcloud config configurations activate emulator
Utilizzare le librerie client con l'emulatore
Puoi utilizzare versioni supportate delle librerie client
con l'emulatore impostando la variabile di ambiente SPANNER_EMULATOR_HOST.
Esistono molti modi per farlo. Ad esempio:
Linux/macOS
export SPANNER_EMULATOR_HOST=localhost:9010
Windows
set SPANNER_EMULATOR_HOST=localhost:9010
Oppure con gcloud env-init:
Linux/macOS
$(gcloud emulators spanner env-init)
Windows
gcloud emulators spanner env-init > set_vars.cmd && set_vars.cmd
Quando l'applicazione viene avviata, la libreria client controlla automaticamente SPANNER_EMULATOR_HOST e si connette all'emulatore se è in esecuzione.
Una volta impostato SPANNER_EMULATOR_HOST, puoi testare l'emulatore seguendo le guide introduttive. Ignora le istruzioni relative alla creazione del progetto, all'autenticazione e alle credenziali, poiché non sono necessarie per utilizzare l'emulatore.
Guida introduttiva in C#. Devi impostare le opzioni della stringa di connessione. Consulta le istruzioni aggiuntive per C#.
Versioni supportate
La tabella seguente elenca le versioni delle librerie client che supportano l'emulatore.
| Libreria client | Versione minima |
|---|---|
| C++ | v0.9.x+ |
| C# | v3.1.0+ |
| Vai | v1.5.0+ |
| Java | v1.51.0+ |
| Node.js | v4.5.0+ |
| PHP | v1.25.0+ |
| Python | v1.15.0+ |
| Ruby | v1.13.0+ |
Istruzioni aggiuntive per C#
Per la libreria client C#, specifica l'
emulatordetection
opzione nella stringa di connessione.
A differenza delle altre librerie client, C# ignora la variabile di ambiente SPANNER_EMULATOR_HOST per impostazione predefinita. L'esempio seguente mostra la stringa di connessione:
var builder = new SpannerConnectionStringBuilder
{
DataSource = $"projects/{projectId}/instances/{instanceId}/databases/{databaseId}",
EmulatorDetection = "EmulatorOnly"
};