Если вы запускаете Go-сервис в Google Cloud Run и используете долгоживущие соединения, у HTTP/1.1 есть известная проблема. Cloud Run не пробрасывает разрыв клиентского соединения на бэкенд. Сервер продолжает держать мёртвое соединение открытым, пока не истечёт таймаут. Решение — перейти на HTTP/2 cleartext (h2c).
Cloud Run сам терминирует TLS на фронтенде, а трафик до контейнера отправляет без шифрования. Можно выбрать HTTP/1.1 или h2c. Это тот самый режим «HTTP/2 with Prior Knowledge» из RFC 9113 (секция 3.3), когда клиент и сервер договариваются об HTTP/2 заранее, без Upgrade.
Как было до Go 1.24
Нужен был пакет
golang.org/x/net/http2/h2c. Хендлер оборачивался в обёртку, потом отдельно конфигурировался http2.Server. Выглядело громоздко:
import (
"net/http"
"golang.org/x/net/http2"
"golang.org/x/net/http2/h2c"
)
h2s := &http2.Server{}
handler = h2c.NewHandler(handler, h2s)
srv := &http.Server{
Addr: ":9888",
Handler: handler,
}
err = http2.ConfigureServer(srv, h2s)
Внешняя зависимость, неочевидный порядок вызовов, лишний бойлерплейт.
Как стало в Go 1.24+
Теперь всё настраивается через стандартный
http.Server. Никаких обёрток и внешних пакетов:srv := &http.Server{
Addr: ":9888",
Handler: handler,
}
srv.Protocols = new(http.Protocols)
srv.Protocols.SetHTTP1(true)
srv.Protocols.SetUnencryptedHTTP2(true)Три строки вместо цепочки из обёртки, конфигурации и внешней зависимости. Сервер теперь принимает и HTTP/1.1, и h2c одновременно.
Проверка локально:
curl -i --http2-prior-knowledge http://localhost:9888
Если h2c не настроен, curl вернёт ошибку.
Конфигурация Cloud Run через Terraform
В описании контейнера порт нужно назвать
h2c. Это сигнал для Cloud Run использовать HTTP/2 cleartext:resource "google_cloud_run_v2_service" "api" {
name = "api"
location = var.primary_region
template {
containers {
ports {
name = "h2c"
container_port = 9888
}
}
max_instance_request_concurrency = 200
timeout = "900s"
}
}На стороне балансировщика ничего менять не нужно. Serverless NEG сам корректно апгрейдит соединение до HTTP/2 при общении с Cloud Run.
Go 1.24 убрал главное неудобство h2c — зависимость от
x/net/http2/h2c и запутанную конфигурацию. Если вы работаете с Cloud Run и SSE или gRPC, или любыми долгоживущими соединениями, переход на h2c решает проблему с зависшими коннектами и настраивается за минуту.➡️ Источник
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека Go-разработчика
#GoToProduction
