Ответ
Protobuf может работать поверх HTTP/1.1, но неэффективно. Основные проблемы:
-
Отсутствие мультиплексирования - HTTP/1.1 требует последовательной обработки запросов, что снижает производительность при потоковой передаче protobuf-сообщений.
-
Нет бинарных фреймов - HTTP/1.1 текстовый, protobuf бинарный, требуется base64-кодирование, что увеличивает объем данных.
-
Заголовки HTTP/1.1 добавляют значительные накладные расходы для небольших protobuf-сообщений.
Пример HTTP/1.1 с protobuf:
// Клиент
reqBody, _ := proto.Marshal(&pb.Request{Id: 1})
req, _ := http.NewRequest("POST", url, bytes.NewReader(reqBody))
req.Header.Set("Content-Type", "application/x-protobuf")
client.Do(req)
// Сервер
body, _ := io.ReadAll(r.Body)
var req pb.Request
proto.Unmarshal(body, &req)
Лучше использовать HTTP/2 или gRPC, где есть бинарные фреймы и мультиплексирование.