Questa pagina illustra le istruzioni per la migrazione dai runtime Go di prima generazione a quelli di seconda generazione. Per eseguire l'upgrade dell'app di seconda generazione in modo da utilizzare la versione di Go supportata più recente, vedi Eseguire l'upgrade di un'applicazione esistente.
Il 30 gennaio 2024 è terminato il supporto di Go 1.11. Le applicazioni Go 1.11 esistenti continueranno a funzionare e a ricevere traffico. Tuttavia, App Engine potrebbe bloccare il nuovo deployment delle applicazioni che utilizzano i runtime dopo la data di fine del supporto. Ti consigliamo di eseguire la migrazione all'ultima versione del runtime supportata di Go utilizzando le linee guida riportate in questa pagina.
La migrazione a un runtime Go di seconda generazione supportato consente di utilizzare funzionalità di linguaggio aggiornate e di creare app più portabili con codice idiomatico.
Modifiche ai runtime di seconda generazione
Tieni presente le seguenti differenze quando esegui l'upgrade a un runtime Go di seconda generazione supportato:
Per ridurre lo sforzo e la complessità della migrazione del runtime, l'ambiente standard App Engine ti consente di accedere a molti dei servizi e delle API legacy raggruppati nei runtime di seconda generazione, come Memcache. L'app Go di seconda generazione può chiamare le API dei servizi in bundle tramite l'SDK App Engine per Go e accedere alla maggior parte delle stesse funzionalità del runtime Go 1.11.
Hai anche la possibilità di utilizzare i prodotti Google Cloud che offrono funzionalità simili a quelle dei servizi in bundle precedenti. Questi prodotti Google Cloud forniscono librerie client cloud per Go idiomatiche. Per i servizi in bundle che non sono disponibili come prodotti separati in Google Cloud, come l'elaborazione di immagini, la ricerca e la messaggistica, puoi utilizzare provider di terze parti o altre soluzioni alternative.
Per scoprire di più sulla migrazione ai servizi slegati, consulta Eseguire la migrazione dai servizi in bundle.
Il comportamento di alcuni elementi nel file di configurazione
app.yaml
è stato modificato. Per ulteriori informazioni, vedi Modifiche al fileapp.yaml
.Il logging nel runtime di seconda generazione segue lo standard di logging in Cloud Logging. Nei runtime di seconda generazione, i log delle app non sono più raggruppati con i log delle richieste, ma sono separati in record diversi. Per scoprire di più sulla lettura e sulla scrittura dei log nei runtime di seconda generazione, consulta la guida alla registrazione.
Differenze nell'utilizzo della memoria
I runtime di seconda generazione hanno una base di riferimento dell'utilizzo della memoria più elevata rispetto ai runtime di prima generazione. Ciò è dovuto a diversi fattori, come versioni diverse delle immagini di base e differenze nel modo in cui le due generazioni calcolano l'utilizzo della memoria.
I runtime di seconda generazione calcolano l'utilizzo della memoria dell'istanza come la somma di ciò che viene utilizzato da un processo dell'applicazione e del numero di file dell'applicazione memorizzati nella cache dinamicamente in memoria. Per evitare che le applicazioni che utilizzano molta memoria vengano chiuse a causa del superamento dei limiti di memoria, esegui l'upgrade a una classe di istanze più grande con più memoria.
Differenze nell'utilizzo della CPU
I runtime di seconda generazione possono mostrare una linea di base più elevata dell'utilizzo della CPU al primo avvio dell'istanza. A seconda della configurazione della scalabilità di un'applicazione, questo potrebbe avere effetti collaterali indesiderati, ad esempio un numero di istanze superiore a quello previsto se un'applicazione è configurata per la scalabilità in base all'utilizzo della CPU. Per evitare questo problema, esamina e testa le configurazioni di scalabilità dell'applicazione per assicurarti che il numero di istanze sia accettabile.
Differenze nelle intestazioni delle richieste
I runtime di prima generazione consentono di inoltrare all'applicazione le intestazioni di richiesta con trattini bassi
(ad es. X-Test-Foo_bar
). I runtime di seconda generazione introducono Nginx nell'architettura host. A seguito di questa
variazione, i runtime di seconda generazione sono configurati per rimuovere automaticamente
le intestazioni con trattini bassi (_
). Per evitare problemi con le applicazioni, evita di utilizzare
tracci bassi nelle intestazioni delle richieste delle applicazioni.
Modifiche al file app.yaml
Il comportamento di alcuni elementi nel file di configurazione app.yaml
è stato modificato:
Elemento | Tipo di modifica | Descrizione |
---|---|---|
app_engine_apis |
Obbligatorio per le app che utilizzano servizi in bundle legacy | Deve essere impostato su true se vuoi accedere ai
servizi in bundle legacy per i runtime di seconda generazione.
|
login |
Supportato se app_engine_apis è true |
Se non utilizzi i servizi legacy in bundle per i runtime di seconda generazione, utilizza questi metodi alternativi per autenticare gli utenti. |
runtime |
Modificato |
Modifica l'elemento runtime per
specificare un runtime di seconda generazione.
|
Per ulteriori informazioni, consulta il riferimento app.yaml
.
Creazione di un pacchetto main
Il servizio deve includere un'istruzione package main
in almeno un file di origine. In alternativa, se il tuo servizio utilizza il pacchetto google.golang.org/appengine
, includi una chiamata a appengine.Main()
.
Scrittura di un pacchetto principale
Se il tuo servizio non contiene già un pacchetto main
, aggiungi l'istruzione package main
e scrivi una funzione main()
. Come minimo,
la funzione main()
deve:
Leggi la variabile di ambiente
PORT
e chiama la funzionehttp.ListenAndServe()
:
Registrazione dei gestori HTTP
Puoi registrare i gestori HTTP scegliendo una delle seguenti opzioni:
- Il metodo preferito è spostare manualmente tutte le chiamate
http.HandleFunc()
dai pacchetti alla funzionemain()
nel pacchettomain
. In alternativa, importa i pacchetti dell'applicazione nel pacchetto
main
, assicurandoti che ogni funzioneinit()
contenente chiamate ahttp.HandleFunc()
venga eseguita all'avvio.Puoi trovare tutti i pacchetti che utilizzano la chiamata
http.HandleFunc()
con il seguente script bash e copiare l'output nel bloccoimport
del pacchettomain
:gp=$(go env GOPATH) && p=$(pwd) && pkg=${p#"$gp/src/"} && find . -name "*.go" | xargs grep "http.HandleFunc" --files-with-matches | grep -v vendor/ | grep -v '/main.go' | sed "s#\./\(.*\)/[^/]\+\.go#\t_ \"$pkg/\1\"#" | sort | uniq
Strutturare i file
Go richiede che ogni pacchetto abbia la propria directory. Puoi indicare ad App Engine dove si trova il pacchetto main
utilizzando main:
nel file app.yaml
del progetto. Ad esempio, se la struttura dei file della tua app fosse simile a questa:
myapp/ ├── app.yaml ├── foo.go ├── bar.go └── web/ └── main.go
Il file app.yaml
deve contenere:
main: ./web # Relative filepath to the directory containing your main package.
Per ulteriori informazioni sul flag main
, consulta la documentazione di riferimentoapp.yaml
.
Spostare file su GOPATH
Per trovare il tuo GOPATH
, utilizza il seguente comando:
go env GOPATH
Sposta tutti i file e le importazioni pertinenti nel tuo GOPATH
. Se utilizzi importazioni relative, ad esempio import ./guestbook
, aggiorna le importazioni in modo da utilizzare il percorso completo: import github.com/example/myapp/guestbook
.