[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-mikroservisy-chto-takoe-grpc-i-kogda-ego-stoit-ispolzovat-vmesto-rest":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":16,"progress":17,"seo":18},823,"chto-takoe-grpc-i-kogda-ego-stoit-ispolzovat-vmesto-rest",23,"mikroservisy","Микросервисы","🔗","Что такое gRPC и когда его стоит использовать вместо REST?","gRPC (gRPC Remote Procedure Call) — это высокопроизводительный фреймворк для удалённого вызова процедур, использующий Protocol Buffers для сериализации и HTTP\u002F2 как транспортный протокол.\n\n### Ключевые особенности\n\n- Бинарный формат — protobuf компактнее JSON, что снижает нагрузку на сеть.\n- HTTP\u002F2 — мультиплексирование, сжатие заголовков, двунаправленный стриминг.\n- Контракт через .proto файл — строгая типизация, автоматическая генерация кода.\n- Четыре типа взаимодействия: Unary, Server Streaming, Client Streaming, Bidirectional Streaming.\n\n\u003Cdetails>\u003Csummary>Пример .proto файла и реализации сервера\u003C\u002Fsummary>\n\n```protobuf\nsyntax = \"proto3\";\npackage com.bank.customer;\n\nservice CustomerService {\n    rpc GetCustomer (GetCustomerRequest) returns (CustomerResponse);\n    rpc ListCustomers (ListCustomersRequest) returns (stream CustomerResponse);\n}\n\nmessage GetCustomerRequest {\n    int64 customer_id = 1;\n}\n\nmessage CustomerResponse {\n    int64 id = 1;\n    string name = 2;\n    string account_number = 3;\n}\n```\n\n```java\n@GrpcService\npublic class CustomerGrpcService extends CustomerServiceGrpc.CustomerServiceImplBase {\n\n    private final CustomerRepository customerRepository;\n\n    @Override\n    public void getCustomer(GetCustomerRequest request,\n                            StreamObserver\u003CCustomerResponse> responseObserver) {\n        Customer customer = customerRepository.findById(request.getCustomerId())\n            .orElseThrow(() -> new StatusRuntimeException(Status.NOT_FOUND));\n\n        responseObserver.onNext(CustomerResponse.newBuilder()\n            .setId(customer.getId())\n            .setName(customer.getName())\n            .setAccountNumber(customer.getAccountNumber())\n            .build());\n        responseObserver.onCompleted();\n    }\n}\n```\n\n\u003C\u002Fdetails>\n\n| Критерий | gRPC | REST |\n|---|---|---|\n| Формат данных | Protobuf (бинарный) | JSON (текстовый) |\n| Протокол | HTTP\u002F2 | HTTP\u002F1.1 или HTTP\u002F2 |\n| Контракт | .proto файл (обязательный) | OpenAPI\u002FSwagger (опционально) |\n| Стриминг | Нативный (4 типа) | Ограниченный (SSE, WebSocket) |\n| Читаемость | Нет (бинарный) | Да (JSON) |\n| Кодогенерация | Автоматическая | Опциональная |\n| Браузер | gRPC-Web (ограниченно) | Нативная поддержка |\n\n### Когда использовать gRPC\n\n- Высоконагруженное межсервисное взаимодействие внутри кластера.\n- Требуется стриминг данных.\n- Критична производительность и размер пакетов.\n- Строгая типизация контрактов важнее «человекочитаемости».\n\n### Когда оставить REST\n\n- Публичное API для внешних потребителей.\n- Простые CRUD-операции.\n- Нужна простая отладка (JSON читаем, protobuf — нет).\n- Браузерные клиенты.\n\n> **На собеседовании:** ключевой вопрос — «когда что выбрать». REST для внешних API и простоты, gRPC для внутреннего межсервисного взаимодействия с высокой нагрузкой. Упомяните HTTP\u002F2 и стриминг как основные преимущества gRPC.","","middle",[15],"microservices",[],null,{"title":19,"description":20,"ogTitle":19,"ogDescription":21,"keywords":22,"schemaAnswer":23,"featuredSnippetReady":24},"Что такое gRPC и когда его стоит использовать вместо REST? — Gymterview","gRPC (gRPC Remote Procedure Call) — это высокопроизводительный фреймворк для удалённого вызова процедур, использующий Protocol Buffers для сериализации и HTTP\u002F2","gRPC (gRPC Remote Procedure Call) — это высокопроизводительный фреймворк для удалённого вызова процедур, использующий Pr",[15,13],"gRPC (gRPC Remote Procedure Call) — это высокопроизводительный фреймворк для удалённого вызова процедур, использующий Protocol Buffers для сериализации и HTTP\u002F2 как транспортный протокол.",true]