Для чего это может быть нужно? Например, если ваше приложение состоит из нескольких компонентов, которые должны общаться, и вам не хочется возиться с REST, ведь есть же gRPC с кодогенерацией. Но при этом один из компонентов должен таки REST предоставлять скажем для фронтента. GRPC-gateway поможет избавить от двойной работы.
Как это устроено?
Сначала вы описываете какой-то сервис в protobuf
syntax = "proto3";
package your.service.v1;
option go_package = "github.com/yourorg/yourprotos/gen/go/your/service/v1";
message StringMessage {
string value = 1;
}
service YourService {
rpc Echo(StringMessage) returns (StringMessage) {}
}
Затем запускаете генератор кода
protoc -I . \
--go_out ./gen/go/ --go_opt paths=source_relative \
--go-grpc_out ./gen/go/ --go-grpc_opt paths=source_relative \
your/service/v1/your_service.proto
Получается несколько файликов, которые содержат http сервис с хэндлерами, которые могут превращать ваши HTTP запросы в gRPC.
Далее используете этот сгенерированный код
mux := runtime.NewServeMux()
opts := []grpc.DialOption{grpc.WithTransportCredentials(insecure.NewCredentials())}
gw.RegisterYourServiceHandlerFromEndpoint(ctx, mux, *grpcServerEndpoint, opts)
http.ListenAndServe(":8081", mux)
Готово!
Тут же рядом можно нагенерить openAPI схему. REST реализован практически бесплатно. Приколы конечно есть свои у продукта, куда же без них, и куда стремиться тоже, но все равно это огромная польза и экономия времени.
В сочетании с kube generator можно еще
👉 Из гошной структуры сгенерить protobuf файлы
👉 Из гошной структуры генерить клиенты для CRD
👉 И даже сами CRD манифесты
То есть если один из компонентов приложения это кубовый контроллер, то вообще сказка. Описываем нашу апишку в структурах и генерим из нее вообще все. Ну почти, если не считать что куборгенератор может делать пока что только proto2 синтакс и надо все же сам сервис описать, но это все прям мелочи.
Нашел даже реальный пример - Argo продукты, которые используют всю эту машинерию, argo workflow и argocd точно. Так что в проде это используется. Рекомендую присмотреться подробнее, мне зашло.