La migrazione a un runtime Go di seconda generazione supportato ti consente di utilizzare funzionalità aggiornate per il linguaggio e di creare app più portabili, con codice idiomatico.
Modifiche nei runtime di seconda generazione
Se stai eseguendo la migrazione a un runtime Go di seconda generazione supportato, devi tenere conto delle seguenti differenze tra i runtime di prima e di seconda generazione:
Per ridurre lo sforzo e la complessità della migrazione del runtime, l'ambiente standard di App Engine ti consente di accedere a molti dei servizi e delle API in bundle legacy 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 prodotti Google Cloud che offrono funzionalità simili a quelle dei servizi in bundle legacy. 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, ad esempio 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 a servizi non in bundle, consulta Migrazione dai servizi in bundle.
Il comportamento di alcuni elementi del file di configurazione
app.yaml
è stato modificato. Per ulteriori informazioni, vedi Modifiche ai 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 di utilizzo della memoria
Per i runtime di seconda generazione, la base di utilizzo della memoria è maggiore rispetto ai runtime di prima generazione. Ciò è dovuto a più fattori, ad esempio diverse versioni delle immagini di base e alle 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 somma di ciò che viene usato da un processo di applicazione e del numero di file dell'applicazione memorizzati nella cache in modo dinamico. Per evitare che le applicazioni che consumano molta memoria subiscano arresti delle istanze a causa del superamento dei limiti di memoria, esegui l'upgrade a una classe di istanza più grande con più memoria.
Differenze di utilizzo della CPU
I runtime di seconda generazione possono notare una base di utilizzo della CPU più elevata in caso di avvio a freddo delle istanze. A seconda della configurazione di scalabilità di un'applicazione, questo potrebbe avere effetti collaterali involontari, ad esempio un numero di istanze più elevato del 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à delle applicazioni per assicurarti che il numero di istanze sia accettabile.
Differenze nell'intestazione delle richieste
I runtime di prima generazione consentono di inoltrare all'applicazione le intestazioni delle richieste con trattini bassi (ad es. X-Test-Foo_bar
). I runtime
di seconda generazione introducono Nginx nell'architettura host. A seguito di questa modifica, i runtime di seconda generazione sono configurati in modo da rimuovere automaticamente le intestazioni con trattini bassi (_
). Per evitare problemi dell'applicazione, evita di utilizzare i trattini bassi nelle intestazioni delle richieste dell'applicazione.
Modifiche al file app.yaml
Il comportamento di alcuni elementi del 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 |
Supportata se app_engine_apis è true |
Se non utilizzi i servizi in bundle legacy per i runtime di seconda generazione, utilizza questi metodi alternativi per autenticare gli utenti. |
runtime |
Modificata |
Modifica l'elemento runtime per specificare un runtime di seconda generazione.
|
Per maggiori informazioni, consulta la documentazione di riferimento di app.yaml
.
Creazione di un pacchetto main
in corso...
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 servizio non contiene già un pacchetto main
, aggiungi l'istruzione package main
e scrivi una funzione main()
. Come valore minimo, la funzione main()
deve:
Leggi la variabile di ambiente
PORT
e chiama la funzionehttp.ListenAndServe()
:
Registrazione dei gestori HTTP
Puoi registrare i tuoi gestori HTTP scegliendo una delle seguenti opzioni:
- Il metodo preferito consiste nello spostare manualmente tutte le chiamate
http.HandleFunc()
dai tuoi pacchetti alla funzionemain()
del tuo pacchettomain
. In alternativa, importa i pacchetti dell'applicazione nel pacchetto
main
, assicurandoti che ogni funzioneinit()
che contiene 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 tuo progetto. Ad esempio, se la struttura dei file
dell'app era simile a questa:
myapp/ ├── app.yaml ├── foo.go ├── bar.go └── web/ └── main.go
Il file app.yaml
avrebbe:
main: ./web # Relative filepath to the directory containing your main package.
Per ulteriori informazioni sul flag main
, consulta la documentazione di riferimento app.yaml
.
Spostamento dei file su GOPATH
in corso...
Trova il tuo GOPATH
utilizzando il seguente comando:
go env GOPATH
Sposta tutti i file e le importazioni pertinenti in 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
.