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 для Gogoogle.golang.org/protobuf— работа с Protocol Buffersprotoc— компилятор .proto файловprotoc-gen-go— плагин для генерации Go кода из .protoprotoc-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