🌐 h2c в Go 1.24+. HTTP/2 без TLS стало проще — 28 мая 2026 г. в 09:41:37.536
🌐 h2c в Go 1.24+. HTTP/2 без TLS стало проще Если вы запускаете 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 решает проблему с зависшими коннектами и настраивается за минуту. ➡️ Источник

