← Назад ко всем вопросам

Какие знаешь виды вызовов у gRPC

1️⃣ Как кратко ответить

gRPC поддерживает четыре типа вызовов: Unary, Server Streaming, Client Streaming и Bidirectional Streaming. Unary — это простой запрос-ответ. Server Streaming — клиент отправляет запрос, сервер отвечает потоком данных. Client Streaming — клиент отправляет поток данных, сервер отвечает одним ответом. Bidirectional Streaming — обе стороны обмениваются потоками данных.

2️⃣ Подробное объяснение темы

gRPC — это современный фреймворк для удаленного вызова процедур (RPC), который использует HTTP/2 для транспортировки данных и Protocol Buffers для сериализации сообщений. Он поддерживает четыре основных типа вызовов, которые позволяют гибко взаимодействовать между клиентом и сервером.

  1. 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 — это метод сервера, который принимает контекст и запрос, содержащий идентификатор пользователя, и возвращает ответ с данными пользователя.

  2. 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 — это метод, который отправляет поток данных о пользователях клиенту. Клиент может получать данные по мере их отправки сервером.

  3. 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 — это метод, который принимает поток данных от клиента и сохраняет их в базу данных, после чего возвращает статус операции.

  4. 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 мощным инструментом для построения распределенных систем, позволяя выбирать подходящий тип взаимодействия в зависимости от требований приложения.

Тема: Web
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки