Nesta página, você verá instruções para migrar ambientes de execução do Go da primeira para a segunda geração. Para fazer upgrade do aplicativo de segunda geração para usar a versão compatível mais recente do Go, consulte Fazer upgrade de um aplicativo existente.
O Go 1.11 chegou ao fim do suporte em 30 de janeiro de 2024. Os aplicativos Go 1.11 atuais continuarão a ser executados e a receber tráfego. No entanto, o App Engine pode bloquear a reimplantação de aplicativos que usam ambientes de execução após o término da data de suporte. Recomendamos que você migre para a versão compatível mais recente do Go seguindo as diretrizes nesta página.
A migração para um ambiente de execução Go de segunda geração compatível permite que você use recursos de linguagem atualizados e crie aplicativos mais portáteis com código idiomático.
Mudanças nos ambientes de execução de segunda geração
Considere as seguintes diferenças ao fazer upgrade para um ambiente de execução Go de segunda geração compatível:
Para reduzir o esforço e a complexidade da migração do ambiente de execução, o ambiente padrão do App Engine permite acessar muitos dos pacotes de serviços legados e APIs nos ambientes de execução de segunda geração, como o Memcache. Seu aplicativo Go de segunda geração pode chamar as APIs dos pacotes de serviços pelo SDK do App Engine para Go e acessar a maioria dos recursos do ambiente de execução do Go 1.11.
Você também tem a opção de usar produtos do Google Cloud que oferecem recursos semelhantes aos pacotes de serviços 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 de segunda geração segue o padrão de geração de registros no Cloud Logging. Nos ambientes de execução de segunda geração, os registros de aplicativos não são mais agrupados com os registros de solicitação, mas sim separados em registros diferentes. Para saber mais sobre como ler e gravar registros nos ambientes de execução de segunda geração, 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 | Alterar tipo | Descrição |
---|---|---|
app_engine_apis |
Obrigatório para aplicativos que usam pacotes de serviços legados | Defina como true se você quiser acessar os pacotes de serviços legados para os ambientes de execução de segunda geração.
|
login |
Compatível se app_engine_apis for true |
Se você não estiver usando os pacotes de serviços legados para os ambientes de execução de segunda geração, use estes métodos alternativos para autenticar usuários. |
runtime |
Modificado |
Mude o elemento runtime para especificar um ambiente de execução de segunda geração.
|
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
.