gRPC для Go (Golang): библиотеки, примеры и руководство

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

gRPC для Go (Golang): библиотеки и примеры

Что такое gRPC и зачем он нужен в Go?

gRPC — это высокопроизводительный фреймворк удалённого вызова процедур (RPC), разработанный Google. Он использует Protocol Buffers (protobuf) для сериализации данных и HTTP/2 для транспорта. В экосистеме Go gRPC стал стандартом для построения микросервисной архитектуры благодаря:

  • Высокой производительности (бинарный протокол, мультиплексирование HTTP/2)
  • Строгой типизации (генерируемый код на Go)
  • Поддержке стриминга (client, server и bidirectional)
  • Встроенной аутентификации и балансировке нагрузки

В этой статье мы рассмотрим основные библиотеки, инструменты и напишем полноценный пример сервера и клиента на Golang.

Необходимые библиотеки и инструменты

Для работы с gRPC в Go потребуются:

  • google.golang.org/grpc — основная библиотека gRPC для Go
  • google.golang.org/protobuf — работа с Protocol Buffers
  • protoc — компилятор .proto файлов
  • protoc-gen-go — плагин для генерации Go кода из .proto
  • protoc-gen-go-grpc — плагин для генерации gRPC серверного/клиентского кода

Установка инструментов

# Установка protoc (Linux/macOS)
sudo apt install protobuf-compiler  # или brew install protobuf

# Установка Go плагинов
go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest

# Проверка
protoc --version
protoc-gen-go --version

Создание .proto файла

Начнём с определения сервиса и сообщений в файле hello.proto:

syntax = "proto3";

package hello;

option go_package = "github.com/youruser/grpc-example/hello";

service Greeter {
  rpc SayHello (HelloRequest) returns (HelloReply);
  rpc SayHelloStream (HelloRequest) returns (stream HelloReply);
}

message HelloRequest {
  string name = 1;
}

message HelloReply {
  string message = 1;
}

Генерация Go кода

protoc --go_out=. --go-grpc_out=. hello.proto

После выполнения появятся два файла:

  • hello.pb.go — структуры сообщений
  • hello_grpc.pb.go — интерфейсы сервера и клиента

Реализация gRPC сервера на Go

Создадим файл server.go:

package main

import (
    "context"
    "log"
    "net"

    "google.golang.org/grpc"
    pb "github.com/youruser/grpc-example/hello"
)

type server struct {
    pb.UnimplementedGreeterServer
}

func (s *server) SayHello(ctx context.Context, req *pb.HelloRequest) (*pb.HelloReply, error) {
    log.Printf("Received: %v", req.GetName())
    return &pb.HelloReply{Message: "Hello, " + req.GetName()}, nil
}

func (s *server) SayHelloStream(req *pb.HelloRequest, stream pb.Greeter_SayHelloStreamServer) error {
    for i := 0; i < 5; i++ {
        if err := stream.Send(&pb.HelloReply{
            Message: "Hello " + req.GetName() + " - " + fmt.Sprint(i),
        }); err != nil {
            return err
        }
    }
    return nil
}

func main() {
    lis, err := net.Listen("tcp", ":50051")
    if err != nil {
        log.Fatalf("failed to listen: %v", err)
    }

    s := grpc.NewServer()
    pb.RegisterGreeterServer(s, &server{})

    log.Println("Server listening on :50051")
    if err := s.Serve(lis); err != nil {
        log.Fatalf("failed to serve: %v", err)
    }
}

Реализация gRPC клиента на Go

Создадим файл client.go:

package main

import (
    "context"
    "log"
    "time"

    "google.golang.org/grpc"
    "google.golang.org/grpc/credentials/insecure"
    pb "github.com/youruser/grpc-example/hello"
)

func main() {
    conn, err := grpc.Dial("localhost:50051",
        grpc.WithTransportCredentials(insecure.NewCredentials()))
    if err != nil {
        log.Fatalf("did not connect: %v", err)
    }
    defer conn.Close()

    client := pb.NewGreeterClient(conn                    

Рекомендаций