Почему браузеры не поддерживают gRPC?

gRPC основан на HTTP/2, который (предположение) широко поддерживается браузерами. Поэтому я чувствую, что не должно быть проблем с gRPC из браузера.

Тем не менее, ясно, что есть проблема. Протокол grpc web отличается, так как существует "из-за ограничений браузера". Есть также многочисленные сообщения в блоге, описывающие сложные технические стеки, развернутые, чтобы заставить gRPC работать из браузера.

Я упускаю актуальную проблему - почему gRPC не просто работает из браузеров?

3 ответа

Теперь я понимаю, что браузеры поддерживают только HTTP/2 в том смысле, что они используют его для получения ресурсов с сервера от имени кода вашего приложения (javascript).

Код приложения Javascipt все еще может использовать только HTTP/1 (который может быть обработан браузером при подключении HTTP/2). Поэтому код приложения не может использовать grpc.

Если кто-нибудь найдет, где это объясняется в документации, было бы неплохо добавить ссылку на него здесь.

Большинство браузеров используют HTTP1.1, тогда как GRPC работает только с HTTP2. Вы можете использовать nginx, envoy или traefic, чтобы запустить его за обратным прокси, очень похоже на то, как веб-сокеты часто используются за обратным прокси (в этом случае http1 обновляется до подключения через веб-сокеты). Обратный прокси-сервер отправит запрос grpc, отправленный через http1, на сервер http2 и наоборот. Вы можете использовать Envoy(предлагается / в настоящее время используется grpc-web), traefik(я использую это лично) и nginx.

Этот вопрос был у меня на уме, и после некоторых поисков я нашел следующий комментарий на https://grpc.io/blog/state-of-grpc-web/#the-grpc-web-spec :

В настоящее время невозможно реализовать спецификацию HTTP/2 gRPC 3 в браузере, поскольку просто не существует браузерного API с достаточно детальным контролем над запросами. Например: невозможно принудительно использовать HTTP/2, а даже если бы он был, необработанные кадры HTTP/2 недоступны в браузерах.

Кто-то может меня поправить, если я ошибаюсь, но я считаю, что еще одна причина, по которой grpc не поддерживается, несмотря на «широко распространенную поддержку» HTTP/2 в браузерах, заключается в том, что push-уведомление с сервера не реализуется в браузерах по разным причинам, описанным в этой теме: Как реализовать потоковое соединение HTTP/2 в браузере?

Другие вопросы по тегам