Ответ
Для отправки сообщения в gRPC сервис необходимо выполнить следующие шаги:
- Установить соединение: Создать клиентское соединение с сервером с помощью
grpc.Dial()
. Для разработки можно использовать небезопасное соединение, но для production-среды обязательно применение TLS. - Создать клиент: Инициализировать gRPC клиент, используя конструктор, сгенерированный компилятором
protoc
из вашего.proto
файла (например,pb.NewYourServiceClient(conn)
). - Подготовить запрос: Создать экземпляр структуры запроса, также сгенерированной из
.proto
файла, и заполнить его данными. - Вызвать удаленный метод: Вызвать нужный метод у созданного клиента, передав в него контекст (
context
) и объект запроса.
Пример кода:
package main
import (
"context"
"log"
"time"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure"
// Замените на путь к вашим сгенерированным protobuf файлам
pb "path/to/your/proto/package"
)
func main() {
// 1. Устанавливаем соединение с сервером.
// grpc.WithTransportCredentials(insecure.NewCredentials()) - аналог WithInsecure() в новых версиях.
conn, err := grpc.Dial("localhost:50051", grpc.WithTransportCredentials(insecure.NewCredentials()))
if err != nil {
log.Fatalf("Не удалось подключиться: %v", err)
}
defer conn.Close()
// 2. Создаем клиент.
client := pb.NewYourServiceClient(conn)
// Создаем контекст с таймаутом.
ctx, cancel := context.WithTimeout(context.Background(), time.Second)
defer cancel()
// 3. Подготавливаем и 4. отправляем запрос.
req := &pb.RequestMessage{
Field1: "value",
Field2: 123,
}
resp, err := client.YourMethod(ctx, req)
if err != nil {
log.Fatalf("Ошибка при вызове метода: %v", err)
}
log.Printf("Ответ от сервера: %v", resp)
}
Ключевые моменты:
- Контекст (
context
): Всегда передавайте контекст. Он используется для управления таймаутами, отменой запросов и передачей метаданных. - Безопасность: В production-коде никогда не используйте
insecure
флаги. Настраивайте TLS-шифрование с помощьюgrpc.WithTransportCredentials(credentials.NewClientTLSFromCert(...))
. - Генерация кода: Клиент и структуры сообщений не пишутся вручную, а генерируются из
.proto
файла с помощьюprotoc
.