0Pricing
Go Academy · Урок

Реализация унарного сервиса gRPC

Сервер и клиент с grpc-go

«Реализация унарного сервиса gRPC» — бесплатный урок Go Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Go Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Go Academy содержит 4 уроков всего.

Что такое унарный RPC?

Унарный RPC — это самый простой шаблон gRPC: клиент отправляет один запрос и получает один ответ, подобно обычному вызову функции по сети.

Реализация сервера

Реализуйте сгенерированный интерфейс. Встройте структуру Unimplemented*Server для обратной совместимости:

type userServer struct {
    pb.UnimplementedUserServiceServer
    db *sql.DB
}

func (s *userServer) GetUser(ctx context.Context, req *pb.GetUserRequest) (*pb.User, error) {
    // query DB
    return &pb.User{Id: req.Id, Name: "Alice"}, nil
}

Запуск сервера

Создайте сервер gRPC, зарегистрируйте реализацию и начните прослушивание TCP-порта:

lis, _ := net.Listen("tcp", ":50051")
grpcSrv := grpc.NewServer()
pb.RegisterUserServiceServer(grpcSrv, &userServer{})
log.Fatal(grpcSrv.Serve(lis))

Подключение клиента

Подключитесь к серверу и создайте клиентскую заглушку:

conn, err := grpc.NewClient("localhost:50051", grpc.WithTransportCredentials(insecure.NewCredentials()))
if err != nil { log.Fatal(err) }
defer conn.Close()
client := pb.NewUserServiceClient(conn)

Выполнение унарного вызова

Вызовите RPC-метод клиентской заглушки так, будто это локальная функция:

ctx, cancel := context.WithTimeout(context.Background(), time.Second)
defer cancel()
user, err := client.GetUser(ctx, &pb.GetUserRequest{Id: 42})
if err != nil { log.Fatalf("error: %v", err) }
fmt.Println(user.Name)

Обработка ошибок

gRPC использует коды статуса. Возвращайте ошибки с помощью status.Errorf и проверяйте их с помощью status.Code(err):

import "google.golang.org/grpc/status"
import "google.golang.org/grpc/codes"

// Server:
return nil, status.Errorf(codes.NotFound, "user %d not found", req.Id)
// Client:
if status.Code(err) == codes.NotFound { /* handle */ }

Передача контекста

Контекст, переданный в RPC-вызов клиента, передаёт серверу крайние сроки и отмену. Сервер должен передавать его в последующие вызовы (базу данных, другие RPC).

TLS в рабочей среде

В рабочей среде замените небезопасные учётные данные на TLS:

creds, _ := credentials.NewServerTLSFromFile("cert.pem", "key.pem")
grpcSrv := grpc.NewServer(grpc.Creds(creds))

UnimplementedServer

Встраивание pb.UnimplementedXxxServer предоставляет стандартные реализации всех RPC-методов, возвращающие статус Unimplemented. Это позволяет серверу успешно компилироваться, когда в proto добавляются новые RPC, которые вы ещё не реализовали.

grpc.Dial и grpc.NewClient

grpc.Dial объявлен устаревшим в новых версиях. Используйте grpc.NewClient: он не устанавливает соединение заранее, а делает это по требованию при первом RPC-вызове.

Сервис отражения

Зарегистрируйте сервис отражения gRPC, чтобы такие инструменты, как grpcurl, могли просматривать доступные сервисы без файла .proto:

reflection.Register(grpcSrv)

Быстрая проверка

Для чего в структуру сервера gRPC встраивают pb.UnimplementedXxxServer?

Итоги: унарный gRPC

Основные моменты:

  • Реализуйте сгенерированный интерфейс; встройте UnimplementedServer
  • grpc.NewServer() + Register + Serve на TCP-слушателе
  • Клиент: grpc.NewClient + сгенерированный NewXxxClient
  • Используйте status.Errorf/status.Code для обработки ошибок gRPC

Часто задаваемые вопросы

Урок «Реализация унарного сервиса gRPC» бесплатный?

Да — полный текст урока «Реализация унарного сервиса gRPC» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Go Academy, подпишись на CoddyKit PRO. Курс Go Academy содержит 4 уроков всего.

Чему я научусь в уроке «Реализация унарного сервиса gRPC»?

Сервер и клиент с grpc-go Ты практикуешь Go Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Go Academy?

Предыдущий опыт не требуется. Go Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Реализация унарного сервиса gRPC»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Go Academy?

Да. Каждый урок Go Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Protocol Buffers и .proto-файлы
  2. Реализация унарного сервиса gRPC
  3. Потоковая передача между сервером и клиентом
  4. Перехватчики и метаданные gRPC
← Назад к Go Academy