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.