Gymterview
middle

Что такое gRPC и когда его стоит использовать вместо REST?

gRPC (gRPC Remote Procedure Call) — это высокопроизводительный фреймворк для удалённого вызова процедур, использующий Protocol Buffers для сериализации и HTTP/2 как транспортный протокол.

Ключевые особенности

  • Бинарный формат — protobuf компактнее JSON, что снижает нагрузку на сеть.
  • HTTP/2 — мультиплексирование, сжатие заголовков, двунаправленный стриминг.
  • Контракт через .proto файл — строгая типизация, автоматическая генерация кода.
  • Четыре типа взаимодействия: Unary, Server Streaming, Client Streaming, Bidirectional Streaming.
Пример .proto файла и реализации сервера
syntax = "proto3";
package com.bank.customer;

service CustomerService {
    rpc GetCustomer (GetCustomerRequest) returns (CustomerResponse);
    rpc ListCustomers (ListCustomersRequest) returns (stream CustomerResponse);
}

message GetCustomerRequest {
    int64 customer_id = 1;
}

message CustomerResponse {
    int64 id = 1;
    string name = 2;
    string account_number = 3;
}
@GrpcService
public class CustomerGrpcService extends CustomerServiceGrpc.CustomerServiceImplBase {

    private final CustomerRepository customerRepository;

    @Override
    public void getCustomer(GetCustomerRequest request,
                            StreamObserver<CustomerResponse> responseObserver) {
        Customer customer = customerRepository.findById(request.getCustomerId())
            .orElseThrow(() -> new StatusRuntimeException(Status.NOT_FOUND));

        responseObserver.onNext(CustomerResponse.newBuilder()
            .setId(customer.getId())
            .setName(customer.getName())
            .setAccountNumber(customer.getAccountNumber())
            .build());
        responseObserver.onCompleted();
    }
}
Критерий gRPC REST
Формат данных Protobuf (бинарный) JSON (текстовый)
Протокол HTTP/2 HTTP/1.1 или HTTP/2
Контракт .proto файл (обязательный) OpenAPI/Swagger (опционально)
Стриминг Нативный (4 типа) Ограниченный (SSE, WebSocket)
Читаемость Нет (бинарный) Да (JSON)
Кодогенерация Автоматическая Опциональная
Браузер gRPC-Web (ограниченно) Нативная поддержка

Когда использовать gRPC

  • Высоконагруженное межсервисное взаимодействие внутри кластера.
  • Требуется стриминг данных.
  • Критична производительность и размер пакетов.
  • Строгая типизация контрактов важнее «человекочитаемости».

Когда оставить REST

  • Публичное API для внешних потребителей.
  • Простые CRUD-операции.
  • Нужна простая отладка (JSON читаем, protobuf — нет).
  • Браузерные клиенты.

На собеседовании: ключевой вопрос — «когда что выбрать». REST для внешних API и простоты, gRPC для внутреннего межсервисного взаимодействия с высокой нагрузкой. Упомяните HTTP/2 и стриминг как основные преимущества gRPC.