Зачем нужен gRPC-шлюз при работе с браузером
gRPC — это мощный инструмент для высокопроизводительной коммуникации между сервисами, но у него есть один существенный недостаток: браузеры не умеют напрямую работать с протоколом HTTP/2 и бинарным форматом Protocol Buffers. Именно поэтому разработчики используют gRPC-Gateway — дополнительный слой, который преобразует REST-запросы в gRPC-вызовы и обратно. Это позволяет подключать браузерные приложения к gRPC-бэкенду без необходимости переписывать клиентскую логику.
Согласно исследованию Stack Overflow Developer Survey 2024 года, более 18% разработчиков в мире используют gRPC в продакшене, и это число выросло на 6% по сравнению с 2022 годом. Параллельно растёт и интерес к gRPC-Gateway, особенно среди команд, работающих с микросервисной архитектурой и SPA-фронтендом.
Что такое gRPC-Gateway и как он работает

gRPC-Gateway — это прокси-сервер, который принимает HTTP-запросы, декодирует их в gRPC-сообщения и отправляет на сервер. В ответ он преобразует gRPC-ответ в JSON, который легко читается браузером. Это решение особенно популярно в экосистеме Go, так как библиотека `grpc-gateway` активно поддерживается и развивается.
Принцип работы следующий:
- Браузер отправляет HTTP/1.1 или HTTP/2 запрос к REST-эндпоинту.
- gRPC-Gateway принимает запрос и преобразует его в бинарный gRPC вызов.
- Сервер отвечает через gRPC, а шлюз обратно трансформирует ответ в JSON.
- Браузер получает привычный REST-ответ, не подозревая о gRPC.
Как настроить gRPC-Gateway: пошаговое руководство
Настройка шлюза может показаться сложной, но на практике всё сводится к нескольким ключевым шагам. Рассмотрим их на примере сервиса на Go.
1. Установите необходимые зависимости

Для начала убедитесь, что у вас установлены следующие инструменты:
- Go (версия 1.20 и выше)
- `protoc` — компилятор Protocol Buffers
- Плагины для генерации gRPC и gRPC-Gateway:
- `protoc-gen-go`
- `protoc-gen-go-grpc`
- `protoc-gen-grpc-gateway`
Установить их можно с помощью команды:
```bash
go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
go install github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-grpc-gateway@latest
```
2. Определите .proto-файл с HTTP-аннотациями
Вам нужно добавить аннотации к методам в вашем `.proto` файле. Пример:
```protobuf
syntax = "proto3";
package example;
import "google/api/annotations.proto";
service UserService {
rpc GetUser(GetUserRequest) returns (User) {
option (google.api.http) = {
get: "/v1/users/{id}"
};
}
}
message GetUserRequest {
string id = 1;
}
message User {
string id = 1;
string name = 2;
}
```
Эти аннотации позволяют gRPC-Gateway понять, как маршрутизировать HTTP-запросы.
3. Сгенерируйте код
После подготовки `.proto` файла с аннотациями, сгенерируйте серверный и шлюзовый код:
```bash
protoc -I.
-I$GOPATH/pkg/mod/github.com/grpc-ecosystem/grpc-gateway@v2.16.0/third_party/googleapis
--go_out . --go-grpc_out .
--grpc-gateway_out .
your_service.proto
```
Обратите внимание на путь к `googleapis`, так как без него аннотации не сработают.
4. Настройте HTTP-сервер
Создайте HTTP-сервер, который будет запускать gRPC-Gateway:
```go
mux := runtime.NewServeMux()
opts := []grpc.DialOption{grpc.WithInsecure()}
err := example.RegisterUserServiceHandlerFromEndpoint(ctx, mux, "localhost:50051", opts)
if err != nil {
log.Fatal(err)
}
http.ListenAndServe(":8080", mux)
```
Теперь ваш сервер будет принимать HTTP-запросы на порт 8080 и проксировать их к gRPC-серверу на 50051.
Особенности и подводные камни
Хотя gRPC-Gateway — мощный инструмент, у него есть свои ограничения. Вот на что стоит обратить внимание:
- Стриминг: Поддерживается только серверный стриминг. Клиентский и bidi-стриминг в браузере невозможны через REST.
- Аутентификация: JWT или OAuth2 нужно реализовывать отдельно, gRPC-Gateway не занимается безопасностью.
- CORS: По умолчанию CORS-заголовки не добавляются. Их нужно настраивать вручную через middleware.
- Производительность: Несмотря на дополнительный слой, задержка минимальна — в среднем 2-5 мс на запрос по данным компании Buoyant (2023).
Альтернативы gRPC-Gateway
Если вы хотите избежать использования gRPC-Gateway, есть и другие подходы:
- gRPC-Web — облегчённая версия gRPC, поддерживающая работу в браузере через прокси. Используется, например, в проектах на TypeScript.
- OpenAPI + REST — генерация REST-интерфейсов на основе gRPC через OpenAPI-спецификацию.
- GraphQL-шлюзы — некоторые команды используют GraphQL как прослойку между браузером и gRPC.
Тем не менее, gRPC-Gateway остаётся наиболее зрелым и гибким решением для Go-проектов.
Тренды и статистика: как развивается gRPC

За последние 3 года интерес к gRPC и связанным технологиям стабильно растёт. По данным GitHub (2022–2024), репозиторий `grpc-gateway` получил более 6.2 тыс. звёзд, а число активных контрибьюторов увеличилось на 40%. Среди компаний, активно использующих gRPC-Gateway, можно выделить:
- Netflix
- Shopify
- Cloudflare
- Coinbase
Также стоит отметить, что более 70% опрошенных DevOps-инженеров в отчёте CNCF 2024 года заявили, что используют gRPC в микросервисной архитектуре, и половина из них применяет gRPC-Gateway для поддержки фронтенда.
Вывод: стоит ли использовать gRPC-Gateway?
Если вы строите современное веб-приложение с микросервисной архитектурой, gRPC-Gateway — это надёжный мост между вашим фронтендом и gRPC-бэкендом. Он позволяет использовать преимущества обоих миров: компактность и производительность gRPC, а также совместимость и гибкость REST.
Да, настройка требует внимания к деталям, особенно в части аннотаций и CORS, но результат того стоит. Вы получите масштабируемое, быстрое и расширяемое API, доступное как из браузера, так и из других сервисов.



