Реализация унарного сервиса 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 — локальная установка не требуется.
Все уроки этого курса
- Protocol Buffers и .proto-файлы
- Реализация унарного сервиса gRPC
- Потоковая передача между сервером и клиентом
- Перехватчики и метаданные gRPC