Migrar do Go 1.11 para o ambiente de execução mais recente do Go

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 a data do fim 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 arquivo app.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ção http.ListenAndServe():

    port := os.Getenv("PORT")
    if port == "" {
    	port = "8080"
    	log.Printf("Defaulting to port %s", port)
    }
    
    log.Printf("Listening on port %s", port)
    if err := http.ListenAndServe(":"+port, nil); err != nil {
    	log.Fatal(err)
    }

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ção main() no pacote main.
  • Como alternativa, importe os pacotes do aplicativo para o pacote main, garantindo que cada função init() que contém chamadas para http.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 bloco import do pacote main:

    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.