Какие знаешь виды вызовов у gRPC
1️⃣ Как кратко ответить
gRPC поддерживает четыре типа вызовов: Unary, Server Streaming, Client Streaming и Bidirectional Streaming. Unary — это простой запрос-ответ. Server Streaming — клиент отправляет запрос, сервер отвечает потоком данных. Client Streaming — клиент отправляет поток данных, сервер отвечает одним ответом. Bidirectional Streaming — обе стороны обмениваются потоками данных.
2️⃣ Подробное объяснение темы
gRPC — это современный фреймворк для удаленного вызова процедур (RPC), который использует HTTP/2 для транспортировки данных и Protocol Buffers для сериализации сообщений. Он поддерживает четыре основных типа вызовов, которые позволяют гибко взаимодействовать между клиентом и сервером.
-
Unary RPC
Unary RPC — это самый простой тип вызова, который напоминает традиционный HTTP-запрос. Клиент отправляет один запрос серверу и получает один ответ. Это похоже на вызов функции, где передаются параметры и ожидается результат.
// Пример Unary RPC func (s *server) GetUser(ctx context.Context, req *pb.UserRequest) (*pb.UserResponse, error) { // Обработка запроса и возврат ответа user := getUserFromDatabase(req.Id) return &pb.UserResponse{User: user}, nil }В этом примере
GetUser— это метод сервера, который принимает контекст и запрос, содержащий идентификатор пользователя, и возвращает ответ с данными пользователя. -
Server Streaming RPC
В Server Streaming RPC клиент отправляет один запрос серверу, и сервер возвращает поток ответов. Это полезно, когда сервер должен отправить клиенту несколько сообщений в ответ на один запрос.
// Пример Server Streaming RPC func (s *server) ListUsers(req *pb.ListUsersRequest, stream pb.UserService_ListUsersServer) error { // Получение списка пользователей users := getAllUsersFromDatabase() for _, user := range users { // Отправка каждого пользователя в потоке stream.Send(&pb.UserResponse{User: user}) } return nil }Здесь
ListUsers— это метод, который отправляет поток данных о пользователях клиенту. Клиент может получать данные по мере их отправки сервером. -
Client Streaming RPC
В Client Streaming RPC клиент отправляет поток запросов серверу, и сервер возвращает один ответ после получения всех данных. Это полезно, когда клиент должен отправить много данных, которые сервер обрабатывает и возвращает результат.
// Пример Client Streaming RPC func (s *server) UploadUsers(stream pb.UserService_UploadUsersServer) error { var users []User for { // Получение данных из потока req, err := stream.Recv() if err == io.EOF { // Все данные получены, обработка saveUsersToDatabase(users) return stream.SendAndClose(&pb.UploadResponse{Status: "Success"}) } if err != nil { return err } users = append(users, req.User) } }В этом примере
UploadUsers— это метод, который принимает поток данных от клиента и сохраняет их в базу данных, после чего возвращает статус операции. -
Bidirectional Streaming RPC
Bidirectional Streaming RPC позволяет клиенту и серверу обмениваться потоками данных одновременно. Это наиболее сложный тип вызова, который позволяет обеим сторонам отправлять и получать данные независимо друг от друга.
// Пример Bidirectional Streaming RPC func (s *server) Chat(stream pb.ChatService_ChatServer) error { for { // Получение сообщения от клиента msg, err := stream.Recv() if err == io.EOF { return nil } if err != nil { return err } // Обработка и отправка ответа response := processMessage(msg) stream.Send(response) } }В этом примере
Chat— это метод, который позволяет клиенту и серверу обмениваться сообщениями в реальном времени. Оба могут отправлять и получать данные независимо друг от друга.
Эти четыре типа вызовов делают gRPC мощным инструментом для построения распределенных систем, позволяя выбирать подходящий тип взаимодействия в зависимости от требований приложения.
🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!
Подписаться