A migração para o ambiente de execução do Go 1.12+ permite usar recursos de linguagem atualizados e criar aplicativos mais portáteis, com código idiomático.
Alterações no ambiente de execução do Go 1.12+ do App Engine
Se você estiver pensando em migrar para o ambiente de execução do Go 1.12+, esteja ciente das seguintes diferenças entre os ambientes de execução do Go 1.12+ e ambientes anteriores no ambiente padrão do App Engine:
Para reduzir o esforço e a complexidade da migração no ambiente de execução, o ambiente padrão do App Engine permite acessar vários serviços e APIs em pacote legados no ambiente de execução do Go 1.12+, como o Memcache. O aplicativo Go 1.12+ pode chamar as APIs de serviços incluídos pelo SDK do App Engine para Go e acessar a maioria das mesmas funcionalidades que o ambiente de execução do Go 1.11.
Você também tem a opção de usar produtos do Google Cloud que oferecem funcionalidades semelhantes aos serviços incluídos legados. Esses produtos do Google Cloud oferecem bibliotecas de cliente idiomáticas do Cloud para Go. Para os serviços incluídos que não estão disponíveis como produtos separados no Google Cloud, como processamento de imagens, pesquisa e mensagens, use provedores de terceiros ou outras soluções alternativas.
Para saber mais sobre como migrar para serviços desagrupados, consulte Como migrar de serviços incluídos.
O comportamento de alguns elementos no arquivo de configuração
app.yaml
foi modificado. Para obter mais informações, consulte Alterações no arquivoapp.yaml
.A geração de registros no ambiente de execução do Go 1.12+ segue o padrão de geração de registros no Cloud Logging. No ambiente de execução do Go 1.12+, os registros de aplicativos não são mais incluídos com os registros de solicitação, mas são separados em registros diferentes. Para saber mais sobre como ler e gravar registros no ambiente de execução do Go 1.12+, consulte o guia de geração de registros.
Diferenças de uso da memória
Os ambientes de execução de segunda geração têm um valor de referência maior do uso de memória em comparação com os da primeira geração. Isso ocorre devido a vários fatores, como versões diferentes da imagem de base e diferenças na forma como as duas gerações calculam o uso de memória.
Os ambientes de execução de segunda geração calculam o uso de memória da instância como a soma do que um processo do aplicativo usa e o número de arquivos de aplicativos armazenados em cache dinamicamente na memória. Para evitar que aplicativos com uso intensivo de memória tenham encerramentos de instâncias por excederem os limites de memória, faça upgrade para uma classe de instância maior com mais memória.
Diferenças de uso da CPU
Os ambientes de execução de segunda geração podem ter um valor de referência mais alto de uso da CPU durante a inicialização a frio da instância. Dependendo da configuração de escalonamento de um aplicativo, isso pode ter efeitos colaterais não intencionais, como uma contagem de instâncias maior do que o previsto se um aplicativo estiver configurado para escalonar com base na utilização da CPU. Para evitar esse problema, revise e teste as configurações de escalonamento do aplicativo para garantir que o número de instâncias seja aceitável.
Diferenças de cabeçalhos de solicitação
Os ambientes de execução de primeira geração permitem que os cabeçalhos das solicitações com sublinhados
(por exemplo, X-Test-Foo_bar
) sejam encaminhados para o aplicativo. Os ambientes
de execução de segunda geração introduzem o Nginx na arquitetura do host. Como resultado dessa
mudança, os ambientes de execução de segunda geração são configurados para remover
automaticamente cabeçalhos com sublinhados (_
). Para evitar problemas no aplicativo, evite usar
sublinhados nos cabeçalhos das solicitações.
Alterações no arquivo app.yaml
O comportamento de alguns elementos no arquivo de configuração app.yaml
foi modificado:
Elemento | Tipo de alteração | Descrição |
---|---|---|
app_engine_apis |
Aplicável somente para o Go 1.12+ | Defina como true se você quiser acessar os
serviços agrupados legados para o Go 1.12+.
|
login |
Compatível se app_engine_apis for true |
Se você não estiver usando os serviços incluídos legados para Go 1.12+, use estes métodos alternativos para autenticar usuários. |
runtime |
Modificado |
Altere o elemento runtime para
especificar o Go 1.12+.
|
Para obter mais informações, consulte a
referência app.yaml
.
Como criar um pacote main
O serviço precisa incluir uma instrução package main
em pelo menos um arquivo de origem. Como alternativa, se o serviço estiver usando o pacote google.golang.org/appengine
,
inclua uma chamada para appengine.Main()
.
Como gravar um pacote principal
Se o serviço ainda não tiver um pacote main
, adicione a instrução package main
e grave uma função main()
. No mínimo,
a função main()
precisa:
Ler a variável de ambiente
PORT
e chamar a funçãohttp.ListenAndServe()
:
Como registrar os gerenciadores HTTP
É possível registrar seus gerenciadores HTTP escolhendo uma das seguintes opções:
- O método preferido é mover manualmente todas as chamadas
http.HandleFunc()
dos seus pacotes para a funçãomain()
no pacotemain
. Como alternativa, importe os pacotes do aplicativo para o pacote
main
, garantindo que cada funçãoinit()
que contém chamadas parahttp.HandleFunc()
seja executada na inicialização.É possível todos os pacotes que usam a chamada
http.HandleFunc()
com o script bash a seguir e copiar a saída para o blocoimport
do pacotemain
: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
Como estruturar seus arquivos
O Go requer que cada pacote tenha o próprio diretório. É possível informar ao App Engine onde está seu pacote main
usando main:
no arquivo app.yaml
do projeto. Por exemplo, se a estrutura de arquivos do aplicativo tiver esta aparência:
myapp/ ├── app.yaml ├── foo.go ├── bar.go └── web/ └── main.go
O arquivo app.yaml
teria:
main: ./web # Relative filepath to the directory containing your main package.
Para obter mais informações sobre a sinalização main
, consulte a referência de app.yaml
.
Como mover arquivos para o GOPATH
Encontre o GOPATH
usando o seguinte comando:
go env GOPATH
Mova todos os arquivos relevantes e importa para GOPATH
. Se estiver usando importações relativas, como import ./guestbook
, atualize as importações para usar o caminho completo: import github.com/example/myapp/guestbook
.